#include #include "CommsigniaLayerFactory.hh" #include "loggers.hh" CommsigniaLayer::CommsigniaLayer(const std::string & p_type, const std::string & param) : Layer(p_type), _params(), _c2p_recv{0}, _802_11p_hdr{0}, _c2p_llc_hdr{0} { loggers::get_instance().log(">>> CommsigniaLayer::CommsigniaLayer: %s, %s", to_string().c_str(), param.c_str()); // Setup parameters Params::convert(_params, param); Params::const_iterator it = _params.find("mac_bc"); if (it == _params.cend()) { _params.insert(std::pair(std::string("mac_bc"), "FFFFFFFFFFFF")); } it = _params.find(Params::eth_type); if (it == _params.cend()) { _params.insert(std::pair(std::string("eth_type"), "8947")); } //_params.log(); } void CommsigniaLayer::sendData(OCTETSTRING& data, Params& params) { loggers::get_instance().log_msg(">>> CommsigniaLayer::sendData: ", data); } void CommsigniaLayer::receiveData(OCTETSTRING& data, Params& params) { loggers::get_instance().log_msg(">>> CommsigniaLayer::receiveData: ", data); const unsigned char* p = static_cast(data); const CommsigniaLayer::c2p_recv* r = (const CommsigniaLayer::c2p_recv*)p; //loggers::get_instance().log("CommsigniaLayer::receiveData: version=%02x", r->version); //loggers::get_instance().log("CommsigniaLayer::receiveData: timestamp1=%08x", ntohl(r->timestamp_sec)); //loggers::get_instance().log("CommsigniaLayer::receiveData: timestamp2=%08x", ntohl(r->timestamp_msec)); //loggers::get_instance().log("CommsigniaLayer::receiveData: rssi_ant1=%02x", r->rssi_ant1); //loggers::get_instance().log("CommsigniaLayer::receiveData: rssi_ant2=%02x", r->rssi_ant2); //loggers::get_instance().log("CommsigniaLayer::receiveData: noise_ant1=%02x", r->noise_ant1); //loggers::get_instance().log("CommsigniaLayer::receiveData: noise_ant2=%02x", r->noise_ant2); const CommsigniaLayer::c2p_802_11p_hdr* h = (const CommsigniaLayer::c2p_802_11p_hdr*)(p + sizeof(CommsigniaLayer::c2p_recv)); loggers::get_instance().log("CommsigniaLayer::receiveData: frame_ctrl=%04x", h->frame_ctrl); OCTETSTRING dst = OCTETSTRING(6, (const unsigned char*)&h->dst_addr); //loggers::get_instance().log_msg("CommsigniaLayer::receiveData: dst: ", dst); OCTETSTRING src = OCTETSTRING(6, (const unsigned char*)&h->src_addr); //loggers::get_instance().log_msg("CommsigniaLayer::receiveData: src: ", src); const CommsigniaLayer::c2p_llc_hdr* l = (const CommsigniaLayer::c2p_llc_hdr*)(p + sizeof(CommsigniaLayer::c2p_recv) + sizeof(CommsigniaLayer::c2p_802_11p_hdr)); //loggers::get_instance().log("CommsigniaLayer::receiveData: dsap=%02x", l->dsap); //loggers::get_instance().log("CommsigniaLayer::receiveData: ssap=%02x", l->ssap); //loggers::get_instance().log("CommsigniaLayer::receiveData: type=%04x", ntohs(l->type)); // Check ether type OCTETSTRING et = str2oct(_params[Params::eth_type].c_str()); loggers::get_instance().log_msg("CommsigniaLayer::receiveData: ether type convert: ", et); if ((et[0].get_octet() == (unsigned char)((l->type & 0xff00) >> 8)) && (et[1].get_octet() == (unsigned char)(l->type & 0xff))) { // Warning: Network ordered bytes // Extract payload int length = sizeof(CommsigniaLayer::c2p_recv) + sizeof(CommsigniaLayer::c2p_802_11p_hdr) + sizeof(CommsigniaLayer::c2p_llc_hdr); data = OCTETSTRING(data.lengthof() - length, length + static_cast(data)); loggers::get_instance().log_msg("CommsigniaLayer::receiveData: payload for upper layer:", data); // Update params CHARSTRING s = oct2str(dst); params[Params::mac_dst] = std::string(static_cast(s)); s = oct2str(src); params[Params::mac_src] = std::string(static_cast(s)); receiveToAllLayers(data, params); } // else, nothing to do } CommsigniaLayerFactory CommsigniaLayerFactory::_f;