Newer
Older
#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<std::string, std::string>::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<const unsigned char *>(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<const unsigned char *>(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<const unsigned char *>(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<const unsigned char *>(data));
//loggers::loggers::log_msg("EthernetLayer::receiveData: dst: ", dst);
// Extract source MAC Address
OCTETSTRING src = OCTETSTRING(6, 6 + static_cast<const unsigned char *>(data));
//loggers::loggers::log_msg("EthernetLayer::receiveData: src: ", src);
// Extract ethertype
OCTETSTRING proto = OCTETSTRING(2, 2 + static_cast<const unsigned char *>(data));
//loggers::loggers::log_msg("EthernetLayer::receiveData: proto: ", proto);
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);
params.insert(std::pair<std::string, std::string>(std::string("mac_src2"), std::string(static_cast<const char *>(s))));
//loggers::loggers::log_msg("EthernetLayer::receiveData: payload for upper layer:", data);
toAllUpperLayers(data, params);
}
class EthernetFactory: public LayerFactory {
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) {
}
EthernetFactory EthernetFactory::_f;