Newer
Older
#include "MapemSpatemLayerFactory.hh"
#include "loggers.hh"
MapemSpatemLayer::MapemSpatemLayer(const std::string & p_type, const std::string & param) : TLayer<LibItsMapemSpatem__TestSystem::MapemSpatemPort>(p_type), _params(), _mapem_codec(), _spatem_codec() {
loggers::get_instance().log(">>> MapemSpatemLayer::MapemSpatemLayer: %s, %s", to_string().c_str(), param.c_str());
// Setup parameters
Params::convert(_params, param);
}
void MapemSpatemLayer::sendMsg(const LibItsMapemSpatem__TestSystem::MapemReq& p, Params& params){
loggers::get_instance().log_msg(">>> MapemSpatemLayer::sendMsg: ", p);
// Encode mapem PDU
OCTETSTRING data;
if (_mapem_codec.encode(p.msgOut(), data) == -1) {
loggers::get_instance().warning("MapemSpatemLayer::sendMsg: Encodeing failure");
return;
}
// Update parameters
sendData(data, params);
}
void MapemSpatemLayer::sendMsg(const LibItsMapemSpatem__TestSystem::SpatemReq& p, Params& params){
loggers::get_instance().log_msg(">>> MapemSpatemLayer::sendMsg: ", p);
// Encode spatem PDU
OCTETSTRING data;
if (_spatem_codec.encode(p.msgOut(), data) == -1) {
loggers::get_instance().warning("MapemSpatemLayer::sendMsg: Encodeing failure");
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
return;
}
sendData(data, params);
}
void MapemSpatemLayer::sendData(OCTETSTRING& data, Params& params) {
loggers::get_instance().log_msg(">>> MapemSpatemLayer::sendData: ", data);
//params.log();
sendToAllLayers(data, params);
}
void MapemSpatemLayer::receiveData(OCTETSTRING& data, Params& params)
{
loggers::get_instance().log_msg(">>> MapemSpatemLayer::receiveData: ", data);
// Sanity check
if (*(static_cast<const unsigned char*>(data)+ 1) == 0x04) { // Check that received packet has MAPE message id
// Decode the MAPEM payload
LibItsMapemSpatem__TestSystem::MapemInd p;
_mapem_codec.decode(data, p.msgIn());
if (!p.msgIn().is_bound()) {
// Discard it
return;
} // else, continue
} else if (*(static_cast<const unsigned char*>(data)+ 1) == 0x05) { // Check that received packet has SPATE message id
// Decode the SPATEM payload
LibItsMapemSpatem__TestSystem::SpatemInd p;
_spatem_codec.decode(data, p.msgIn());
if (!p.msgIn().is_bound()) {
// Discard it
return;
} // else, continue
} else {
// Not a DENM message, discard it
loggers::get_instance().warning("MapemSpatemLayer::receiveData: Wrong message id: 0x%02x", *(static_cast<const unsigned char*>(data)+ 1));
return;
}
/*Params::const_iterator it = params.find(Params::gn_next_header);
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
if (it != params.cend()) {
p.gnNextHeader() = std::stoi(it->second);
} else {
p.gnNextHeader().set_to_omit();
}
// gnHeaderType
it = params.find(Params::gn_header_type);
if (it != params.cend()) {
p.gnHeaderType() = std::stoi(it->second);
} else {
p.gnHeaderType().set_to_omit();
}
// gnHeaderSubtype
it = params.find(Params::gn_header_sub_type);
if (it != params.cend()) {
p.gnHeaderSubtype() = std::stoi(it->second);
} else {
p.gnHeaderSubtype().set_to_omit();
}
// gnLifetime
it = params.find(Params::gn_lifetime);
if (it != params.cend()) {
p.gnLifetime() = std::stoi(it->second);
} else {
p.gnLifetime().set_to_omit();
}
// gnTrafficClass
it = params.find(Params::gn_traffic_class);
if (it != params.cend()) {
p.gnTrafficClass() = std::stoi(it->second);
} else {
p.gnTrafficClass().set_to_omit();
}
// btpDestinationPort
it = params.find(Params::btp_destination_port);
if (it != params.cend()) {
p.btpDestinationPort() = std::stoi(it->second);
} else {
p.btpDestinationPort().set_to_omit();
}
// btpInfo
it = params.find(Params::btp_info);
if (it != params.cend()) {
p.btpInfo() = std::stoi(it->second);
} else {
p.btpInfo().set_to_omit();
}
// ssp
it = params.find(Params::ssp);
if (it != params.cend()) {
OCTETSTRING os(it->second.length(), (const unsigned char *)(it->second.c_str()));
p.ssp() = oct2bit(os);
} else {
p.ssp().set_to_omit();
}
// its_aid
it = params.find(Params::its_aid);
if (it != params.cend()) {
p.its__aid() = std::stoi(it->second);
} else {
p.its__aid().set_to_omit();
}
// Pass it to the ports if amy
}
MapemSpatemLayerFactory MapemSpatemLayerFactory::_f;