Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
71
72
73
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
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "MapemSpatemLayerFactory.hh"
#include "MapemSpatemTypes.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 mapemLayer::sendMsg(const LibItsmapem__TestSystem::mapemReq& p, Params& params){
loggers::get_instance().log_msg(">>> mapemLayer::sendMsg: ", p);
// Encode mapem PDU
OCTETSTRING data;
if (_mapem_codec.encode(p.msgOut(), data) == -1) {
loggers::get_instance().warning("mapemLayer::sendMsg: Encodeing failure");
return;
}
// Update parameters
params.insert(std::pair<std::string, std::string>(
Params::packetize,
std::string("")
));
sendData(data, params);
}
void spatemLayer::sendMsg(const LibItsspatem__TestSystem::spatemReq& p, Params& params){
loggers::get_instance().log_msg(">>> spatemLayer::sendMsg: ", p);
// Encode spatem PDU
OCTETSTRING data;
if (_spatem_codec.encode(p.msgOut(), data) == -1) {
loggers::get_instance().warning("spatemLayer::sendMsg: Encodeing failure");
return;
}
// Update parameters
params.insert(std::pair<std::string, std::string>(
Params::packetize,
std::string("")
));
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;
}
// Process lower layer data
// gnNextHeader
Params::const_iterator it = params.find(Params::gn_next_header);
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
toAllUpperPorts(p, params);
}
MapemSpatemLayerFactory MapemSpatemLayerFactory::_f;