EthernetLayer.cc 3.32 KB
Newer Older
#include "EthernetLayer.hh"
#include "loggers.hh"

garciay's avatar
garciay committed
EthernetLayer::EthernetLayer(const std::string & p_type, const std::string & param) : Layer(p_type), _params() {
garciay's avatar
garciay committed
  loggers::get_instance().log(">>> EthernetLayer::EthernetLayer: %s, %s", to_string().c_str(), param.c_str());
garciay's avatar
garciay committed
  // Setup parameters
  Params::convert(_params, param);
  //_params.log();
garciay's avatar
garciay committed
void EthernetLayer::sendData(OCTETSTRING& data, Params& params) {
garciay's avatar
garciay committed
  loggers::get_instance().log_msg(">>> EthernetLayer::sendData: ", data);
  
garciay's avatar
garciay committed
  OCTETSTRING eth;
  std::map<std::string, std::string>::const_iterator it = params.find("mac_dst");
  if (it != params.cend()) {
garciay's avatar
garciay committed
    eth = str2oct(CHARSTRING(it->second.c_str()));    
garciay's avatar
garciay committed
  } else {
    const unsigned char mac_address[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
garciay's avatar
garciay committed
    eth = OCTETSTRING(sizeof(mac_address), static_cast<const unsigned char *>(mac_address));
garciay's avatar
garciay committed
  }
  it = params.find("mac_src");
  if (it != params.cend()) {
    eth += str2oct(CHARSTRING(it->second.c_str()));    
  } else {
    const unsigned char mac_address[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xFF};
    eth += OCTETSTRING(sizeof(mac_address), static_cast<const unsigned char *>(mac_address));
  }
  it = params.find("eth_type");
  if (it != params.cend()) {
    eth += str2oct(CHARSTRING(it->second.c_str()));        
  } else {
garciay's avatar
garciay committed
    const unsigned char proto[] = {0x89, 0x47};
garciay's avatar
garciay committed
    eth += OCTETSTRING(sizeof(proto), static_cast<const unsigned char *>(proto));
  }
  
garciay's avatar
garciay committed
  eth += data;
  sendToAllLayers(eth, params);
garciay's avatar
garciay committed
void EthernetLayer::receiveData(OCTETSTRING& data, Params& params) {
garciay's avatar
garciay committed
  loggers::get_instance().log_msg(">>> EthernetLayer::receiveData: ", data);
garciay's avatar
garciay committed

  // Extract dest MAC Address
  OCTETSTRING dst = OCTETSTRING(6, static_cast<const unsigned char *>(data));
garciay's avatar
garciay committed
  //loggers::get_instance().log_msg("EthernetLayer::receiveData: dst: ", dst);
garciay's avatar
garciay committed
  // Extract source MAC Address
  OCTETSTRING src = OCTETSTRING(6, 6 + static_cast<const unsigned char *>(data));
garciay's avatar
garciay committed
  //loggers::get_instance().log_msg("EthernetLayer::receiveData: src: ", src);
garciay's avatar
garciay committed
  // Extract ethertype
  OCTETSTRING proto = OCTETSTRING(2, 2 + static_cast<const unsigned char *>(data));
garciay's avatar
garciay committed
  //loggers::get_instance().log_msg("EthernetLayer::receiveData: proto: ", proto);
garciay's avatar
garciay committed
  data = OCTETSTRING(data.lengthof() - 14, 14 + static_cast<const unsigned char *>(data));
  // Update params
  CHARSTRING s = oct2str(dst);
  params.insert(std::pair<std::string, std::string>(std::string("mac_dst"), std::string(static_cast<const char *>(s))));
  s = oct2str(src);
garciay's avatar
garciay committed
  params.insert(std::pair<std::string, std::string>(std::string("mac_src"), std::string(static_cast<const char *>(s))));
garciay's avatar
garciay committed
  //loggers::get_instance().log_msg("EthernetLayer::receiveData: payload for upper layer:", data);
garciay's avatar
garciay committed
  
garciay's avatar
garciay committed
  receiveToAllLayers(data, params);
}

class EthernetFactory: public LayerFactory {
garciay's avatar
garciay committed
  static EthernetFactory _f;
public:
garciay's avatar
garciay committed
  EthernetFactory();
  virtual Layer * createLayer(const std::string & type,
			      const std::string & param);
};

EthernetFactory::EthernetFactory() {
garciay's avatar
garciay committed
  // register factory
garciay's avatar
garciay committed
  loggers::get_instance().log(">>> EthernetFactory::EthernetFactory");
garciay's avatar
garciay committed
  LayerStackBuilder::RegisterLayerFactory("ETH", this);
}

Layer * EthernetFactory::createLayer(const std::string & type, const std::string & param) {
garciay's avatar
garciay committed
  return new EthernetLayer(type, param);
}

EthernetFactory EthernetFactory::_f;