Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
ITS - Intelligent Transport Systems
ITS
Commits
23f3e699
Commit
23f3e699
authored
Jul 11, 2017
by
garciay
Browse files
Layers ongoing
parent
fe15bc8d
Changes
18
Hide whitespace changes
Inline
Side-by-side
ccsrc/EncDec/LibItsCam_Encdec.cc
View file @
23f3e699
...
...
@@ -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"
);
...
...
ccsrc/EncDec/LibItsGeoNetworking_Encdec.cc
View file @
23f3e699
...
...
@@ -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
);
...
...
ccsrc/Framework/Layer.hh
View file @
23f3e699
...
...
@@ -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
);
...
...
ccsrc/Ports/LibIts_ports/BTP_ports/BtpPort.cc
View file @
23f3e699
...
...
@@ -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
);
dynam
ic_cast
<
BTPLayer
*>
(
_layer
)
->
sendMsg
(
send_par
,
_layer_params
);
stat
ic_cast
<
BTPLayer
*>
(
_layer
)
->
sendMsg
(
send_par
,
_layer_params
);
loggers
::
get_instance
().
set_stop_time
(
_time_key
,
duration
);
}
...
...
ccsrc/Ports/LibIts_ports/CAM_ports/CamPort.cc
View file @
23f3e699
...
...
@@ -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
);
dynam
ic_cast
<
CAMLayer
*>
(
_layer
)
->
sendMsg
(
send_par
,
_layer_params
);
stat
ic_cast
<
CAMLayer
*>
(
_layer
)
->
sendMsg
(
send_par
,
_layer_params
);
loggers
::
get_instance
().
set_stop_time
(
_time_key
,
duration
);
}
...
...
ccsrc/Ports/LibIts_ports/GN_ports/GeoNetworkingPort.cc
View file @
23f3e699
...
...
@@ -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
(
"GeoNetworking
g
Port::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
);
dynam
ic_cast
<
GeoNetworkingLayer
*>
(
_layer
)
->
sendMsg
(
send_par
,
_layer_params
);
stat
ic_cast
<
GeoNetworkingLayer
*>
(
_layer
)
->
sendMsg
(
send_par
,
_layer_params
);
loggers
::
get_instance
().
set_stop_time
(
_time_key
,
duration
);
}
...
...
ccsrc/Protocols/BTP/BTPCodec.cc
View file @
23f3e699
#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
::
BtpPack
et_descr
_
,
encoding_buffer
);
encode_
(
msg
,
*
msg
.
g
et_descr
iptor
()
,
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
::
BtpPack
et_descr
_
,
decoding_buffer
);
decode_
(
msg
,
*
msg
.
g
et_descr
iptor
()
,
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.Btp
Payload.r
awPayload"
)
==
0
)
{
}
else
if
(
std
::
string
(
field_descriptor
.
name
).
compare
(
"@LibItsBtp_TypesAndValues.Btp
R
awPayload"
)
==
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
);
...
...
ccsrc/Protocols/BTP/BTPLayer.cc
View file @
23f3e699
...
...
@@ -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
,
par
ams
);
}
void
BTPLayer
::
sendData
(
OCTETSTRING
&
data
,
Params
&
params
)
{
...
...
ccsrc/Protocols/BTP/BTPLayer.hh
View file @
23f3e699
...
...
@@ -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
);
...
...
ccsrc/Protocols/CAM/CAMCodec.cc
View file @
23f3e699
...
...
@@ -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
;
}
...
...
ccsrc/Protocols/GeoNetworking/GeoNetworkingCodec.cc
View file @
23f3e699
#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
.
plL
ength
_position
!=
(
unsigned
int
)
-
1
)
{
loggers
::
get_instance
().
log
(
"GeoNetworkingCodec::encode: length=%d - plLength_position = %d - plLength = %d"
,
data
.
lengthof
(),
_ec
.
plL
ength_position
,
_ec
.
plL
ength
);
unsigned
char
b
[]
=
{
(
unsigned
char
)((
_ec
.
plL
ength
&
0x0000FF00
)
>>
8
),
(
unsigned
char
)
_ec
.
plL
ength
};
if
(
_ec
.
l
ength
!=
(
unsigned
int
)
-
1
)
{
loggers
::
get_instance
().
log
(
"GeoNetworkingCodec::encode: length=%d - plLength_position = %d - plLength = %d"
,
data
.
lengthof
(),
_ec
.
l
ength_position
,
_ec
.
l
ength
);
unsigned
char
b
[]
=
{
(
unsigned
char
)((
_ec
.
l
ength
&
0x0000FF00
)
>>
8
),
(
unsigned
char
)
_ec
.
l
ength
};
OCTETSTRING
rpl
(
sizeof
(
b
),
b
);
loggers
::
get_instance
().
log_msg
(
"GeoNetworkingCodec::encode: rpl="
,
rpl
);
data
=
replace
(
data
,
_ec
.
plL
ength_position
,
rpl
.
lengthof
(),
rpl
);
data
=
replace
(
data
,
_ec
.
l
ength_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
.
plL
ength_position
=
encoding_buffer
.
get_len
();
loggers
::
get_instance
().
log
(
"GeoNetworkingCodec::encode_: Storing position %d for %s"
,
_ec
.
plL
ength_position
,
field_descriptor
.
name
);
_ec
.
l
ength_position
=
encoding_buffer
.
get_len
();
loggers
::
get_instance
().
log
(
"GeoNetworkingCodec::encode_: Storing position %d for %s"
,
_ec
.
l
ength_position
,
field_descriptor
.
name
);
}
else
if
(
std
::
string
(
field_descriptor
.
name
).
compare
(
"@LibItsGeoNetworking_TypesAndValues.Payload.rawPayload"
)
==
0
)
{
// Store playload length and continue encoding
_ec
.
plL
ength
=
dynamic_cast
<
const
OCTETSTRING
&>
(
type
).
lengthof
();
loggers
::
get_instance
().
log
(
"GeoNetworkingCodec::encode_: Storing payload length %d for %s"
,
_ec
.
plL
ength
,
field_descriptor
.
name
);
_ec
.
l
ength
=
dynamic_cast
<
const
OCTETSTRING
&>
(
type
).
lengthof
();
loggers
::
get_instance
().
log
(
"GeoNetworkingCodec::encode_: Storing payload length %d for %s"
,
_ec
.
l
ength
,
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
.
plL
ength
!=
0
)
{
if
((
unsigned
char
)
s
.
lengthof
()
<=
_dc
.
plL
ength
)
{
if
(
_dc
.
l
ength
!=
0
)
{
if
((
unsigned
char
)
s
.
lengthof
()
<=
_dc
.
l
ength
)
{
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
.
plL
ength
,
p
);
os
=
OCTETSTRING
(
_dc
.
l
ength
,
p
);
_dc
.
payload
=
std
::
string
(
static_cast
<
const
char
*>
(
oct2str
(
os
)));
//_dc.payload.assign(p, p + _dc.
plL
ength);
//_dc.payload.assign(p, p + _dc.
l
ength);
}
}
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
.
plL
ength
=
(
unsigned
int
)
static_cast
<
int
>
(
dynamic_cast
<
const
INTEGER
&>
(
type
));
_dc
.
l
ength
=
(
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"
);
...
...
ccsrc/Protocols/GeoNetworking/GeoNetworkingCodec.hh
View file @
23f3e699
...
...
@@ -23,10 +23,10 @@ namespace LibItsSecurity__TypesAndValues {
struct
Encoding_Context
{
unsigned
char
next_header
;
unsigned
char
header_type
;
unsigned
int
plL
ength_position
;
unsigned
int
plL
ength
;
unsigned
int
l
ength_position
;
unsigned
int
l
ength
;
Encoding_Context
()
{
next_header
=
0xff
;
header_type
=
0xff
;
plL
ength_position
=
-
1
;
plL
ength
=
-
1
;
}
Encoding_Context
()
{
next_header
=
0xff
;
header_type
=
0xff
;
l
ength_position
=
-
1
;
l
ength
=
-
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
plL
ength
;
unsigned
int
l
ength
;
std
::
string
payload
;
Decoding_Context
()
:
payload
()
{
next_header
=
0xff
;
header_type
=
0xff
;
header_sub_type
=
0xff
;
lifetime
=
0
;
plL
ength
=
-
1
;
}
Decoding_Context
()
:
payload
()
{
next_header
=
0xff
;
header_type
=
0xff
;
header_sub_type
=
0xff
;
lifetime
=
0
;
l
ength
=
-
1
;
}
};
//typedef struct Decoding_Context Decoding_Context;
...
...
ccsrc/Protocols/GeoNetworking/GeoNetworkingLayer.cc
View file @
23f3e699
#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_becon
n
ing
()
{
void
GeoNetworkingLayer
::
start_be
a
coning
()
{
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:
...
...
ccsrc/Protocols/GeoNetworking/GeoNetworkingLayer.hh
View file @
23f3e699
...
...
@@ -13,14 +13,22 @@ namespace LibItsGeoNetworking__TestSystem {
class
GeoNetworkingInd
;
}
namespace
LibItsGeoNetworking__TypesAndValues
{
class
GeoNetworkingPdu
;
}
class
GeoNetworkingLayer
:
public
TLayer
<
LibItsGeoNetworking__TestSystem
::
GeoNetworkingPort
>
{
Params
_params
;