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
8f370a3f
Commit
8f370a3f
authored
Jan 10, 2018
by
garciay
Browse files
Start validation of TD_AUTO_IOT_DENM_RWW_BV_01
parent
a8ed0785
Changes
5
Hide whitespace changes
Inline
Side-by-side
ccsrc/Framework/Params.hh
View file @
8f370a3f
...
...
@@ -20,6 +20,7 @@
*/
class
Params
:
public
std
::
map
<
std
::
string
,
std
::
string
>
{
public:
// TODO Use static constexpr (see CommsigniaLayer.hh)
static
const
std
::
string
&
mac_src
;
//! Source MAC address parameter name
static
const
std
::
string
&
mac_dst
;
//! Destination MAC address parameter name
static
const
std
::
string
&
mac_bc
;
//! Broadcast MAC address parameter name
...
...
@@ -53,6 +54,8 @@ public:
static
const
std
::
string
&
header_type
;
//! Upper layer settings
static
const
std
::
string
&
header_sub_type
;
//! Upper layer settings
static
const
std
::
string
&
interface_id
;
//! Commsignia antenna selector
/*!
* \brief Default constructor
* Create a new instance of the Params class
...
...
ccsrc/Framework/src/Params.cc
View file @
8f370a3f
...
...
@@ -47,6 +47,8 @@ const std::string& Params::next_header = std::string("next_header");
const
std
::
string
&
Params
::
header_type
=
std
::
string
(
"header_type"
);
const
std
::
string
&
Params
::
header_sub_type
=
std
::
string
(
"header_sub_type"
);
const
std
::
string
&
Params
::
interface_id
=
std
::
string
(
"interface_id"
);
void
Params
::
convert
(
Params
&
p_param
,
const
std
::
string
p_parameters
)
{
// Sanity checks
if
(
p_parameters
.
length
()
==
0
)
{
...
...
ccsrc/Protocols/Commsignia/CommsigniaLayer.cc
View file @
8f370a3f
...
...
@@ -9,7 +9,11 @@ CommsigniaLayer::CommsigniaLayer(const std::string & p_type, const std::string &
// Setup parameters
Params
::
convert
(
_params
,
param
);
Params
::
const_iterator
it
=
_params
.
find
(
"mac_bc"
);
Params
::
const_iterator
it
=
_params
.
find
(
"mac_src"
);
if
(
it
==
_params
.
cend
())
{
_params
.
insert
(
std
::
pair
<
std
::
string
,
std
::
string
>
(
std
::
string
(
"mac_src"
),
"000000000000"
));
}
it
=
_params
.
find
(
"mac_bc"
);
if
(
it
==
_params
.
cend
())
{
_params
.
insert
(
std
::
pair
<
std
::
string
,
std
::
string
>
(
std
::
string
(
"mac_bc"
),
"FFFFFFFFFFFF"
));
}
...
...
@@ -17,6 +21,10 @@ CommsigniaLayer::CommsigniaLayer(const std::string & p_type, const std::string &
if
(
it
==
_params
.
cend
())
{
_params
.
insert
(
std
::
pair
<
std
::
string
,
std
::
string
>
(
std
::
string
(
"eth_type"
),
"8947"
));
}
it
=
_params
.
find
(
Params
::
interface_id
);
if
(
it
==
_params
.
cend
())
{
_params
.
insert
(
std
::
pair
<
std
::
string
,
std
::
string
>
(
std
::
string
(
"interface_id"
),
"1"
));
}
//_params.log();
}
...
...
@@ -29,32 +37,62 @@ void CommsigniaLayer::receiveData(OCTETSTRING& data, Params& params) {
loggers
::
get_instance
().
log_msg
(
">>> CommsigniaLayer::receiveData: "
,
data
);
const
unsigned
char
*
p
=
static_cast
<
const
unsigned
char
*>
(
data
);
const
CommsigniaLayer
::
c2p_recv
*
r
=
(
const
CommsigniaLayer
::
c2p_recv
*
)
p
;
//loggers::get_instance().log("CommsigniaLayer::receiveData: version=%02x", r->version);
//loggers::get_instance().log("CommsigniaLayer::receiveData: timestamp1=%08x", ntohl(r->timestamp_sec));
//loggers::get_instance().log("CommsigniaLayer::receiveData: timestamp2=%08x", ntohl(r->timestamp_msec));
//loggers::get_instance().log("CommsigniaLayer::receiveData: rssi_ant1=%02x", r->rssi_ant1);
//loggers::get_instance().log("CommsigniaLayer::receiveData: timestamp2=%08x", ntohl(r->timestamp_msec));
//loggers::get_instance().log("CommsigniaLayer::receiveData: antenna=%02x", r->antenna);
//loggers::get_instance().log("CommsigniaLayer::receiveData: rssi_ant2=%02x", r->rssi_ant2);
//loggers::get_instance().log("CommsigniaLayer::receiveData: noise_ant1=%02x", r->noise_ant1);
//loggers::get_instance().log("CommsigniaLayer::receiveData: noise_ant2=%02x", r->noise_ant2);
// Filtering on antenna index
if
(
r
->
antenna
!=
static_cast
<
unsigned
char
>
(
std
::
strtoul
(
_params
[
Params
::
interface_id
].
c_str
(),
NULL
,
10
)))
{
// Discard packet
return
;
}
// else, continue
const
CommsigniaLayer
::
c2p_802_11p_hdr
*
h
=
(
const
CommsigniaLayer
::
c2p_802_11p_hdr
*
)(
p
+
sizeof
(
CommsigniaLayer
::
c2p_recv
));
loggers
::
get_instance
().
log
(
"CommsigniaLayer::receiveData: frame_ctrl=%04x"
,
h
->
frame_ctrl
);
//
loggers::get_instance().log("CommsigniaLayer::receiveData: frame_ctrl=%04x",
ntohs(
h->frame_ctrl)
)
;
OCTETSTRING
dst
=
OCTETSTRING
(
6
,
(
const
unsigned
char
*
)
&
h
->
dst_addr
);
//loggers::get_instance().log_msg("CommsigniaLayer::receiveData: dst: ", dst);
OCTETSTRING
src
=
OCTETSTRING
(
6
,
(
const
unsigned
char
*
)
&
h
->
src_addr
);
//loggers::get_instance().log_msg("CommsigniaLayer::receiveData: src: ", src);
const
CommsigniaLayer
::
c2p_llc_hdr
*
l
=
(
const
CommsigniaLayer
::
c2p_llc_hdr
*
)(
p
+
sizeof
(
CommsigniaLayer
::
c2p_recv
)
+
sizeof
(
CommsigniaLayer
::
c2p_802_11p_hdr
));
// Filtering on source MAC address of the packet
std
::
string
str
;
Params
::
const_iterator
it
=
params
.
find
(
Params
::
mac_src
);
// Find in provided parameters, params
if
(
it
!=
params
.
cend
())
{
str
=
it
->
second
;
}
else
{
str
=
_params
[
Params
::
mac_src
];
}
loggers
::
get_instance
().
log
(
"CommsigniaLayer::receiveData: compare %s with %s"
,
str
.
c_str
(),
static_cast
<
const
char
*>
(
oct2str
(
src
)));
if
(
str
.
compare
(
static_cast
<
const
char
*>
(
oct2str
(
src
)))
==
0
)
{
// Discard packet
return
;
}
// else, continue
const
CommsigniaLayer
::
c2p_llc_hdr
*
l
;
int
length
;
if
((
ntohs
(
h
->
frame_ctrl
)
&
0xf000
)
==
0x8000
)
{
l
=
(
const
CommsigniaLayer
::
c2p_llc_hdr
*
)(
p
+
sizeof
(
CommsigniaLayer
::
c2p_recv
)
+
sizeof
(
CommsigniaLayer
::
c2p_802_11p_hdr
)
+
sizeof
(
CommsigniaLayer
::
c2p_qos_ctrl
));
length
=
sizeof
(
CommsigniaLayer
::
c2p_recv
)
+
sizeof
(
CommsigniaLayer
::
c2p_802_11p_hdr
)
+
sizeof
(
CommsigniaLayer
::
c2p_qos_ctrl
)
+
sizeof
(
CommsigniaLayer
::
c2p_llc_hdr
);
}
else
{
l
=
(
const
CommsigniaLayer
::
c2p_llc_hdr
*
)(
p
+
sizeof
(
CommsigniaLayer
::
c2p_recv
)
+
sizeof
(
CommsigniaLayer
::
c2p_802_11p_hdr
));
length
=
sizeof
(
CommsigniaLayer
::
c2p_recv
)
+
sizeof
(
CommsigniaLayer
::
c2p_802_11p_hdr
)
+
sizeof
(
CommsigniaLayer
::
c2p_llc_hdr
);
}
//loggers::get_instance().log("CommsigniaLayer::receiveData: dsap=%02x", l->dsap);
//loggers::get_instance().log("CommsigniaLayer::receiveData: ssap=%02x", l->ssap);
//loggers::get_instance().log("CommsigniaLayer::receiveData: type=%04x",
ntohs(
l->type)
)
;
//loggers::get_instance().log("CommsigniaLayer::receiveData: type=%04x", l->type);
// Check ether type
OCTETSTRING
et
=
str2oct
(
_params
[
Params
::
eth_type
].
c_str
());
loggers
::
get_instance
().
log_msg
(
"CommsigniaLayer::receiveData: ether type convert: "
,
et
);
if
((
et
[
0
].
get_octet
()
==
(
unsigned
char
)((
l
->
type
&
0xff00
)
>>
8
))
&&
(
et
[
1
].
get_octet
()
==
(
unsigned
char
)(
l
->
type
&
0xff
)))
{
// Warning: Network ordered bytes
//loggers::get_instance().log_msg("CommsigniaLayer::receiveData: ether type convert: ", et);
//loggers::get_instance().log("CommsigniaLayer::receiveData: ether type convert: et[1]=%02x et[0]=%02x", et[1].get_octet(), et[0].get_octet());
if
((
et
[
1
].
get_octet
()
==
(
unsigned
char
)((
l
->
type
&
0xff00
)
>>
8
))
&&
(
et
[
0
].
get_octet
()
==
(
unsigned
char
)(
l
->
type
&
0xff
)))
{
// Warning: Network ordered bytes
// Extract payload
int
length
=
sizeof
(
CommsigniaLayer
::
c2p_recv
)
+
sizeof
(
CommsigniaLayer
::
c2p_802_11p_hdr
)
+
sizeof
(
CommsigniaLayer
::
c2p_llc_hdr
);
data
=
OCTETSTRING
(
data
.
lengthof
()
-
length
,
length
+
static_cast
<
const
unsigned
char
*>
(
data
));
loggers
::
get_instance
().
log_msg
(
"CommsigniaLayer::receiveData: payload for upper layer:"
,
data
);
//
loggers::get_instance().log_msg("CommsigniaLayer::receiveData: payload for upper layer:", data);
// Update params
CHARSTRING
s
=
oct2str
(
dst
);
...
...
ccsrc/Protocols/Commsignia/CommsigniaLayer.hh
View file @
8f370a3f
...
...
@@ -35,9 +35,10 @@ class CommsigniaLayer : public Layer {
unsigned
char
src_addr
[
CommsigniaLayer
::
LL_ADDR_LENGTH
];
unsigned
char
bss_id
[
CommsigniaLayer
::
LL_ADDR_LENGTH
];
unsigned
short
fragment_seq_num
;
unsigned
short
qos_ctrl
;
}
__attribute__
((
__packed__
))
c2p_802_11p_hdr
;
typedef
unsigned
short
c2p_qos_ctrl
;
typedef
struct
{
unsigned
char
dsap
;
unsigned
char
ssap
;
...
...
ccsrc/Protocols/ETH/EthernetLayer.cc
View file @
8f370a3f
...
...
@@ -6,10 +6,18 @@ EthernetLayer::EthernetLayer(const std::string & p_type, const std::string & par
loggers
::
get_instance
().
log
(
">>> EthernetLayer::EthernetLayer: %s, %s"
,
to_string
().
c_str
(),
param
.
c_str
());
// Setup parameters
Params
::
convert
(
_params
,
param
);
Params
::
const_iterator
it
=
_params
.
find
(
"mac_bc"
);
Params
::
const_iterator
it
=
_params
.
find
(
"mac_src"
);
if
(
it
==
_params
.
cend
())
{
_params
.
insert
(
std
::
pair
<
std
::
string
,
std
::
string
>
(
std
::
string
(
"mac_src"
),
"000000000000"
));
}
it
=
_params
.
find
(
"mac_bc"
);
if
(
it
==
_params
.
cend
())
{
_params
.
insert
(
std
::
pair
<
std
::
string
,
std
::
string
>
(
std
::
string
(
"mac_bc"
),
"FFFFFFFFFFFF"
));
}
it
=
_params
.
find
(
"eth_type"
);
if
(
it
==
_params
.
cend
())
{
_params
.
insert
(
std
::
pair
<
std
::
string
,
std
::
string
>
(
std
::
string
(
"eth_type"
),
"8947"
));
}
//_params.log();
}
...
...
@@ -22,32 +30,20 @@ void EthernetLayer::sendData(OCTETSTRING& data, Params& params) {
if
(
it
!=
params
.
cend
())
{
eth
=
str2oct
(
CHARSTRING
(
it
->
second
.
c_str
()));
}
else
{
it
=
_params
.
find
(
Params
::
mac_dst
);
// Find in layer parameters, _params
if
(
it
!=
_params
.
cend
())
{
eth
=
str2oct
(
CHARSTRING
(
it
->
second
.
c_str
()));
}
else
{
eth
=
str2oct
(
CHARSTRING
(
_params
[
Params
::
mac_bc
].
c_str
()));
}
eth
=
str2oct
(
CHARSTRING
(
_params
[
Params
::
mac_bc
].
c_str
()));
}
// Source MAC address
it
=
params
.
find
(
Params
::
mac_src
);
// Find in provided parameters, params
if
(
it
!=
params
.
cend
())
{
eth
+=
str2oct
(
CHARSTRING
(
it
->
second
.
c_str
()));
}
else
{
it
=
_params
.
find
(
Params
::
mac_src
);
// Find in layer parameters, _params
if
(
it
!=
_params
.
cend
())
{
eth
+=
str2oct
(
CHARSTRING
(
it
->
second
.
c_str
()));
}
else
{
const
unsigned
char
null_mac
[]
=
{
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
};
eth
+=
OCTETSTRING
(
sizeof
(
null_mac
),
static_cast
<
const
unsigned
char
*>
(
null_mac
));
}
eth
+=
str2oct
(
CHARSTRING
(
_params
[
Params
::
mac_src
].
c_str
()));
}
it
=
_
params
.
find
(
Params
::
eth_type
);
// Find in layer parameters
it
=
params
.
find
(
Params
::
eth_type
);
// Find in layer parameters
if
(
it
!=
params
.
cend
())
{
eth
+=
str2oct
(
CHARSTRING
(
it
->
second
.
c_str
()));
}
else
{
const
unsigned
char
proto
[]
=
{
0x89
,
0x47
};
eth
+=
OCTETSTRING
(
sizeof
(
proto
),
static_cast
<
const
unsigned
char
*>
(
proto
));
eth
+=
str2oct
(
CHARSTRING
(
_params
[
Params
::
eth_type
].
c_str
()));
}
eth
+=
data
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment