Loading README.md +2 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ The ETSI ITS protocols project builds and tests regularly on the following platf - Linux (Ubuntu) Note: The [OpenSSL](https://www.openssl.org) version > 1.x is also required. ### Using Vagrant Pre-requisites on your host machine: Loading ccsrc/Protocols/Commsignia/commsignia_layer.cc +50 −3 Original line number Diff line number Diff line Loading @@ -8,6 +8,8 @@ #include "converter.hh" unsigned char commsignia_layer::_fixed_header[12] = { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0D, 0x00, 0x00 }; commsignia_layer::commsignia_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params(), _c2p_recv{0}, _802_11p_hdr{0}, _c2p_llc_hdr{0}, _mac_src(), _eth_type() { loggers::get_instance().log(">>> commsignia_layer::commsignia_layer: %s, %s", to_string().c_str(), param.c_str()); Loading @@ -31,12 +33,57 @@ commsignia_layer::commsignia_layer(const std::string & p_type, const std::string if (it == _params.cend()) { _params.insert(std::pair<std::string, std::string>(std::string("interface_id"), "1")); } it = _params.find(std::string("power_tx")); if (it == _params.cend()) { _params.insert(std::pair<std::string, std::string>(std::string("power_tx"), "20")); // 20db } it = _params.find(std::string("data_rate")); if (it == _params.cend()) { _params.insert(std::pair<std::string, std::string>(std::string("data_rate"), "12")); // 12 * 500Kbps = 6Mbps } //_params.log(); } void commsignia_layer::send_data(OCTETSTRING& data, params& params) { loggers::get_instance().log_msg(">>> commsignia_layer::send_data: ", data); OCTETSTRING buffer(12, commsignia_layer::_fixed_header); buffer += int2oct(std::stoi(_params[params::interface_id]), 4); loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(std::stoi(_params[std::string("data_rate")]), 4); loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(0x80000000 & std::stoi(_params[std::string("power_tx")]), 4); // Negative number loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(7, 1); // MAC user priority // Destination MAC address params::const_iterator it = params.find(params::mac_dst); // Find in provided parameters, params if (it != params.cend()) { buffer = str2oct(CHARSTRING(it->second.c_str())); } else { it = _params.find(params::mac_dst); if (it != _params.cend()) { buffer = str2oct(CHARSTRING(it->second.c_str())); } else { buffer = str2oct(CHARSTRING(_params[params::mac_bc].c_str())); } } loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); // Source MAC address it = params.find(params::mac_src); // Find in provided parameters, params if (it != params.cend()) { buffer += str2oct(CHARSTRING(it->second.c_str())); } else { buffer += str2oct(CHARSTRING(_params[params::mac_src].c_str())); } loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(0, 2); // Fixed loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(data.lengthof(), 2); loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += data; loggers::get_instance().log_msg("commsignia_layer::send_data: ", buffer); send_to_all_layers(buffer, params); } void commsignia_layer::receive_data(OCTETSTRING& data, params& params) { Loading Loading @@ -83,9 +130,9 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) { l = (const commsignia_layer::c2p_llc_hdr*)(p + sizeof(commsignia_layer::c2p_recv) + sizeof(commsignia_layer::c2p_802_11p_hdr)); length = sizeof(commsignia_layer::c2p_recv) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_llc_hdr); } //loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap); //loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap); //loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type); loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap); loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap); loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type); // Check ether type if ((_eth_type[1] == (unsigned char)((l->type & 0xff00) >> 8)) && (_eth_type[0] == (unsigned char)(l->type & 0xff))) { // Warning: Network ordered bytes // Extract payload Loading ccsrc/Protocols/Commsignia/commsignia_layer.hh +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,9 @@ class commsignia_layer : public layer { std::vector<unsigned char> _mac_src; //! Used to optimize filtering on source mac address in \see commsignia_layer::receive_data method std::vector<unsigned char> _eth_type; //! Used to optimize filtering on ethernet type in \see commsignia_layer::receive_data method //! Fixed header for packet injection static unsigned char _fixed_header[12]; public: //! \publicsection /*! Loading ccsrc/Protocols/Http/http_codec.cc +1 −20 Original line number Diff line number Diff line Loading @@ -213,7 +213,7 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ if (_ec.is_content_length_present == 0x01) { loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os); p_encoding_buffer.put_os(os); p_encoding_buffer.put_cs("\r\n"); //FIXME For test With GEMALTO, comment to be removed, p_encoding_buffer.put_cs("\r\n"); } loggers::get_instance().log_to_hexa("<<< http_codec::encode_request: ", p_encoding_buffer); Loading Loading @@ -403,16 +403,6 @@ int http_codec::encode_body(const LibItsHttp__MessageBodyTypes::HttpMessageBody& if (it != _codecs.cend()) { loggers::get_instance().log("http_codec::encode_body: Call '%s'", it->first.c_str()); _codecs["http_its"]->encode((Record_Type&)binary_body.ieee1609dot2__data(), p_encoding_buffer); // TODO Use params #if defined(GEMALTO_FIX) // Temporary fix to be removed // GEMALTO Encode in hex string CHARSTRING buf = oct2str(p_encoding_buffer); p_encoding_buffer = OCTETSTRING(buf.lengthof(), (const unsigned char*)(static_cast<const char*>(buf))); loggers::get_instance().log_msg("http_codec::encode_body: Convert binary to string: ", p_encoding_buffer); #endif processed = true; } } // TODO Add new HTTP message codec here Loading Loading @@ -482,15 +472,6 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod OCTETSTRING s(decoding_buffer.get_len() - decoding_buffer.get_pos(), decoding_buffer.get_data() + decoding_buffer.get_pos()); loggers::get_instance().log_msg("http_codec::decode_body: raw body=", s); #if defined(GEMALTO_FIX) // Temporary fix to be removed // GEMALTO Encode in hex string if ((s.lengthof() & 0x00000001) == 0x00000001) { s = int2oct(0, 1) + s; } s = str2oct(CHARSTRING(s.lengthof(), (const char*)(static_cast<const unsigned char*>(s)))); loggers::get_instance().log_msg("http_codec::decode_body: Convert string to binary: ", s); #endif // Align the payload length with the specified Content-lenght value loggers::get_instance().log("http_codec::decode_body: _dc.length=%d - body length=%d", _dc.length, s.lengthof()); OCTETSTRING body; Loading ccsrc/Protocols/UpperTester/uppertester_pki_codec.cc +15 −12 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ class TTCN_EncDec; int uppertester_pki_codec::encode (const Record_Type& msg, OCTETSTRING& data) { loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg); loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode (1): ", (const Record_Type&)msg); TTCN_EncDec::clear_error(); TTCN_Buffer encoding_buffer; Loading @@ -32,7 +32,7 @@ int uppertester_pki_codec::encode (const Record_Type& msg, OCTETSTRING& data) int uppertester_pki_codec::encode (const LibItsPki__TypesAndValues::UtPkiTrigger& msg, OCTETSTRING& data) { loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg); loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode (2): ", (const Record_Type&)msg); TTCN_EncDec::clear_error(); TTCN_Buffer encoding_buffer; Loading @@ -40,11 +40,12 @@ int uppertester_pki_codec::encode (const LibItsPki__TypesAndValues::UtPkiTrigger const LibItsPki__TypesAndValues::UtPkiTrigger &u = static_cast<const LibItsPki__TypesAndValues::UtPkiTrigger &>(msg); if (u.ischosen(LibItsPki__TypesAndValues::UtPkiTrigger::ALT_triggerEnrolmentRequest)) { encoding_buffer.put_c(static_cast<const unsigned char>(uppertester_pki_codec::c_utPkiTriggerEnrolmentRequest)); encoding_buffer.put_c(static_cast<const unsigned char>(u.triggerEnrolmentRequest().cannonicalId().lengthof())); // Length of the string /*encoding_buffer.put_c(static_cast<const unsigned char>(u.triggerEnrolmentRequest().cannonicalId().lengthof())); // Length of the string encoding_buffer.put_string(u.triggerEnrolmentRequest().cannonicalId()); encoding_buffer.put_os(u.triggerEnrolmentRequest().encAlgorithm()); // One byte encoding_buffer.put_os(u.triggerEnrolmentRequest().privateKey()); // 32 bytes encoding_buffer.put_os(u.triggerEnrolmentRequest().compressedPublickey()); //33 bytes */ } else { // Error data = OCTETSTRING(0, nullptr); loggers::get_instance().warning("<<< uppertester_pki_codec::encode: Failed to encode UT message"); Loading Loading @@ -80,6 +81,10 @@ int uppertester_pki_codec::encode_ (const Base_Type& type, const TTCN_Typedescri } else { std::string s(field_descriptor.name); loggers::get_instance().log("uppertester_pki_codec::encode_: field to process %s", s.c_str()); loggers::get_instance().log("uppertester_pki_codec::encode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name); type.encode(field_descriptor, encoding_buffer, TTCN_EncDec::CT_RAW); /*if ( (s.rfind(".shape") != string::npos) || (s.rfind(".relevanceDistance") != string::npos) || Loading Loading @@ -173,15 +178,13 @@ std::unique_ptr<Base_Type> uppertester_pki_codec::decode (const OCTETSTRING& dat std::unique_ptr<Base_Type> result; /*const unsigned char* ptr = static_cast<const unsigned char*>(data); if (*ptr != uppertester_pki_codec::c_utPkiEventInd) { const unsigned char* ptr = static_cast<const unsigned char*>(data); LibItsPki__TypesAndValues::UtPkiResults res; if (decode(data, res, params) == 0) { result.reset((Base_Type *)res.clone()); } else { result.reset(nullptr); } }*/ return result; } Loading Loading
README.md +2 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ The ETSI ITS protocols project builds and tests regularly on the following platf - Linux (Ubuntu) Note: The [OpenSSL](https://www.openssl.org) version > 1.x is also required. ### Using Vagrant Pre-requisites on your host machine: Loading
ccsrc/Protocols/Commsignia/commsignia_layer.cc +50 −3 Original line number Diff line number Diff line Loading @@ -8,6 +8,8 @@ #include "converter.hh" unsigned char commsignia_layer::_fixed_header[12] = { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0D, 0x00, 0x00 }; commsignia_layer::commsignia_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params(), _c2p_recv{0}, _802_11p_hdr{0}, _c2p_llc_hdr{0}, _mac_src(), _eth_type() { loggers::get_instance().log(">>> commsignia_layer::commsignia_layer: %s, %s", to_string().c_str(), param.c_str()); Loading @@ -31,12 +33,57 @@ commsignia_layer::commsignia_layer(const std::string & p_type, const std::string if (it == _params.cend()) { _params.insert(std::pair<std::string, std::string>(std::string("interface_id"), "1")); } it = _params.find(std::string("power_tx")); if (it == _params.cend()) { _params.insert(std::pair<std::string, std::string>(std::string("power_tx"), "20")); // 20db } it = _params.find(std::string("data_rate")); if (it == _params.cend()) { _params.insert(std::pair<std::string, std::string>(std::string("data_rate"), "12")); // 12 * 500Kbps = 6Mbps } //_params.log(); } void commsignia_layer::send_data(OCTETSTRING& data, params& params) { loggers::get_instance().log_msg(">>> commsignia_layer::send_data: ", data); OCTETSTRING buffer(12, commsignia_layer::_fixed_header); buffer += int2oct(std::stoi(_params[params::interface_id]), 4); loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(std::stoi(_params[std::string("data_rate")]), 4); loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(0x80000000 & std::stoi(_params[std::string("power_tx")]), 4); // Negative number loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(7, 1); // MAC user priority // Destination MAC address params::const_iterator it = params.find(params::mac_dst); // Find in provided parameters, params if (it != params.cend()) { buffer = str2oct(CHARSTRING(it->second.c_str())); } else { it = _params.find(params::mac_dst); if (it != _params.cend()) { buffer = str2oct(CHARSTRING(it->second.c_str())); } else { buffer = str2oct(CHARSTRING(_params[params::mac_bc].c_str())); } } loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); // Source MAC address it = params.find(params::mac_src); // Find in provided parameters, params if (it != params.cend()) { buffer += str2oct(CHARSTRING(it->second.c_str())); } else { buffer += str2oct(CHARSTRING(_params[params::mac_src].c_str())); } loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(0, 2); // Fixed loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += int2oct(data.lengthof(), 2); loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer); buffer += data; loggers::get_instance().log_msg("commsignia_layer::send_data: ", buffer); send_to_all_layers(buffer, params); } void commsignia_layer::receive_data(OCTETSTRING& data, params& params) { Loading Loading @@ -83,9 +130,9 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) { l = (const commsignia_layer::c2p_llc_hdr*)(p + sizeof(commsignia_layer::c2p_recv) + sizeof(commsignia_layer::c2p_802_11p_hdr)); length = sizeof(commsignia_layer::c2p_recv) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_llc_hdr); } //loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap); //loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap); //loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type); loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap); loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap); loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type); // Check ether type if ((_eth_type[1] == (unsigned char)((l->type & 0xff00) >> 8)) && (_eth_type[0] == (unsigned char)(l->type & 0xff))) { // Warning: Network ordered bytes // Extract payload Loading
ccsrc/Protocols/Commsignia/commsignia_layer.hh +3 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,9 @@ class commsignia_layer : public layer { std::vector<unsigned char> _mac_src; //! Used to optimize filtering on source mac address in \see commsignia_layer::receive_data method std::vector<unsigned char> _eth_type; //! Used to optimize filtering on ethernet type in \see commsignia_layer::receive_data method //! Fixed header for packet injection static unsigned char _fixed_header[12]; public: //! \publicsection /*! Loading
ccsrc/Protocols/Http/http_codec.cc +1 −20 Original line number Diff line number Diff line Loading @@ -213,7 +213,7 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ if (_ec.is_content_length_present == 0x01) { loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os); p_encoding_buffer.put_os(os); p_encoding_buffer.put_cs("\r\n"); //FIXME For test With GEMALTO, comment to be removed, p_encoding_buffer.put_cs("\r\n"); } loggers::get_instance().log_to_hexa("<<< http_codec::encode_request: ", p_encoding_buffer); Loading Loading @@ -403,16 +403,6 @@ int http_codec::encode_body(const LibItsHttp__MessageBodyTypes::HttpMessageBody& if (it != _codecs.cend()) { loggers::get_instance().log("http_codec::encode_body: Call '%s'", it->first.c_str()); _codecs["http_its"]->encode((Record_Type&)binary_body.ieee1609dot2__data(), p_encoding_buffer); // TODO Use params #if defined(GEMALTO_FIX) // Temporary fix to be removed // GEMALTO Encode in hex string CHARSTRING buf = oct2str(p_encoding_buffer); p_encoding_buffer = OCTETSTRING(buf.lengthof(), (const unsigned char*)(static_cast<const char*>(buf))); loggers::get_instance().log_msg("http_codec::encode_body: Convert binary to string: ", p_encoding_buffer); #endif processed = true; } } // TODO Add new HTTP message codec here Loading Loading @@ -482,15 +472,6 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod OCTETSTRING s(decoding_buffer.get_len() - decoding_buffer.get_pos(), decoding_buffer.get_data() + decoding_buffer.get_pos()); loggers::get_instance().log_msg("http_codec::decode_body: raw body=", s); #if defined(GEMALTO_FIX) // Temporary fix to be removed // GEMALTO Encode in hex string if ((s.lengthof() & 0x00000001) == 0x00000001) { s = int2oct(0, 1) + s; } s = str2oct(CHARSTRING(s.lengthof(), (const char*)(static_cast<const unsigned char*>(s)))); loggers::get_instance().log_msg("http_codec::decode_body: Convert string to binary: ", s); #endif // Align the payload length with the specified Content-lenght value loggers::get_instance().log("http_codec::decode_body: _dc.length=%d - body length=%d", _dc.length, s.lengthof()); OCTETSTRING body; Loading
ccsrc/Protocols/UpperTester/uppertester_pki_codec.cc +15 −12 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ class TTCN_EncDec; int uppertester_pki_codec::encode (const Record_Type& msg, OCTETSTRING& data) { loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg); loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode (1): ", (const Record_Type&)msg); TTCN_EncDec::clear_error(); TTCN_Buffer encoding_buffer; Loading @@ -32,7 +32,7 @@ int uppertester_pki_codec::encode (const Record_Type& msg, OCTETSTRING& data) int uppertester_pki_codec::encode (const LibItsPki__TypesAndValues::UtPkiTrigger& msg, OCTETSTRING& data) { loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg); loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode (2): ", (const Record_Type&)msg); TTCN_EncDec::clear_error(); TTCN_Buffer encoding_buffer; Loading @@ -40,11 +40,12 @@ int uppertester_pki_codec::encode (const LibItsPki__TypesAndValues::UtPkiTrigger const LibItsPki__TypesAndValues::UtPkiTrigger &u = static_cast<const LibItsPki__TypesAndValues::UtPkiTrigger &>(msg); if (u.ischosen(LibItsPki__TypesAndValues::UtPkiTrigger::ALT_triggerEnrolmentRequest)) { encoding_buffer.put_c(static_cast<const unsigned char>(uppertester_pki_codec::c_utPkiTriggerEnrolmentRequest)); encoding_buffer.put_c(static_cast<const unsigned char>(u.triggerEnrolmentRequest().cannonicalId().lengthof())); // Length of the string /*encoding_buffer.put_c(static_cast<const unsigned char>(u.triggerEnrolmentRequest().cannonicalId().lengthof())); // Length of the string encoding_buffer.put_string(u.triggerEnrolmentRequest().cannonicalId()); encoding_buffer.put_os(u.triggerEnrolmentRequest().encAlgorithm()); // One byte encoding_buffer.put_os(u.triggerEnrolmentRequest().privateKey()); // 32 bytes encoding_buffer.put_os(u.triggerEnrolmentRequest().compressedPublickey()); //33 bytes */ } else { // Error data = OCTETSTRING(0, nullptr); loggers::get_instance().warning("<<< uppertester_pki_codec::encode: Failed to encode UT message"); Loading Loading @@ -80,6 +81,10 @@ int uppertester_pki_codec::encode_ (const Base_Type& type, const TTCN_Typedescri } else { std::string s(field_descriptor.name); loggers::get_instance().log("uppertester_pki_codec::encode_: field to process %s", s.c_str()); loggers::get_instance().log("uppertester_pki_codec::encode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name); type.encode(field_descriptor, encoding_buffer, TTCN_EncDec::CT_RAW); /*if ( (s.rfind(".shape") != string::npos) || (s.rfind(".relevanceDistance") != string::npos) || Loading Loading @@ -173,15 +178,13 @@ std::unique_ptr<Base_Type> uppertester_pki_codec::decode (const OCTETSTRING& dat std::unique_ptr<Base_Type> result; /*const unsigned char* ptr = static_cast<const unsigned char*>(data); if (*ptr != uppertester_pki_codec::c_utPkiEventInd) { const unsigned char* ptr = static_cast<const unsigned char*>(data); LibItsPki__TypesAndValues::UtPkiResults res; if (decode(data, res, params) == 0) { result.reset((Base_Type *)res.clone()); } else { result.reset(nullptr); } }*/ return result; } Loading