Commit 5c1bf1ea authored by garciay's avatar garciay
Browse files

Unify CAM/DENM codec code

parent 97dc23b6
......@@ -30,6 +30,9 @@ public:
static const std::string& expiry;
static const std::string& packetize; /** Indicate to the lower layer to build packet */
static const std::string& distanceA;
static const std::string& distanceB;
static const std::string& angle;
Params() : std::map<std::string, std::string>() {};
Params(const Params& p_params) : std::map<std::string, std::string>(p_params.begin(), p_params.end()) {};
......
......@@ -29,6 +29,9 @@ const std::string& Params::ll_address = std::string("ll_address");
const std::string& Params::expiry = std::string("expiry");
const std::string& Params::packetize = std::string("packetize");
const std::string& Params::distanceA = std::string("distanceA");
const std::string& Params::distanceB = std::string("distanceB");
const std::string& Params::angle = std::string("angle");
void Params::convert(Params& p_param, const std::string p_parameters) {
// Sanity checks
......
......@@ -10,18 +10,20 @@ CAMLayer::CAMLayer(const std::string & p_type, const std::string & param) : TLay
}
void CAMLayer::sendMsg(const LibItsCam__TestSystem::CamReq& p, Params& params){
loggers::get_instance().log(">>> CAMLayer::sendMsg");
loggers::get_instance().log_msg(">>> CAMLayer::sendMsg: ", p);
// Encode CAM PDU
OCTETSTRING data;
_codec.encode(p.msgOut(), data);
if (_codec.encode(p.msgOut(), data) == -1) {
loggers::get_instance().warning("CAMLayer::sendMsg: Encodeing failure");
return;
}
// Update parameters
Params pars(params);
pars.insert(std::pair<std::string, std::string>(
params.insert(std::pair<std::string, std::string>(
Params::packetize,
std::string("")
));
sendData(data, pars);
sendData(data, params);
}
void CAMLayer::sendData(OCTETSTRING& data, Params& params) {
......
......@@ -10,14 +10,16 @@ DENMLayer::DENMLayer(const std::string & p_type, const std::string & param) : TL
}
void DENMLayer::sendMsg(const LibItsDenm__TestSystem::DenmReq& p, Params& params){
loggers::get_instance().log(">>> DENMLayer::sendMsg");
loggers::get_instance().log_msg(">>> DENMLayer::sendMsg: ", p);
// Encode DENM PDU
OCTETSTRING data;
_codec.encode(p.msgOut(), data);
if (_codec.encode(p.msgOut(), data) == -1) {
loggers::get_instance().warning("DENMLayer::sendMsg: Encodeing failure");
return;
}
// Update parameters
Params pars(params);
pars.insert(std::pair<std::string, std::string>(
params.insert(std::pair<std::string, std::string>(
Params::packetize,
std::string("")
));
......
......@@ -12,7 +12,7 @@
using namespace LibItsGeoNetworking__TypesAndValues;
GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::string & param) : TLayer<LibItsGeoNetworking__TestSystem::GeoNetworkingPort>(p_type), _params(), _codec(), _beacon(nullptr), _location_table(), _pass_beacon_table(), _sendData(), _timerid{0}, _sev{0}, _its{0}, _freq_nanosecs(0), _mask{0}, _sa{0} {
GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::string & param) : TLayer<LibItsGeoNetworking__TestSystem::GeoNetworkingPort>(p_type), _params(), _codec(), _beacon(nullptr), _packet(nullptr), _location_table(), _pass_beacon_table(), _sendData(), _timerid{0}, _sev{0}, _its{0}, _freq_nanosecs(0), _mask{0}, _sa{0} {
loggers::get_instance().log(">>> GeoNetworkingLayer::GeoNetworkingLayer: %s, %s", to_string().c_str(), param.c_str());
// Setup parameters
......@@ -33,6 +33,21 @@ GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::st
if (it != _params.cend()) {
ll_address = str2oct(CHARSTRING(it->second.c_str()));
}
INTEGER distanceA = 1000; // 1km
it = _params.find(Params::distanceA);
if (it != _params.cend()) {
distanceA = str2int(CHARSTRING(it->second.c_str()));
}
INTEGER distanceB = 1000; // 1Km
it = _params.find(Params::distanceB);
if (it != _params.cend()) {
distanceB = str2int(CHARSTRING(it->second.c_str()));
}
INTEGER angle = 0;
it = _params.find(Params::angle);
if (it != _params.cend()) {
angle = str2int(CHARSTRING(it->second.c_str()));
}
// Add broadcast address if needed
it = _params.find("mac_bc");
if (it == _params.cend()) {
......@@ -48,6 +63,8 @@ GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::st
fill_beacon(latitude, longitude, ll_address);
start_beaconing();
}
fill_packet(latitude, longitude, ll_address, latitude, longitude, distanceA, distanceB, angle);// TODO Check if GeoBroadcastArea lat/lon are identical to lat/lon of the Test System
} // End of constructor
GeoNetworkingLayer::~GeoNetworkingLayer() {
......@@ -60,6 +77,9 @@ GeoNetworkingLayer::~GeoNetworkingLayer() {
if (_beacon != nullptr) {
delete _beacon;
}
if (_packet != nullptr) {
delete _packet;
}
} // End of destructor
void GeoNetworkingLayer::sendMsg(const LibItsGeoNetworking__TestSystem::GeoNetworkingReq& p, Params& params) {
......@@ -77,39 +97,36 @@ void GeoNetworkingLayer::sendData(OCTETSTRING& data, Params& params) {
// TODO Take into account the Security
Params::const_iterator it = params.find(Params::packetize);
/*if (it != params.cend()) {
LibItsGeoNetworking__TypesAndValues::GeoNetworkingPacket gnp;
if (_params[Params::btp_type].compare("btpA") == 0) {
header.btpAHeader() = LibItsGeoNetworking__TypesAndValues::GeoNetworkingAHeader(
std::stoi(_params[Params::btp_destination_port]),
std::stoi(_params[Params::btp_info])
);
} else {
header.btpBHeader() = LibItsGeoNetworking__TypesAndValues::GeoNetworkingBHeader(
std::stoi(_params[Params::btp_destination_port]),
std::stoi(_params[Params::btp_info])
);
if (it != params.cend()) { // Need to build a GN packet
params.log();
ExtendedHeader* eh = static_cast<ExtendedHeader *>(_packet->gnPacket().packet().extendedHeader().get_opt_value());
if (eh == NULL) {
loggers::get_instance().error("GeoNetworkingLayer::sendData: Wrong cast");
return;
}
// Update NextHeader
it = params.find(Params::btp_type);
if ((it != params.cend()) && (it->second.compare("btpB") == 0)) {
_packet->gnPacket().packet().commonHeader().nextHeader() = NextHeader::e__btpB;
} else { // Default btp is btpA
_packet->gnPacket().packet().commonHeader().nextHeader() = NextHeader::e__btpA;
}
LibItsGeoNetworking__TypesAndValues::GeoNetworkingPacket p(
LibItsGeoNetworking__TypesAndValues::BasicHeader(
1,
LibItsGeoNetworking__TypesAndValues::BasicNextHeader(LibItsGeoNetworking__TypesAndValues::BasicNextHeader::e__commonHeader), // TODO Take into acount the Security
0,
LibItsGeoNetworking__TypesAndValues::Lifetime(
LibItsGeoNetworking__TypesAndValues::Ltbase(LibItsGeoNetworking__TypesAndValues::Ltbase::e__50ms),
std::stoi(_params[Params::expity]) / 50
),
10
),
LibItsGeoNetworking__TypesAndValues::GeoNetworkingPacket(gnp)
);
loggers::get_instance().log_msg("GeoNetworkingLayer::sendData: ", p);
// Update sequence number
eh->geoBroadcastHeader().seqNumber() = 1 + eh->geoBroadcastHeader().seqNumber();
// Update payload
_packet->gnPacket().packet().commonHeader().plLength() = data.lengthof();
_packet->gnPacket().packet().payload() = OPTIONAL<OCTETSTRING>(data);
// Update timestamp
unsigned long long ms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - 1072911600000L; // TODO Add method such as its_tme() & its_time_mod()
eh->geoBroadcastHeader().srcPosVector().timestamp__().set_long_long_val(static_cast<unsigned int>(ms));
loggers::get_instance().log_msg("GeoNetworkingLayer::sendData: ", *_packet);
// Encode GeoNetworking PDU
OCTETSTRING os;
_codec.encode(p, os);
_codec.encode(*_packet, os);
data = os;
}*/
}
// TODO To be removed
while (_sendData.try_lock() == FALSE) {
......@@ -235,7 +252,7 @@ OCTETSTRING GeoNetworkingLayer::trigger_ac_event(OCTETSTRING& data, Params& para
void GeoNetworkingLayer::start_beaconing() {
loggers::get_instance().log(">>> GeoNetworkingLayer::start_beaconing");
loggers::get_instance().log_msg("GeoNetworkingLayer::start_beaconing: _beacon=", *_beacon);
//loggers::get_instance().log_msg("GeoNetworkingLayer::start_beaconing: _beacon=", *_beacon);
// Establish handler for timer signal
loggers::get_instance().log("GeoNetworkingLayer::start_beaconing: Establishing handler for signal %d\n", _signal_id);
......@@ -315,7 +332,7 @@ void GeoNetworkingLayer::send_beacon() {
loggers::get_instance().error("GeoNetworkingLayer::send_beacon: Wrong cast");
}
// Update timestamp
unsigned long long ms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - 1072911600000L; // TODO Add method such as its_tme() & its_time_mod()
unsigned long long ms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - 1072911600000L; // TODO Add method such as its_time() & its_time_mod()
eh->beaconHeader().srcPosVector().timestamp__().set_long_long_val(static_cast<unsigned int>(ms));
//loggers::get_instance().log_msg("GeoNetworkingLayer::send_beacon: ", *_beacon);
// Encode message using TITAN because of payload in omited
......@@ -367,8 +384,8 @@ void GeoNetworkingLayer::fill_beacon(INTEGER& p_latitude, INTEGER& p_longitude,
eh.beaconHeader() = BeaconHeader(
LongPosVector(
GN__Address(
TypeOfAddress(TypeOfAddress::e__manual),
StationType(StationType::e__roadSideUnit),
TypeOfAddress(TypeOfAddress::e__manual), // TODO Use Params
StationType(StationType::e__roadSideUnit), // TODO Use Params
33,
p_ll_address
),
......@@ -414,9 +431,79 @@ void GeoNetworkingLayer::fill_beacon(INTEGER& p_latitude, INTEGER& p_longitude,
);
_beacon->gnPacket().packet().payload().set_to_omit();
_beacon->gnPacket().securedMsg().set_to_omit();
// loggers::get_instance().log_msg("GeoNetworkingLayer::GeoNetworkingLayer: beacon value: ", *p._beacon);
//loggers::get_instance().log_msg("GeoNetworkingLayer::fill_beacon: beacon value: ", *_beacon);
} // End of fill_beacon method
void GeoNetworkingLayer::fill_packet(const INTEGER& p_latitude, const INTEGER& p_longitude, const OCTETSTRING& p_ll_address, const INTEGER& p_geoAreaPosLatitude, const INTEGER& p_geoAreaPosLongitude, const INTEGER& p_distanceA, const INTEGER& p_distanceB, const INTEGER& p_angle)
{
_packet = new GeoNetworkingPdu();
HeaderTST h;
h.geoBroadcastHdr() = GeoBroadcastHeaderType(
HeaderType(HeaderType::e__geoBroadcast),
HeaderSubTypeGeoBroadcast(HeaderSubTypeGeoBroadcast::e__geoBroadcastElip)
);
ExtendedHeader eh;
eh.geoBroadcastHeader() = GeoAnycastHeader( // GeoBradcastHeader is identical as GeoAnycastHeader
0,
0,
LongPosVector(
GN__Address(
TypeOfAddress(TypeOfAddress::e__manual), // TODO Use Params
StationType(StationType::e__passengerCar), // TODO Use Params
33,
p_ll_address
),
0,
p_latitude,
p_longitude,
int2bit(1, 1), // PAI
0,
0
),
p_geoAreaPosLatitude,
p_geoAreaPosLongitude,
p_distanceA,
p_distanceB,
p_angle,
0
);
_packet->basicHeader() = BasicHeader(
0,
BasicNextHeader(
BasicNextHeader::e__commonHeader
),
0,
Lifetime(
4,
LtBase(LtBase::e__50ms)
),
5
);
_packet->gnPacket().packet() = GnNonSecuredPacket(
CommonHeader(
NextHeader(
NextHeader::e__btpA
),
0,
h,
TrafficClass(
SCF(SCF::e__scfDisabled),
ChannelOffload(ChannelOffload::e__choffDisabled),
0
),
int2bit(128, 8), // Mobile stationnary flag set
0,
5,
0
),
OPTIONAL<ExtendedHeader>(eh),
OPTIONAL<GnRawPayload>()
);
_packet->gnPacket().packet().payload().set_to_omit();
_packet->gnPacket().securedMsg().set_to_omit();
//loggers::get_instance().log_msg("GeoNetworkingLayer::fill_packet: packet value: ", *_packet);
} // End of fill_packet method
void GeoNetworkingLayer::timer_irq_sigalrm_handler(int p_signal, siginfo_t *p_signal_info, void *p_uc) {
//loggers::get_instance().log(">>> GeoNetworkingLayer::timer_irq_sigalrm_handler: Caught signal %d", p_signal);
......
......@@ -28,6 +28,7 @@ class GeoNetworkingLayer : public TLayer<LibItsGeoNetworking__TestSystem::GeoNet
Params _params;
GeoNetworkingCodec _codec;
LibItsGeoNetworking__TypesAndValues::GeoNetworkingPdu* _beacon;
LibItsGeoNetworking__TypesAndValues::GeoNetworkingPdu* _packet;
LocationTable _location_table;
LocationTable _pass_beacon_table;
std::mutex _sendData; // FIXME To be removed, useless
......@@ -46,6 +47,15 @@ class GeoNetworkingLayer : public TLayer<LibItsGeoNetworking__TestSystem::GeoNet
* @param p_address
*/
void fill_beacon(INTEGER& p_latitude, INTEGER& p_longitude, OCTETSTRING& p_ll_address);
/**
* @desc Initialize a GeoNetworking packet to send GeoNetworking Facility messages
* This object shall be updated before to be sent
* @param p_latitude
* @param p_longitude
* @param p_address
*/
void fill_packet(const INTEGER& p_latitude, const INTEGER& p_longitude, const OCTETSTRING& p_ll_address, const INTEGER& p_geoAreaPosLatitude, const INTEGER& p_geoAreaPosLongitude, const INTEGER& p_distanceA, const INTEGER& p_distanceB, const INTEGER& p_angle = 0);
static void timer_irq_sigalrm_handler(int p_signal, siginfo_t *p_signal_info, void *p_uc);
const int _signal_id = SIGTERM;
......
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