Commit 23f3e699 authored by garciay's avatar garciay
Browse files

Layers ongoing

parent fe15bc8d
......@@ -55,8 +55,15 @@ namespace LibItsCam__EncdecDeclarations {
// Calculate the size of the lower layers information
int s = (
LibItsGeoNetworking__TestSystem::GeoNetworkingInd_macDestinationAddress_raw_.fieldlength +
LibItsGeoNetworking__TestSystem::GeoNetworkingInd_its__aid_raw_.fieldlength
LibItsCam__TestSystem::CamInd_gnNextHeader_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_gnHeaderType_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_gnHeaderSubtype_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_gnLifetime_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_gnTrafficClass_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_btpDestinationPort_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_btpInfo_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_ssp_raw_.fieldlength +
LibItsCam__TestSystem::CamInd_its__aid_raw_.fieldlength
) / 8;
if (codec.decode(OCTETSTRING(is.lengthof() - s, static_cast<const unsigned char *>(is)), cam) == -1) {
loggers::get_instance().warning("fx__dec__CamInd: -1 result code was returned");
......
......@@ -60,7 +60,8 @@ namespace LibItsGeoNetworking__EncdecDeclarations {
return -1;
}
p.msgOut() = pdu;
TTCN_Buffer decoding_buffer(OCTETSTRING(is.lengthof() - s, static_cast<const unsigned char *>(is) + is.lengthof() - s));
TTCN_Buffer decoding_buffer(OCTETSTRING(s, static_cast<const unsigned char *>(is) + is.lengthof() - s));
loggers::get_instance().log_to_hexa("fx__dec__GeoNetworkingInd: Lower layer: ", decoding_buffer);
for (int i = 1; i < p.get_count(); i++) {
loggers::get_instance().log("fx__dec__GeoNetworkingReq: processing %s/%s/%s", p.fld_name(i), p.fld_descr(i)->name, p.get_at(i)->get_descriptor()->name);
p.get_at(i)->decode(*p.fld_descr(i), decoding_buffer, TTCN_EncDec::CT_RAW);
......@@ -126,11 +127,12 @@ namespace LibItsGeoNetworking__EncdecDeclarations {
return -1;
}
p_geoNetworkingInd.msgIn() = pdu;
TTCN_Buffer decoding_buffer(OCTETSTRING(is.lengthof() - s, static_cast<const unsigned char *>(is) + is.lengthof() - s));
TTCN_Buffer decoding_buffer(OCTETSTRING(s, static_cast<const unsigned char *>(is) + is.lengthof() - s));
loggers::get_instance().log_to_hexa("fx__dec__GeoNetworkingInd: Lower layer: ", decoding_buffer);
for (int i = 1; i < p_geoNetworkingInd.get_count(); i++) {
loggers::get_instance().log("fx__dec__GeoNetworkingInd: processing %s/%s/%s - %d - %d", p_geoNetworkingInd.fld_name(i), p_geoNetworkingInd.fld_descr(i)->name, p_geoNetworkingInd.get_at(i)->get_descriptor()->name, p_geoNetworkingInd.get_at(i)->is_optional(), p_geoNetworkingInd.get_at(i)->is_present());
if (p_geoNetworkingInd.get_at(i)->is_optional()) {
loggers::get_instance().log("fx__dec__GeoNetworkingInd: Bytes remaining: %d - ssp lenth: %d", decoding_buffer.get_len() - decoding_buffer.get_pos(), p_geoNetworkingInd.fld_descr(i)->raw->fieldlength / 8);
loggers::get_instance().log("fx__dec__GeoNetworkingInd: Bytes remaining: %d - field lenth: %d", decoding_buffer.get_len() - decoding_buffer.get_pos(), p_geoNetworkingInd.fld_descr(i)->raw->fieldlength / 8);
if (std::string(p_geoNetworkingInd.fld_name(i)).compare("ssp") == 0) {
if ((decoding_buffer.get_len() - decoding_buffer.get_pos()) >= p_geoNetworkingInd.fld_descr(i)->raw->fieldlength / 8) {
loggers::get_instance().log("fx__dec__GeoNetworkingInd: decoding %s", p_geoNetworkingInd.fld_descr(i)->name);
......
......@@ -85,7 +85,8 @@ public:
void removeUpperPort(TPort*);
protected:
template <typename TMessage> void toAllUpperPorts(const TMessage& m, const Params& param) {
template <typename TMessage>
inline void toAllUpperPorts(const TMessage& m, const Params& param) {
loggers::get_instance().log(">>> TLayer::toAllUpperPorts: %d", upperPorts.size());
for(TPortListIterator it=upperPorts.begin(); it<upperPorts.end(); ++it){
(*it)->receiveMsg(m, param);
......
......@@ -53,7 +53,10 @@ namespace LibItsBtp__TestSystem {
if (it != _cfg_params.end()) {
loggers::get_instance().log("BtpPort::user_map: %s", it->second.c_str());
_layer = LayerStackBuilder::GetInstance()->createLayerStack(it->second.c_str());
dynamic_cast<BTPLayer *>(_layer)->addUpperPort(this);
if (static_cast<BTPLayer *>(_layer) == NULL) {
loggers::get_instance().error("BtpPort::user_map: Invalid stack configuration: %s", it->second.c_str());
}
static_cast<BTPLayer *>(_layer)->addUpperPort(this);
} else {
loggers::get_instance().error("BtpPort::user_map: No layers defined in configuration file");
}
......@@ -80,7 +83,7 @@ namespace LibItsBtp__TestSystem {
float duration;
loggers::get_instance().set_start_time(_time_key);
dynamic_cast<BTPLayer *>(_layer)->sendMsg(send_par, _layer_params);
static_cast<BTPLayer *>(_layer)->sendMsg(send_par, _layer_params);
loggers::get_instance().set_stop_time(_time_key, duration);
}
......
......@@ -58,7 +58,10 @@ namespace LibItsCam__TestSystem {
if (it != _cfg_params.end()) {
loggers::get_instance().log("CamPort::user_map: %s", it->second.c_str());
_layer = LayerStackBuilder::GetInstance()->createLayerStack(it->second.c_str());
dynamic_cast<CAMLayer *>(_layer)->addUpperPort(this);
if (static_cast<CAMLayer *>(_layer) == NULL) {
loggers::get_instance().error("CamPort::user_map: Invalid stack configuration: %s", it->second.c_str());
}
static_cast<CAMLayer *>(_layer)->addUpperPort(this);
} else {
loggers::get_instance().error("CamPort::user_map: No layers defined in configuration file");
}
......@@ -89,7 +92,7 @@ namespace LibItsCam__TestSystem {
float duration;
loggers::get_instance().set_start_time(_time_key);
dynamic_cast<CAMLayer *>(_layer)->sendMsg(send_par, _layer_params);
static_cast<CAMLayer *>(_layer)->sendMsg(send_par, _layer_params);
loggers::get_instance().set_stop_time(_time_key, duration);
}
......
......@@ -60,10 +60,15 @@ namespace LibItsGeoNetworking__TestSystem {
if (it != _cfg_params.end()) {
//loggers::get_instance().log("GeoNetworkingPort::user_map: %s", it->second.c_str());
_layer = LayerStackBuilder::GetInstance()->createLayerStack(it->second.c_str());
dynamic_cast<GeoNetworkingLayer *>(_layer)->addUpperPort(this);
if (static_cast<GeoNetworkingLayer *>(_layer) == NULL) {
loggers::get_instance().error("GeoNetworkingPort::user_map: Invalid stack configuration: %s", it->second.c_str());
}
static_cast<GeoNetworkingLayer *>(_layer)->addUpperPort(this);
} else {
loggers::get_instance().error("GeoNetworkinggPort::user_map: No layers defined in configuration file");
loggers::get_instance().error("GeoNetworkingPort::user_map: No layers defined in configuration file");
}
static_cast<GeoNetworkingLayer *>(_layer)->start_beaconing();
}
void GeoNetworkingPort::user_unmap(const char * system_port)
......@@ -91,7 +96,7 @@ namespace LibItsGeoNetworking__TestSystem {
float duration;
loggers::get_instance().set_start_time(_time_key);
dynamic_cast<GeoNetworkingLayer *>(_layer)->sendMsg(send_par, _layer_params);
static_cast<GeoNetworkingLayer *>(_layer)->sendMsg(send_par, _layer_params);
loggers::get_instance().set_stop_time(_time_key, duration);
}
......
#include <string>
#include <typeinfo>
//#include <typeinfo>
#include "BTPCodec.hh"
#include "loggers.hh"
......@@ -15,7 +15,7 @@ int BTPCodec::encode (const LibItsBtp__TypesAndValues::BtpPacket& msg, OCTETSTRI
TTCN_EncDec::clear_error();
TTCN_Buffer encoding_buffer;
encode_(msg, LibItsBtp__TypesAndValues::BtpPacket_descr_, encoding_buffer);
encode_(msg, *msg.get_descriptor(), encoding_buffer);
data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data());
loggers::get_instance().log_msg("<<< BTPCodec::encode: data=", data);
......@@ -70,7 +70,7 @@ int BTPCodec::decode (const OCTETSTRING& data, LibItsBtp__TypesAndValues::BtpPac
_params = params;
loggers::get_instance().log_to_hexa(">>> BTPCodec::decode: decoding_buffer=", decoding_buffer);
decode_(msg, LibItsBtp__TypesAndValues::BtpPacket_descr_, decoding_buffer);
decode_(msg, *msg.get_descriptor(), decoding_buffer);
loggers::get_instance().log_msg("<<< BTPCodec::decode: ", (const Base_Type&)msg);
return 0;
......@@ -91,23 +91,7 @@ int BTPCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& field_descr
} // End of 'for' statement
} else {
loggers::get_instance().log("BTPCodec::decode_ (else): processing type %s/%s - optional:%d", type.get_descriptor()->name, field_descriptor.name, type.is_optional());
if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPacket.payload") == 0) {
if (decoding_buffer.get_len() == decoding_buffer.get_pos()) { // No payload, set it to omit
loggers::get_instance().log("BTPCodec::decode_: Set OPTIONAL<BtpPayload> to omit");
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type).set_to_omit();
} else {
LibItsBtp__TypesAndValues::BtpPayload p;
decode_(p, LibItsBtp__TypesAndValues::BtpPayload_descr_, decoding_buffer);
loggers::get_instance().log_msg("BTPCodec::decode_: payload= ", p);
if (p.is_bound()) {
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type) = OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload>(p);
loggers::get_instance().log_msg("BTPCodec::decode_: Set OPTIONAL to ", type);
} else {
loggers::get_instance().log("BTPCodec::decode_: Set OPTIONAL to omit");
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type).set_to_omit();
}
}
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPacket.header") == 0) {
if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPacket.header") == 0) {
loggers::get_instance().log("BTPCodec::decode_: _type = %d", _type);
LibItsBtp__TypesAndValues::BtpHeader& b = static_cast<LibItsBtp__TypesAndValues::BtpHeader&>(type);
if (_type == BTPCodec::btpA) {
......@@ -127,9 +111,25 @@ int BTPCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& field_descr
loggers::get_instance().error("BTPCodec::decode_: Invalid BTP type"); // Cannot be reached
}
loggers::get_instance().log_msg("BTPCodec::decode_: BtpHeader: ", type);
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPayload.decodedPayload") == 0) {
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPayload") == 0) {
if (decoding_buffer.get_len() == decoding_buffer.get_pos()) { // No payload, set it to omit
loggers::get_instance().log("BTPCodec::decode_: Set OPTIONAL<BtpPayload> to omit");
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type).set_to_omit();
} else {
LibItsBtp__TypesAndValues::BtpPayload p;
decode_(p, LibItsBtp__TypesAndValues::BtpPayload_descr_, decoding_buffer);
loggers::get_instance().log_msg("BTPCodec::decode_: payload= ", p);
if (p.is_bound()) {
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type) = OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload>(p);
loggers::get_instance().log_msg("BTPCodec::decode_: Set OPTIONAL to ", type);
} else {
loggers::get_instance().log("BTPCodec::decode_: Set OPTIONAL to omit");
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type).set_to_omit();
}
}
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.DecodedBtpPayload") == 0) {
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::DecodedBtpPayload> &>(type).set_to_omit();
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPayload.rawPayload") == 0) {
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpRawPayload") == 0) {
// Decode BtpRawPayload data structure
OCTETSTRING os(decoding_buffer.get_len() - decoding_buffer.get_pos(), decoding_buffer.get_data() + decoding_buffer.get_pos());
loggers::get_instance().log_msg("BTPCodec::decode_: s=", os);
......
......@@ -9,15 +9,15 @@ BTPLayer::BTPLayer(const std::string & p_type, const std::string & param) : TLay
Params::convert(_params, param);
}
void BTPLayer::sendMsg(const LibItsBtp__TestSystem::BtpReq& p, const Params& params){
void BTPLayer::sendMsg(const LibItsBtp__TestSystem::BtpReq& p, Params& params){
loggers::get_instance().log(">>> BTPLayer::sendMsg");
// Encode BTP PDU
OCTETSTRING data;
_codec.encode(p.msgOut(), data);
// Update parameters
Params par(params); // FIXME Review all const Param& in method declarations
sendData(data, par);
// Params par(params); // FIXME Review all const Param& in method declarations
sendData(data, params);
}
void BTPLayer::sendData(OCTETSTRING& data, Params& params) {
......
......@@ -18,7 +18,7 @@ public:
BTPLayer(const std::string & p_type, const std::string & param);
virtual ~BTPLayer() {};
void sendMsg(const LibItsBtp__TestSystem::BtpReq&, const Params& param);
void sendMsg(const LibItsBtp__TestSystem::BtpReq&, Params& param);
virtual void sendData(OCTETSTRING& data, Params& params);
virtual void receiveData(OCTETSTRING& data, Params& info);
......
......@@ -364,10 +364,12 @@ static CAM__PDU__Descriptions::CAM asn1c2titan(const CAM_t& a)
int CAMCodec::encode (const CAM__PDU__Descriptions::CAM& cam, OCTETSTRING& data)
{
loggers::get_instance().log(">>> CAMCodec::encode");
BITSTRING b;
int rc = asnCodec.encode(cam, b);
if(rc){
data = bit2oct(b);
loggers::get_instance().log_msg("CAMCodec::encode: ", data);
}
return rc;
}
......@@ -379,8 +381,7 @@ int CAMCodec::decode (const OCTETSTRING& data, CAM__PDU__Descriptions::CAM& cam,
int rc = asnCodec.decode(oct2bit(data), cam);
loggers::get_instance().log("CAMCodec::decode: ASN.1 codec returned %d", rc);
if(rc) {
loggers::get_instance().warning("CAMCodec::decode: ASN codec failure");
/* TODO: fill other Indication fields */
loggers::get_instance().log_msg("CAMCodec::decode: ", cam);
}
return rc;
}
......
#include <string>
#include <typeinfo>
//#include <typeinfo>
#include "GeoNetworkingCodec.hh"
#include "loggers.hh"
......@@ -16,15 +15,15 @@ int GeoNetworkingCodec::encode (const LibItsGeoNetworking__TypesAndValues::GeoNe
TTCN_EncDec::clear_error();
TTCN_Buffer encoding_buffer;
encode_(msg, LibItsGeoNetworking__TypesAndValues::GeoNetworkingPdu_descr_, encoding_buffer);
encode_(msg, *msg.get_descriptor(), encoding_buffer);
data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data());
// Overwrite the payload length
if (_ec.plLength_position != (unsigned int)-1) {
loggers::get_instance().log("GeoNetworkingCodec::encode: length=%d - plLength_position = %d - plLength = %d", data.lengthof(), _ec.plLength_position, _ec.plLength);
unsigned char b[] = { (unsigned char)((_ec.plLength & 0x0000FF00) >> 8), (unsigned char)_ec.plLength };
if (_ec.length != (unsigned int)-1) {
loggers::get_instance().log("GeoNetworkingCodec::encode: length=%d - plLength_position = %d - plLength = %d", data.lengthof(), _ec.length_position, _ec.length);
unsigned char b[] = { (unsigned char)((_ec.length & 0x0000FF00) >> 8), (unsigned char)_ec.length };
OCTETSTRING rpl(sizeof(b), b);
loggers::get_instance().log_msg("GeoNetworkingCodec::encode: rpl=", rpl);
data = replace(data, _ec.plLength_position, rpl.lengthof(), rpl);
data = replace(data, _ec.length_position, rpl.lengthof(), rpl);
loggers::get_instance().log_msg("GeoNetworkingCodec::encode: after replace: ", data);
}
......@@ -87,12 +86,12 @@ int GeoNetworkingCodec::encode_ (const Base_Type& type, const TTCN_Typedescripto
loggers::get_instance().log("GeoNetworkingCodec::encode_: Storing header_type %d for %s", _ec.header_type, field_descriptor.name);
} else if (std::string(field_descriptor.name).compare("@LibItsGeoNetworking_TypesAndValues.CommonHeader.plLength") == 0) {
// Store TTCN_Buffer position and continue encoding
_ec.plLength_position = encoding_buffer.get_len();
loggers::get_instance().log("GeoNetworkingCodec::encode_: Storing position %d for %s", _ec.plLength_position, field_descriptor.name);
_ec.length_position = encoding_buffer.get_len();
loggers::get_instance().log("GeoNetworkingCodec::encode_: Storing position %d for %s", _ec.length_position, field_descriptor.name);
} else if (std::string(field_descriptor.name).compare("@LibItsGeoNetworking_TypesAndValues.Payload.rawPayload") == 0) {
// Store playload length and continue encoding
_ec.plLength = dynamic_cast<const OCTETSTRING &>(type).lengthof();
loggers::get_instance().log("GeoNetworkingCodec::encode_: Storing payload length %d for %s", _ec.plLength, field_descriptor.name);
_ec.length = dynamic_cast<const OCTETSTRING &>(type).lengthof();
loggers::get_instance().log("GeoNetworkingCodec::encode_: Storing payload length %d for %s", _ec.length, field_descriptor.name);
}
type.encode(field_descriptor, encoding_buffer, TTCN_EncDec::CT_RAW);
}
......@@ -108,7 +107,8 @@ int GeoNetworkingCodec::decode (const OCTETSTRING& data, LibItsGeoNetworking__Ty
_params = params;
loggers::get_instance().log_to_hexa(">>> GeoNetworkingCodec::decode: decoding_buffer=", decoding_buffer);
decode_(msg, LibItsGeoNetworking__TypesAndValues::GeoNetworkingPdu_descr_, decoding_buffer);
decode_(msg, *msg.get_descriptor(), decoding_buffer);
loggers::get_instance().log("GeoNetworkingCodec::decode: After decoding, , payload: plLength=%d", _dc.length);
// Set layer parameters
if (_params != NULL) {
(*_params)[Params::gn_next_header] = _dc.next_header;
......@@ -163,12 +163,12 @@ int GeoNetworkingCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& f
LibItsGeoNetworking__TypesAndValues::Payload p;
decode_(p, *p.get_descriptor(), decoding_buffer);
loggers::get_instance().log_msg("GeoNetworkingCodec::decode_: payload= ", p);
if (p.is_bound()) {
if (p.is_bound() && (p.rawPayload().lengthof() != 0)) {
dynamic_cast<OPTIONAL<LibItsGeoNetworking__TypesAndValues::Payload> &>(type) = OPTIONAL<LibItsGeoNetworking__TypesAndValues::Payload>(p);
loggers::get_instance().log_msg("GeoNetworkingCodec::decode_: Set OPTIONAL<Payload> to ", type);
} else {
loggers::get_instance().log("GeoNetworkingCodec::decode_: Set OPTIONAL<Payload> to omit");
dynamic_cast<OPTIONAL<LibItsGeoNetworking__TypesAndValues::Payload> &>(type).set_to_omit();
dynamic_cast<OPTIONAL<LibItsGeoNetworking__TypesAndValues::Payload> &>(type).set_to_omit();
}
} else if (std::string(field_descriptor.name).compare("@LibItsGeoNetworking_TypesAndValues.Payload.decodedPayload") == 0) {
dynamic_cast<OPTIONAL<LibItsGeoNetworking__TypesAndValues::DecodedPayload> &>(type).set_to_omit();
......@@ -183,15 +183,15 @@ int GeoNetworkingCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& f
}
// Align the payload length with the specified plLenght value
OCTETSTRING os;
if (_dc.plLength != 0) {
if ((unsigned char)s.lengthof() <= _dc.plLength) {
if (_dc.length != 0) {
if ((unsigned char)s.lengthof() <= _dc.length) {
os = OCTETSTRING(s.lengthof(), p);
_dc.payload = std::string(static_cast<const char *>(oct2str(os)));
//_dc.payload.assign(p, p + s.lengthof());
} else {
os = OCTETSTRING(_dc.plLength, p);
os = OCTETSTRING(_dc.length, p);
_dc.payload = std::string(static_cast<const char *>(oct2str(os)));
//_dc.payload.assign(p, p + _dc.plLength);
//_dc.payload.assign(p, p + _dc.length);
}
} else {
os = s;
......@@ -203,7 +203,7 @@ int GeoNetworkingCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& f
// Decode plLength data structure
type.decode(field_descriptor, decoding_buffer, TTCN_EncDec::CT_RAW);
// Store playload length and continue decoding
_dc.plLength = (unsigned int)static_cast<int>(dynamic_cast<const INTEGER &>(type));
_dc.length = (unsigned int)static_cast<int>(dynamic_cast<const INTEGER &>(type));
} else {
type.decode(field_descriptor, decoding_buffer, TTCN_EncDec::CT_RAW);
}
......@@ -355,7 +355,7 @@ int GeoNetworkingCodec::decode_extendedHeader(LibItsGeoNetworking__TypesAndValue
case LibItsGeoNetworking__TypesAndValues::HeaderType::e__locationService:
if (_dc.header_sub_type == LibItsGeoNetworking__TypesAndValues::HeaderSubTypeLs::e__lsRequest) {
decode_(u.lsRequestHeader(), *u.lsRequestHeader().get_descriptor(), decoding_buffer);
} else if (_dc.header_type == LibItsGeoNetworking__TypesAndValues::HeaderSubTypeLs::e__lsReply) {
} else if (_dc.header_sub_type == LibItsGeoNetworking__TypesAndValues::HeaderSubTypeLs::e__lsReply) {
decode_(u.lsReplyHeader(), *u.lsReplyHeader().get_descriptor(), decoding_buffer);
} else {
TTCN_error("GeoNetworkingCodec::decode_headerTST: Location service subtype not processed");
......@@ -367,7 +367,7 @@ int GeoNetworkingCodec::decode_extendedHeader(LibItsGeoNetworking__TypesAndValue
case LibItsGeoNetworking__TypesAndValues::HeaderType::e__serviceAnnouncement:
/*if (_dc.header_sub_type == LibItsGeoNetworking__TypesAndValues::HeaderSubTypeSa::e__sa) {
decode_(u.saHeader(), *u.saHeader().get_descriptor(), decoding_buffer);
} else if (_dc.header_type == LibItsGeoNetworking__TypesAndValues::HeaderSubTypeSa::e__saEos) {
} else if (_dc.header_sub_type == LibItsGeoNetworking__TypesAndValues::HeaderSubTypeSa::e__saEos) {
decode_(u.saEosHeader(), *u.saEosHeader().get_descriptor(), decoding_buffer);
} else {*/
TTCN_error("GeoNetworkingCodec::decode_headerTST: Service Advertisement subtype not processed");
......
......@@ -23,10 +23,10 @@ namespace LibItsSecurity__TypesAndValues {
struct Encoding_Context {
unsigned char next_header;
unsigned char header_type;
unsigned int plLength_position;
unsigned int plLength;
unsigned int length_position;
unsigned int length;
Encoding_Context() { next_header = 0xff; header_type = 0xff; plLength_position = -1; plLength = -1; }
Encoding_Context() { next_header = 0xff; header_type = 0xff; length_position = -1; length = -1; }
};
//typedef struct Encoding_Context Encoding_Context;
......@@ -35,10 +35,10 @@ struct Decoding_Context {
unsigned char header_type;
unsigned char header_sub_type;
unsigned int lifetime;
unsigned int plLength;
unsigned int length;
std::string payload;
Decoding_Context() : payload() { next_header = 0xff; header_type = 0xff; header_sub_type = 0xff; lifetime = 0; plLength = -1; }
Decoding_Context() : payload() { next_header = 0xff; header_type = 0xff; header_sub_type = 0xff; lifetime = 0; length = -1; }
};
//typedef struct Decoding_Context Decoding_Context;
......
#include <chrono>
#include "GeoNetworkingLayer.hh"
#include "GeoNetworkingTypes.hh"
#include "loggers.hh"
GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::string & param) : TLayer<LibItsGeoNetworking__TestSystem::GeoNetworkingPort>(p_type), _params(), _codec(), _thread(NULL), _running(FALSE) {
using namespace LibItsGeoNetworking__TypesAndValues;
GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::string & param) : TLayer<LibItsGeoNetworking__TestSystem::GeoNetworkingPort>(p_type), _params(), _codec(), _beacon(NULL), _thread(NULL), _running(FALSE) {
loggers::get_instance().log(">>> GeoNetworkingLayer::GeoNetworkingLayer: %s, %s", to_string().c_str(), param.c_str());
// Setup parameters
Params::convert(_params, param);
......@@ -11,15 +15,71 @@ GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::st
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("mac_bc"), "FFFFFFFFFFFF"));
}
// Prepare the static part of the TestSystem beacon
// TODO Add a method
_beacon = new GeoNetworkingPdu();
HeaderTST h;
h.beaconHdr() = BeaconHeaderType(
HeaderType(HeaderType::e__beacon),
0
);
ExtendedHeader eh;
eh.beaconHeader() = BeaconHeader(
LongPosVector(
GN__Address(
TypeOfAddress(TypeOfAddress::e__manual),
StationType(StationType::e__passengerCar),
33,
int2oct(0, 6)
),
0,
0,
0,
int2bit(0, 1),
0,
0
)
);
_beacon->basicHeader() = BasicHeader(
0,
BasicNextHeader(
BasicNextHeader::e__commonHeader
),
0,
Lifetime(
4,
LtBase(LtBase::e__50ms)
),
5
);
_beacon->gnPacket().packet() = GnNonSecuredPacket(
CommonHeader(
NextHeader(
NextHeader::e__any
),
0,
h,
TrafficClass(
SCF(SCF::e__scfDisabled),
ChannelOffload(ChannelOffload::e__choffDisabled),
0
),
int2bit(0, 8),
0,
1,
0
),
OPTIONAL<ExtendedHeader>(eh),
OPTIONAL<Payload>()
);
_beacon->gnPacket().packet().payload().set_to_omit();
_beacon->gnPacket().securedMsg().set_to_omit();
// loggers::get_instance().log_msg("GeoNetworkingLayer::GeoNetworkingLayer: beacon value: ", *p._beacon);
}
GeoNetworkingLayer::~GeoNetworkingLayer() {
if (_thread != NULL) {
_running = FALSE;
// Wait for the working thread to terminate
_thread->join();
loggers::get_instance().log("GeoNetworkingLayer::~GeoNetworkingLayer: Thread were stops");
}
stop_beaconing();
delete _beacon;
}
void GeoNetworkingLayer::sendMsg(const LibItsGeoNetworking__TestSystem::GeoNetworkingReq& p, Params& params) {
loggers::get_instance().log(">>> GeoNetworkingLayer::sendMsg");
......@@ -80,9 +140,20 @@ void GeoNetworkingLayer::receiveData(OCTETSTRING& data, Params& params) {
toAllUpperPorts(p, params);
}
void GeoNetworkingLayer::start_beconning() {
void GeoNetworkingLayer::start_beaconing() {
loggers::get_instance().log(">>> GeoNetworkingLayer::start_beaconing");
// Create the offline reader thread
_thread = new std::thread(&GeoNetworkingLayer::run_beaconing, (void *)this);
if (_thread == NULL) {
loggers::get_instance().error("GeoNetworkingLayer::start_beaconing: Failed to start beaconing thread");
}
// Wait for the thread
while (_running == FALSE) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
// Thread was started
loggers::get_instance().log("<<< PcapLayer::PcapLayer");
}
void GeoNetworkingLayer::stop_beaconing() {
......@@ -96,6 +167,49 @@ void GeoNetworkingLayer::stop_beaconing() {
}
}
void* GeoNetworkingLayer::run_beaconing(void* p_this) {
loggers::get_instance().log(">>> GeoNetworkingLayer::run_beaconing");
// Pointer the main object
GeoNetworkingLayer& p = *static_cast<GeoNetworkingLayer *>(p_this);
Params params(p._params);
unsigned int expiry = 1000;
Params::const_iterator it = params.find("TsBeaconInterval");
if (it != params.cend()) {
expiry = std::stoul(it->second);
}
ExtendedHeader* eh = static_cast<ExtendedHeader *>(p._beacon->gnPacket().packet().extendedHeader().get_opt_value());
if (eh == NULL) {
loggers::get_instance().error("GeoNetworkingLayer::run_beaconing: Wrong cast");
}
GeoNetworkingCodec codec;
// Create the beacon
p._running = TRUE;
while (p._running) { // Loop while _running flag is up
// Update timestamp
loggers::get_instance().log("GeoNetworkingLayer::run_beaconing: Update timestamp");
unsigned long ms = std::chrono::system_clock::now().time_since_epoch() / std::chrono::milliseconds(1);
eh->beaconHeader().srcPosVector().timestamp__() = ms;
// Encode message
OCTETSTRING data;
codec.encode(*p._beacon, data);
// Use TITAN codec because of no payload!!
/*TTCN_Buffer encoding_buffer;
p._beacon->encode(*p._beacon->get_descriptor(), encoding_buffer, TTCN_EncDec::CT_RAW);*/
// Send it
p.sendData(data, params);
/*OCTETSTRING data;
data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data());
p.sendData(data, params);*/
// Timer
loggers::get_instance().log("GeoNetworkingLayer::run_beaconing: Wait for expiry");
std::this_thread::sleep_for(std::chrono::milliseconds(expiry));
} // End of 'while' statement
loggers::get_instance().log("<<< GeoNetworkingLayer::run_beaconing");
return NULL;
}
class GeoNetworkingFactory: public LayerFactory {
static GeoNetworkingFactory _f;
public:
......
......@@ -13,14 +13,22 @@ namespace LibItsGeoNetworking__TestSystem {
class GeoNetworkingInd;
}
namespace LibItsGeoNetworking__TypesAndValues {
class GeoNetworkingPdu;
}
class GeoNetworkingLayer : public TLayer<LibItsGeoNetworking__TestSystem::GeoNetworkingPort> {
Params _params;