Commit 8f370a3f authored by garciay's avatar garciay
Browse files

Start validation of TD_AUTO_IOT_DENM_RWW_BV_01

parent a8ed0785
......@@ -20,6 +20,7 @@
*/
class Params : public std::map<std::string, std::string> {
public:
// TODO Use static constexpr (see CommsigniaLayer.hh)
static const std::string& mac_src; //! Source MAC address parameter name
static const std::string& mac_dst; //! Destination MAC address parameter name
static const std::string& mac_bc; //! Broadcast MAC address parameter name
......@@ -53,6 +54,8 @@ public:
static const std::string& header_type; //! Upper layer settings
static const std::string& header_sub_type; //! Upper layer settings
static const std::string& interface_id; //! Commsignia antenna selector
/*!
* \brief Default constructor
* Create a new instance of the Params class
......
......@@ -47,6 +47,8 @@ const std::string& Params::next_header = std::string("next_header");
const std::string& Params::header_type = std::string("header_type");
const std::string& Params::header_sub_type = std::string("header_sub_type");
const std::string& Params::interface_id = std::string("interface_id");
void Params::convert(Params& p_param, const std::string p_parameters) {
// Sanity checks
if (p_parameters.length() == 0) {
......
......@@ -9,7 +9,11 @@ CommsigniaLayer::CommsigniaLayer(const std::string & p_type, const std::string &
// Setup parameters
Params::convert(_params, param);
Params::const_iterator it = _params.find("mac_bc");
Params::const_iterator it = _params.find("mac_src");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("mac_src"), "000000000000"));
}
it = _params.find("mac_bc");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("mac_bc"), "FFFFFFFFFFFF"));
}
......@@ -17,6 +21,10 @@ CommsigniaLayer::CommsigniaLayer(const std::string & p_type, const std::string &
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("eth_type"), "8947"));
}
it = _params.find(Params::interface_id);
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("interface_id"), "1"));
}
//_params.log();
}
......@@ -29,32 +37,62 @@ void CommsigniaLayer::receiveData(OCTETSTRING& data, Params& params) {
loggers::get_instance().log_msg(">>> CommsigniaLayer::receiveData: ", data);
const unsigned char* p = static_cast<const unsigned char *>(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: timestamp2=%08x", ntohl(r->timestamp_msec));
//loggers::get_instance().log("CommsigniaLayer::receiveData: antenna=%02x", r->antenna);
//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);
// Filtering on antenna index
if (r->antenna != static_cast<unsigned char>(std::strtoul(_params[Params::interface_id].c_str(), NULL, 10))) {
// Discard packet
return;
} // else, continue
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);
//loggers::get_instance().log("CommsigniaLayer::receiveData: frame_ctrl=%04x", ntohs(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));
// Filtering on source MAC address of the packet
std::string str;
Params::const_iterator it = params.find(Params::mac_src); // Find in provided parameters, params
if (it != params.cend()) {
str = it->second;
} else {
str = _params[Params::mac_src];
}
loggers::get_instance().log("CommsigniaLayer::receiveData: compare %s with %s", str.c_str(), static_cast<const char *>(oct2str(src)));
if (str.compare(static_cast<const char *>(oct2str(src))) == 0) {
// Discard packet
return;
} // else, continue
const CommsigniaLayer::c2p_llc_hdr* l;
int length;
if ((ntohs(h->frame_ctrl) & 0xf000) == 0x8000) {
l = (const CommsigniaLayer::c2p_llc_hdr*)(p + sizeof(CommsigniaLayer::c2p_recv) + sizeof(CommsigniaLayer::c2p_802_11p_hdr) + sizeof(CommsigniaLayer::c2p_qos_ctrl));
length = sizeof(CommsigniaLayer::c2p_recv) + sizeof(CommsigniaLayer::c2p_802_11p_hdr) + sizeof(CommsigniaLayer::c2p_qos_ctrl) + sizeof(CommsigniaLayer::c2p_llc_hdr);
} else {
l = (const CommsigniaLayer::c2p_llc_hdr*)(p + sizeof(CommsigniaLayer::c2p_recv) + sizeof(CommsigniaLayer::c2p_802_11p_hdr));
length = sizeof(CommsigniaLayer::c2p_recv) + sizeof(CommsigniaLayer::c2p_802_11p_hdr) + sizeof(CommsigniaLayer::c2p_llc_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));
//loggers::get_instance().log("CommsigniaLayer::receiveData: type=%04x", 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
//loggers::get_instance().log_msg("CommsigniaLayer::receiveData: ether type convert: ", et);
//loggers::get_instance().log("CommsigniaLayer::receiveData: ether type convert: et[1]=%02x et[0]=%02x", et[1].get_octet(), et[0].get_octet());
if ((et[1].get_octet() == (unsigned char)((l->type & 0xff00) >> 8)) && (et[0].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<const unsigned char *>(data));
loggers::get_instance().log_msg("CommsigniaLayer::receiveData: payload for upper layer:", data);
//loggers::get_instance().log_msg("CommsigniaLayer::receiveData: payload for upper layer:", data);
// Update params
CHARSTRING s = oct2str(dst);
......
......@@ -35,9 +35,10 @@ class CommsigniaLayer : public Layer {
unsigned char src_addr[CommsigniaLayer::LL_ADDR_LENGTH];
unsigned char bss_id[CommsigniaLayer::LL_ADDR_LENGTH];
unsigned short fragment_seq_num;
unsigned short qos_ctrl;
} __attribute__((__packed__)) c2p_802_11p_hdr;
typedef unsigned short c2p_qos_ctrl;
typedef struct {
unsigned char dsap;
unsigned char ssap;
......
......@@ -6,10 +6,18 @@ EthernetLayer::EthernetLayer(const std::string & p_type, const std::string & par
loggers::get_instance().log(">>> EthernetLayer::EthernetLayer: %s, %s", to_string().c_str(), param.c_str());
// Setup parameters
Params::convert(_params, param);
Params::const_iterator it = _params.find("mac_bc");
Params::const_iterator it = _params.find("mac_src");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("mac_src"), "000000000000"));
}
it = _params.find("mac_bc");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("mac_bc"), "FFFFFFFFFFFF"));
}
it = _params.find("eth_type");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("eth_type"), "8947"));
}
//_params.log();
}
......@@ -22,32 +30,20 @@ void EthernetLayer::sendData(OCTETSTRING& data, Params& params) {
if (it != params.cend()) {
eth = str2oct(CHARSTRING(it->second.c_str()));
} else {
it = _params.find(Params::mac_dst); // Find in layer parameters, _params
if (it != _params.cend()) {
eth = str2oct(CHARSTRING(it->second.c_str()));
} else {
eth = str2oct(CHARSTRING(_params[Params::mac_bc].c_str()));
}
eth = str2oct(CHARSTRING(_params[Params::mac_bc].c_str()));
}
// Source MAC address
it = params.find(Params::mac_src); // Find in provided parameters, params
if (it != params.cend()) {
eth += str2oct(CHARSTRING(it->second.c_str()));
} else {
it = _params.find(Params::mac_src); // Find in layer parameters, _params
if (it != _params.cend()) {
eth += str2oct(CHARSTRING(it->second.c_str()));
} else {
const unsigned char null_mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
eth += OCTETSTRING(sizeof(null_mac), static_cast<const unsigned char *>(null_mac));
}
eth += str2oct(CHARSTRING(_params[Params::mac_src].c_str()));
}
it = _params.find(Params::eth_type); // Find in layer parameters
it = params.find(Params::eth_type); // Find in layer parameters
if (it != params.cend()) {
eth += str2oct(CHARSTRING(it->second.c_str()));
} else {
const unsigned char proto[] = { 0x89, 0x47 };
eth += OCTETSTRING(sizeof(proto), static_cast<const unsigned char *>(proto));
eth += str2oct(CHARSTRING(_params[Params::eth_type].c_str()));
}
eth += data;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment