#include "EthernetLayer.hh" #include "loggers.hh" EthernetLayer::EthernetLayer(const std::string & p_type, const std::string & param) : Layer(p_type), _params() { loggers::loggers::log(">>> EthernetLayer::EthernetLayer: %s, %s", to_string().c_str(), param.c_str()); // Setup parameters Params::convert(_params, param); //_params.log(); } void EthernetLayer::sendData(OCTETSTRING& data, Params& params) { loggers::loggers::log_msg(">>> EthernetLayer::sendData: ", data); OCTETSTRING eth; std::map::const_iterator it = params.find("mac_dst"); if (it != params.cend()) { eth += str2oct(CHARSTRING(it->second.c_str())); } else { const unsigned char mac_address[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; eth += OCTETSTRING(sizeof(mac_address), static_cast(mac_address)); } 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(mac_address)); } it = params.find("eth_type"); if (it != params.cend()) { eth += str2oct(CHARSTRING(it->second.c_str())); } else { const unsigned char proto[] = {0x47, 0x89}; eth += OCTETSTRING(sizeof(proto), static_cast(proto)); } data = eth + data; toAllLowerLayers(data, params); } void EthernetLayer::receiveData(OCTETSTRING& data, Params& params) { loggers::loggers::log_msg(">>> EthernetLayer::receiveData: ", data); // Extract dest MAC Address OCTETSTRING dst = OCTETSTRING(6, static_cast(data)); //loggers::loggers::log_msg("EthernetLayer::receiveData: dst: ", dst); // Extract source MAC Address OCTETSTRING src = OCTETSTRING(6, 6 + static_cast(data)); //loggers::loggers::log_msg("EthernetLayer::receiveData: src: ", src); // Extract ethertype OCTETSTRING proto = OCTETSTRING(2, 2 + static_cast(data)); //loggers::loggers::log_msg("EthernetLayer::receiveData: proto: ", proto); data = OCTETSTRING(data.lengthof() - 14, 14 + static_cast(data)); // Update params CHARSTRING s = oct2str(dst); params.insert(std::pair(std::string("mac_dst"), std::string(static_cast(s)))); s = oct2str(src); params.insert(std::pair(std::string("mac_src2"), std::string(static_cast(s)))); //loggers::loggers::log_msg("EthernetLayer::receiveData: payload for upper layer:", data); toAllUpperLayers(data, params); } class EthernetFactory: public LayerFactory { static EthernetFactory _f; public: EthernetFactory(); virtual Layer * createLayer(const std::string & type, const std::string & param); }; EthernetFactory::EthernetFactory() { // register factory loggers::loggers::log(">>> EthernetFactory::EthernetFactory"); LayerStackBuilder::RegisterLayerFactory("ETH", this); } Layer * EthernetFactory::createLayer(const std::string & type, const std::string & param) { return new EthernetLayer(type, param); } EthernetFactory EthernetFactory::_f;