Commit 5358032d authored by YannGarcia's avatar YannGarcia
Browse files

Add changes due to CV2X#1 Plugtest

parent 0d89f1d1
......@@ -8,7 +8,7 @@
#include "converter.hh"
unsigned char commsignia_layer::_fixed_header[10] = { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0D };
unsigned char commsignia_layer::_g5_fixed_header[10] = { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0D };
commsignia_layer::commsignia_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params(), _mac_src(), _eth_type() {
loggers::get_instance().log(">>> commsignia_layer::commsignia_layer: %s, %s", to_string().c_str(), param.c_str());
......@@ -45,57 +45,64 @@ commsignia_layer::commsignia_layer(const std::string & p_type, const std::string
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("use_vpn"), "0"));
}
it = _params.find(std::string("xport_mode"));
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("xport_mode"), "G5"));
}
//_params.log();
}
void commsignia_layer::send_data(OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> commsignia_layer::send_data: ", data);
OCTETSTRING buffer(10, commsignia_layer::_fixed_header);
if (_params[std::string("use_vpn")].compare("1") == 0) {
buffer += int2oct(1, 1); // Injection to software
} else {
buffer += int2oct(0, 1); // Injection to radio
}
buffer += int2oct(0, 1); // Fix
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Injection=", buffer);
buffer += int2oct(std::stoi(_params[params::interface_id]), 4);
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Interface=", buffer);
buffer += int2oct(std::stoi(_params[std::string("data_rate")]), 2);
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: data_rate=", buffer);
buffer += int2oct(7, 1); // MAC user priority
buffer += int2oct(0x80000000 & std::stoi(_params[std::string("power_tx")]), 4); // Negative number
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: PowerTx=", buffer);
// Destination MAC address
params::const_iterator it = params.find(params::mac_dst); // Find in provided parameters, params
if (it != params.cend()) {
buffer += str2oct(CHARSTRING(it->second.c_str()));
} else {
it = _params.find(params::mac_dst);
if (it != _params.cend()) {
OCTETSTRING buffer = OCTETSTRING(0, nullptr);
if (_params[std::string("xport_mode")].compare("G5") == 0) {
buffer = OCTETSTRING(10, commsignia_layer::_g5_fixed_header);
if (_params[std::string("use_vpn")].compare("1") == 0) {
buffer += int2oct(1, 1); // Injection to software
} else {
buffer += int2oct(0, 1); // Injection to radio
}
buffer += int2oct(0, 1); // Fix
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Injection=", buffer);
buffer += int2oct(std::stoi(_params[params::interface_id]), 4);
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Interface=", buffer);
buffer += int2oct(std::stoi(_params[std::string("data_rate")]), 2);
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: data_rate=", buffer);
buffer += int2oct(7, 1); // MAC user priority
buffer += int2oct(0x80000000 & std::stoi(_params[std::string("power_tx")]), 4); // Negative number
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: PowerTx=", buffer);
// Destination MAC address
params::const_iterator it = params.find(params::mac_dst); // Find in provided parameters, params
if (it != params.cend()) {
buffer += str2oct(CHARSTRING(it->second.c_str()));
} else {
buffer += str2oct(CHARSTRING(_params[params::mac_bc].c_str()));
it = _params.find(params::mac_dst);
if (it != _params.cend()) {
buffer += str2oct(CHARSTRING(it->second.c_str()));
} else {
buffer += str2oct(CHARSTRING(_params[params::mac_bc].c_str()));
}
}
}
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: mac_dst=", buffer);
// Source MAC address
it = params.find(params::mac_src); // Find in provided parameters, params
if (it != params.cend()) {
buffer += str2oct(CHARSTRING(it->second.c_str()));
} else {
it = _params.find(params::mac_src);
if (it != _params.cend()) {
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: mac_dst=", buffer);
// Source MAC address
it = params.find(params::mac_src); // Find in provided parameters, params
if (it != params.cend()) {
buffer += str2oct(CHARSTRING(it->second.c_str()));
} else {
buffer += str2oct(CHARSTRING(_params[params::mac_src].c_str()));
} else {
it = _params.find(params::mac_src);
if (it != _params.cend()) {
buffer += str2oct(CHARSTRING(it->second.c_str()));
} else {
buffer += str2oct(CHARSTRING(_params[params::mac_src].c_str()));
}
}
}
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: mac_src=", buffer);
buffer += int2oct(0, 2); // Fixed
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Fixed=", buffer);
buffer += int2oct(data.lengthof(), 2); // Data length
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Data length=", buffer);
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: mac_src=", buffer);
buffer += int2oct(0, 2); // Fixed
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Fixed=", buffer);
buffer += int2oct(data.lengthof(), 2); // Data length
loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: Data length=", buffer);
} // else, LTE-V2X, injection buffer = GN+BTP+CAM/DENM only
buffer += data; // Payload
loggers::get_instance().log_msg("commsignia_layer::send_data: Final buffer=", buffer);
......@@ -188,6 +195,8 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
memcpy((void*)&h.fragment_seq_num, (unsigned short*)p, sizeof(unsigned short)); p += sizeof(unsigned short);
loggers::get_instance().log("commsignia_layer::receive_data: fragment_seq_num=%04x", h.fragment_seq_num);
OCTETSTRING bid = OCTETSTRING(6, (const unsigned char*)&h.bss_id); // TODO To be removed
loggers::get_instance().log_msg("commsignia_layer::receive_data: bss_id: ", bid);
OCTETSTRING dst = OCTETSTRING(6, (const unsigned char*)&h.dst_addr);
loggers::get_instance().log_msg("commsignia_layer::receive_data: dst: ", dst);
OCTETSTRING src = OCTETSTRING(6, (const unsigned char*)&h.src_addr);
......@@ -199,9 +208,9 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
loggers::get_instance().warning("commsignia_layer::receive_data: Discard packet due to wrong comparison");
//TODO return;
} // else, continue
const commsignia_layer::c2p_llc_hdr* l;
int length;
if (c2p_ver == 0x11) {
const commsignia_layer::c2p_llc_hdr* l;
if ((ntohs(h.frame_ctrl) & 0xf000) == 0x8000) {
l = (const commsignia_layer::c2p_llc_hdr*)(static_cast<const unsigned char *>(data) + sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_qos_ctrl));
length = sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_qos_ctrl) + sizeof(commsignia_layer::c2p_llc_hdr);
......@@ -209,11 +218,8 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
l = (const commsignia_layer::c2p_llc_hdr*)(p + sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr));
length = sizeof(commsignia_layer::c2p_s_v1_rx_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_llc_hdr);
}
loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap);
loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap);
loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ctrl);
loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type);
} else {
} else { // LTE-V2X
length = sizeof(commsignia_layer::c2p_s_v1_rx_cv2x_t) + sizeof(commsignia_layer::c2p_802_11p_hdr) + 10/*Fixed size*/;
}
// Check ether type
......
......@@ -113,7 +113,8 @@ class commsignia_layer : public layer {
std::vector<unsigned char> _eth_type; //! Used to optimize filtering on ethernet type in \see commsignia_layer::receive_data method
//! Fixed header for packet injection
static unsigned char _fixed_header[10];
static unsigned char _g5_fixed_header[10];
static unsigned char _cv2x_fixed_header[10];
public:
//! \publicsection
......
#include <algorithm>
#include <cctype>
#include <arpa/inet.h>
#include "qualcomm_layer_factory.hh"
#include "loggers.hh"
#include "converter.hh"
qualcomm_layer::qualcomm_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params() {
loggers::get_instance().log(">>> qualcomm_layer::qualcomm_layer: %s, %s", to_string().c_str(), param.c_str());
// Setup parameters
params::convert(_params, param);
//_params.log();
}
void qualcomm_layer::send_data(OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> qualcomm_layer::send_data: ", data);
OCTETSTRING buffer = int2oct(3, 1); // CV2X identifier
buffer += data; // Payload
loggers::get_instance().log_msg("qualcomm_layer::send_data: Final buffer=", buffer);
send_to_all_layers(buffer, params);
}
void qualcomm_layer::receive_data(OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> qualcomm_layer::receive_data: ", data);
// Remove CV2X identifier
data = OCTETSTRING(data.lengthof() - 1, 1 + static_cast<const unsigned char*>(data));
loggers::get_instance().log_msg("qualcomm_layer::receive_data: payload for upper layer:", data);
// FIXME receive_to_all_layers(data, params);
}
qualcomm_layer_factory qualcomm_layer_factory::_f;
/*!
* \file udp_layer_factory.hh
* \brief Header file for ITS Qualcomm port protocol layer factory.
* \author ETSI STF525
* \copyright ETSI Copyright Notification
* No part may be reproduced except as authorized by written permission.
* The copyright and the foregoing restriction extend to reproduction in all media.
* All rights reserved.
* \version 0.1
*/
#pragma once
#include "t_layer.hh"
#include "params.hh"
class OCTETSTRING; //! Forward declaration of TITAN class
/*!
* \class qualcomm_layer
* \brief This class provides description of ITS Qualcomm port protocol layer
*/
class qualcomm_layer : public layer {
params _params; //! Layer parameters
public:
//! \publicsection
/*!
* \brief Specialised constructor
* Create a new instance of the qualcomm_layer class
* \param[in] p_type \todo
* \param[in] p_param \todo
*/
qualcomm_layer(const std::string & p_type, const std::string & param);
/*!
* \brief Default destructor
* \remark If \see _reconnect_on_send is set to false, the disconnection is done by the destructor
*/
virtual ~qualcomm_layer() {};
virtual void send_data(OCTETSTRING& data, params& params);
virtual void receive_data(OCTETSTRING& data, params& info);
}; // End of class qualcomm_layer
/*!
* \file qualcomm_layer_factory.hh
* \brief Header file for ITS Qualcomm protocol layer factory.
* \author ETSI STF525
* \copyright ETSI Copyright Notification
* No part may be reproduced except as authorized by written permission.
* The copyright and the foregoing restriction extend to reproduction in all media.
* All rights reserved.
* \version 0.1
*/
#pragma once
#include "layer_stack_builder.hh"
#include "qualcomm_layer.hh"
/*!
* \class qualcomm_layer_factory
* \brief This class provides a factory class to create an qualcomm_layer class instance
*/
class qualcomm_layer_factory: public layer_factory {
static qualcomm_layer_factory _f; //! Reference to the unique instance of this class
public: //! \publicsection
/*!
* \brief Default constructor
* Create a new instance of the udp_layer_factory class
* \remark The Qualcomm layer identifier is QUALCOMM
*/
qualcomm_layer_factory() {
// register factory
layer_stack_builder::register_layer_factory("QUALCOMM", this);
};
/*!
* \fn layer* create_layer(const std::string & type, const std::string & param);
* \brief Create the layers stack based on the provided layers stack description
* \param[in] p_type The provided layers stack description
* \param[in] p_params Optional parameters
* \return 0 on success, -1 otherwise
* \inline
*/
inline virtual layer* create_layer(const std::string& p_type, const std::string& p_param) {
return new qualcomm_layer(p_type, p_param);
};
}; // End of class qualcomm_layer_factory
......@@ -171,7 +171,7 @@ security_ecc::security_ecc(const ec_elliptic_curves p_elliptic_curve, const OCTE
_pub_key_compressed = OCTETSTRING(0, nullptr);
} else { // Remove first byte
loggers::get_instance().log_msg("security_ecc::security_ecc (2): Complete _pub_key_compressed=", _pub_key_compressed);
_pub_key_compressed = OCTETSTRING(_pub_key_compressed.lengthof() -1, 1 + static_cast<const unsigned char*>(_pub_key_compressed));
_pub_key_compressed = OCTETSTRING(_pub_key_compressed.lengthof() - 1, 1 + static_cast<const unsigned char*>(_pub_key_compressed));
}
::EC_POINT_free(ec_point);
loggers::get_instance().log_msg("security_ecc::security_ecc (2): _pub_key_x=", _pub_key_x);
......
......@@ -73,6 +73,7 @@ LogEventTypes:= Yes
# source_port : Test System port
# interface_id: Interface id, used to discard packets
# tx_power : TX power (dB)
# xport_mode : G5 or LTE-V2X
# UDP layer (IP/UDP based on Pcap)
# dst_ip : Destination IPv4 address (aa.bb.cc.dd)
# dst_port: Destination port
......
......@@ -5,7 +5,7 @@ LibItsGeoNetworking_Pics.PICS_GN_LOCAL_GN_ADDR := {
typeOfAddress := e_manual,
stationType := e_passengerCar, #e_unknown
stationCountryCode := 0,
mid := '00000000000B'O #'4C5E0C14D2EA'O
mid := '4C5E0C14D2EA'O
}
# GeoNetwoking only, no facility layer
......@@ -14,22 +14,27 @@ LibItsGeoNetworking_Pics.PICS_GN_LOCAL_GN_ADDR := {
LibItsGeoNetworking_Pixits.PX_GN_UPPER_LAYER := e_btpB
# Indicate which RSU to simulate
ItsRSUsSimulator_Pixits.PX_RSU_ID := 8;
ItsRSUsSimulator_Pixits.PX_RSU_ID := 1;
# Indicate which Use Case to simulate
# UC1 (DENM only): PX_ETSI_USE_CASE_ID := 1
# UC2 (RHW) PX_ETSI_USE_CASE_ID := 2
# UC3 (TLM MAPEM/SPATEM): PX_ETSI_USE_CASE_ID := 3
# UC5 (IVIM only): PX_ETSI_USE_CASE_ID := 5
# UC6 (CAM only): PX_ETSI_USE_CASE_ID := 6
# UC7 (CAM only): PX_ETSI_USE_CASE_ID := 7
# UC8 (EVCSN only): PX_ETSI_USE_CASE_ID := 8
# UC9 (CAM only): PX_ETSI_USE_CASE_ID := 9
ItsRSUsSimulator_Pixits.PX_ETSI_USE_CASE_ID := 6
ItsRSUsSimulator_Pixits.PX_ETSI_USE_CASE_ID := 1 # 7 PX_RSU_ID := 8 ==> LCWW
# 1 PX_RSU_ID := 1 ==> RWW
# 2 PX_RSU_ID := 1 ==> RHW
# Indicate which zone to simulate
ItsRSUsSimulator_Pixits.PX_ETSI_ZONE_ID := 1
ItsRSUsSimulator_Pixits.PX_DENM_PARAM_UC2 := 1; # ==> RHW (1..5)
ItsRSUsSimulator_Pics.PICS_GENERATE_BEACON := false # Change also its_aid in geoNetworking port setting
ItsRSUsSimulator_Pics.PICS_GENERATE_CAM := true # Change also its_aid in geoNetworking port setting
ItsRSUsSimulator_Pics.PICS_GENERATE_DENM := false # Change also its_aid in geoNetworking port setting
ItsRSUsSimulator_Pics.PICS_GENERATE_CAM := false # Change also its_aid in geoNetworking port setting
ItsRSUsSimulator_Pics.PICS_GENERATE_DENM := true # Change also its_aid in geoNetworking port setting
ItsRSUsSimulator_Pics.PICS_GENERATE_IVIM := false
ItsRSUsSimulator_Pics.PICS_GENERATE_MAPEM := false
ItsRSUsSimulator_Pics.PICS_GENERATE_SPATEM := false
......@@ -148,7 +153,12 @@ LogEventTypes:= Yes
# Single GeoNetworking component port
# its_aid=36: CAM
# its_aid=37: DENM
system.geoNetworkingPort.params := "GN(ll_address=4C5E0C14D2EB,latitude=43551050,longitude=10298730,its_aid=36,secured_mode=1,encrypted_mode=0,certificate=CERT_IUT_A_AT,peer_certifIcate=CERT_TS_A_AT,sec_db_path=/home/vagrant/tmp/asn1c_cert)/ETH(mac_src=080027500f9b)/PCAP(mac_src=080027500f9b,nic=eth2,filter=and ether proto 0x8947)"
#system.geoNetworkingPort.params := "GN(ll_address=4C5E0C14D2EB,latitude=43551050,longitude=10298730,its_aid=37,secured_mode=0,encrypted_mode=0,certificate=CERT_IUT_A_AT,peer_certifIcate=CERT_TS_A_AT,sec_db_path=/home/vagrant/tmp/asn1c_cert)/ETH(mac_src=080027128a53)/PCAP(mac_src=080027128a53,nic=eth0,filter=and ether proto 0x8947)"
# Commsignia
#system.geoNetworkingPort.params := "GN(ll_address=4C5E0C14D2EB,latitude=43551050,longitude=10298730,its_aid=37,secured_mode=0,encrypted_mode=0,certificate=CERT_IUT_A_AT,peer_certifIcate=CERT_TS_A_AT,sec_db_path=/home/vagrant/tmp/asn1c_cert)/COMMSIGNIA(xport_mode=LTE-V2X,mac_src=080027F44E7D,interface_id=2,target_host=192.168.0.54)/UDP(dst_ip=192.168.0.54,src_port=9091,dst_port=7946)"
# Qualcom
system.geoNetworkingPort.params := "GN(ll_address=4C5E0C14D2EB,latitude=36747486,longitude=-4556772,distanceA=25,distanceB=25,its_aid=37,secured_mode=1,encrypted_mode=0,certificate=CERT_MICROSEC_AT_01,peer_certifIcate=CERT_TS_A_AT,sec_db_path=/home/vagrant/tmp/asn1c_cert)/QUALCOMM/UDP(dst_ip=10.200.1.113,src_port=9091,dst_port=4041)"
#system.httpPort.params := "HTTP(codecs=http_its:http_etsi_ieee1609dot2_codec)/TCP(debug=1,server=192.168.42.252,port=80)"
system.httpPort.params := "HTTP(codecs=http_its:http_etsi_ieee1609dot2_codec)/TCP(debug=1,server=192.168.1.252,port=80)"
......
......@@ -6,4 +6,5 @@
PCAP_SAVE_PATH=~/tmp
rm $PCAP_SAVE_PATH/capture_*.pcap*
~/frameworks/wireshark-build/run/tshark -ieth1 -V -f"ether proto 0x8947 or udp src port 12345 or udp dst port 12345" -Tfields -eframe.time -eeth.dst -eeth.src -eeth.type -edata -g -w $PCAP_SAVE_PATH/capture_`date +'%Y%m%d'`.pcap -F pcap
#~/frameworks/wireshark-build/run/tshark -ieth1 -V -f"ether proto 0x8947 or udp src port 12345 or udp dst port 12345" -Tfields -eframe.time -eeth.dst -eeth.src -eeth.type -edata -g -w $PCAP_SAVE_PATH/capture_`date +'%Y%m%d'`.pcap -F pcap
~/frameworks/wireshark-build/run/tshark -ieth1 -V -f"udp port 9091 or udp port 7946" -Tfields -eframe.time -eeth.dst -eeth.src -eeth.type -edata -g -w $PCAP_SAVE_PATH/capture_`date +'%Y%m%d'`.pcap -F pcap
......@@ -475,10 +475,10 @@ module ItsCam_TpFunctions {
v_initialReceived := true;
//change again the curvature value and set the expectation to the measured value
if (v_camInd.msgIn.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.curvature.curvatureValue >= 0) {
v_curVal := (v_camInd.msgIn.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.curvature.curvatureValue + c_curValOffset) mod 30001;
v_curVal := (v_camInd.msgIn.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.curvature.curvatureValue + c_curValOffset) mod 1023;
} else {
v_curVal := v_camInd.msgIn.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.curvature.curvatureValue - c_curValOffset;
if (valueof(v_curVal) < -30000) {
if (valueof(v_curVal) < -1023) {
v_curVal := 0;
}
}
......@@ -1725,7 +1725,7 @@ module ItsCam_TpFunctions {
log("*** " & testcasename() & ": PRECONDITION: Expected CAM message received ***");
v_initialReceived := true;
//change again the speed value and set the expectation to the measured value
v_speedVal := (v_camInd.msgIn.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.speed.speedValue+c_speedValOffset) mod 16384;
v_speedVal := (v_camInd.msgIn.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.speed.speedValue+c_speedValOffset) mod 16383;
f_changeSpeed(c_speedValOffset);
tc_ac.start;
repeat;
......
......@@ -221,8 +221,14 @@ module ItsRSUsSimulator_Functions {
//var template (omit) EvcsnPdu v_evcsn := omit;
var template (omit) SSEM v_ssem := omit;
var integer v_counter;
log(">>> f_setup_rsu: ", vc_cam);
log(">>> f_setup_rsu: ", vc_denm);
log(">>> f_setup_rsu: ", p_rsu_id);
log(">>> f_setup_rsu: ", PX_ETSI_USE_CASE_ID);
vc_longPosVectorRsu := PICS_RSU_PARAMS[p_rsu_id].longPosVector;
log("f_setup_rsu: vc_longPosVectorRsu=", vc_longPosVectorRsu);
// MAPEM, only if PX_ETSI_USE_CASE_ID is set to 3
if ((vc_mapem == true) and (PX_ETSI_USE_CASE_ID == 3) and ispresent(PICS_MAPEM_PARMS_RSUs[p_rsu_id].intersections)) {
// Build the list of the MAPEM events
......@@ -306,10 +312,11 @@ module ItsRSUsSimulator_Functions {
/* vc_evcsn := false; */
/* } */
// DENM, only if PX_ETSI_USE_CASE_ID is set to 1
if ((vc_denm == true) and (PX_ETSI_USE_CASE_ID == 1)) {
if (vc_denm == true) {
if (PX_ETSI_USE_CASE_ID == 1) {
// Build the list of the DENM events for the specified RSU (PX_RSU_ID) and the given zone (PX_ETSI_ZONE_ID)
for (v_counter := 0; v_counter < lengthof(PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter := v_counter + 1) {
var DenmEventsParmsPerZone v_denmEventsParmsPerZone := PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1];
for (v_counter := 0; v_counter < lengthof(PICS_DENM_EVENTS_RSU_UC1[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter := v_counter + 1) {
var DenmEventsParmsPerZone v_denmEventsParmsPerZone := PICS_DENM_EVENTS_RSU_UC1[p_rsu_id][PX_ETSI_ZONE_ID - 1];
v_denmParmContainers := m_denmParmContainers(
PICS_RSU_PARAMS[p_rsu_id].stationID,
......@@ -336,10 +343,10 @@ module ItsRSUsSimulator_Functions {
}
} // End of 'for' statement
// Update referenceDenms field, all except the current one
for (v_counter := 0; v_counter < lengthof(PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter := v_counter + 1) {
for (v_counter := 0; v_counter < lengthof(PICS_DENM_EVENTS_RSU_UC1[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter := v_counter + 1) {
if (ispresent(v_denms[v_counter].denm.alacarte.roadWorks)) {
var integer v_referenceDenms := 0;
for (var integer v_counter1 := 0; v_counter1 < lengthof(PICS_DENM_EVENTS_RSU[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter1 := v_counter1 + 1) {
for (var integer v_counter1 := 0; v_counter1 < lengthof(PICS_DENM_EVENTS_RSU_UC1[p_rsu_id][PX_ETSI_ZONE_ID - 1]); v_counter1 := v_counter1 + 1) {
if (v_counter1 == v_counter) {
continue;
}
......@@ -348,8 +355,36 @@ module ItsRSUsSimulator_Functions {
} // End of 'for' statement
}
} // End of 'for' statement
} else {
} else if (PX_ETSI_USE_CASE_ID == 2) { // Use case for Accident
// Build the list of the DENM events for the specified RSU (PX_RSU_ID) and the given zone (PX_ETSI_ZONE_ID)
for (v_counter := 0; v_counter < lengthof(PICS_DENM_PARAMS_UC2); v_counter := v_counter + 1) {
v_denmParmContainers := m_denmParmContainers(
PICS_RSU_PARAMS[p_rsu_id].stationID,
f_incDenmSequenceNumber(),
PICS_DENM_REPETITION_INTERVAL,
PICS_DENM_PARAMS_UC2[v_counter].eventPosition,
PICS_DENM_PARAMS_UC2[v_counter].causeCodeType,
omit,
omit,
PICS_DENM_VALIDITY_DURATION,
PICS_DENM_RELEVANCE_DISTANCE,
PICS_DENM_RELEVANCE_TRAFFIC_DIRECTION
);
log("f_setup_rsu: v_denmParmContainers=", v_denmParmContainers);
v_denms[v_counter] := valueof(
m_denmPdu_rsu(
PICS_RSU_PARAMS[p_rsu_id].stationID,
m_denm(
v_denmParmContainers.managementContainer,
v_denmParmContainers.situationContainer,
omit
)));
} // End of 'for' statement
} else {
vc_denm := false;
}
log("f_setup_rsu: v_denms=", v_denms);
}
// CAM
if (vc_cam == true) {
......@@ -424,7 +459,7 @@ module ItsRSUsSimulator_Functions {
vc_rsuMessagesValueList[p_rsu_id] :=
m_rsuProfile(
v_beacon,
v_cam,
v_cam,
v_denms,
v_mapem,
v_spatems,
......@@ -449,7 +484,8 @@ module ItsRSUsSimulator_Functions {
setverdict(inconc);
stop;
}
log("<<< f_setup_rsu: ", vc_rsuMessagesValueList[p_rsu_id]);
} // End of function f_setup_rsu
function f_process_cf_event(
......@@ -826,7 +862,7 @@ module ItsRSUsSimulator_Functions {
ltBase := e_100s
},
c_hopLimit1
));
));
} else if ((p_its_aid == 137) or (p_its_aid == 138)) { // MAPEM/SPATEM
v_geoNetworkingPdu := valueof(m_geoNwPdu( // FIXME Use PIXIT parameter to get a fully configurable template
m_geoNwTsbPacket_payload(
......
......@@ -35,11 +35,17 @@ module ItsRSUsSimulator_Pixits {
* UC9 (CAM only): PX_ETSI_USE_CASE_ID := 9
* @remark LibItsGeoNetworking_Pixits.PX_GN_UPPER_LAYER := e_btpB
*/
modulepar integer PX_ETSI_USE_CASE_ID := 6;
modulepar integer PX_ETSI_USE_CASE_ID := 7;
/**
* @desc Indicate which zone to simulate
*/
modulepar integer PX_ETSI_ZONE_ID := 1;
/**
* @desc Indicate DENM param value to be used for RHW test cases (basic DEN messages with code and subcode only)
* @see DenmParams
*/
modulepar integer PX_DENM_PARAM_UC2 := 1;
} // End of module ItsRSUsSimulator_Pixits
......@@ -400,17 +400,17 @@ module ItsRSUsSimulator_Templates {
stationaryVehicle := omit
}
template (value) DenmParmContainers m_denmParmContainers(
in template (value) StationID p_originatingStationID,
in template (value) SequenceNumber p_sequenceNumber,
in template (value) TransmissionInterval p_repetitionInterval,
in template (value) ReferencePosition p_eventPosition,
in template (value) CauseCodeType p_causeCodeType,
in template (value) EventHistory p_eventHistory,
in template (value) Traces p_traces,
in template (value) ValidityDuration p_validityDuration := 86400,
in template (value) RelevanceDistance p_relevanceDistance := lessThan100m,
in template (value) RelevanceTrafficDirection p_relevanceTrafficDirection := upstreamTraffic
template (omit) DenmParmContainers m_denmParmContainers(
in template (value) StationID p_originatingStationID,
in template (value) SequenceNumber p_sequenceNumber,
in template (value) TransmissionInterval p_repetitionInterval,
in template (value) ReferencePosition p_eventPosition,
in template (value) CauseCodeType p_causeCodeType,
in template (omit) EventHistory p_eventHistory := omit,
in template (omit) Traces p_traces := omit,
in template (value) ValidityDuration p_validityDuration := 86400,
in template (value) RelevanceDistance p_relevanceDistance := lessThan100m,
in template (value) RelevanceTrafficDirection p_relevanceTrafficDirection := upstreamTraffic
) := {
managementContainer := {
actionID := {
......
......@@ -34,11 +34,26 @@ module ItsRSUsSimulator_TestSystem {
/**
* @desc Test component for ITS Network and Transport layer
*/
type component ItsRSUsSimulator extends ItsGeoNetworking, ItsPkiHttp {
type component ItsRSUsSimulator extends ItsGeoNetworking {
/**
* @desc RSUsimulator configuration port
*/
port ConfigRsuSimulatorPort cfPort;
/** Use httPort when EC and AT are served by the same end point */
port HttpPort httpEcPort; /** Enrolment end point */
port HttpPort httpAtVPort; /** Authorization Validation end point */
port HttpPort httpAtPort; /** Authorization end point */
var Certificate vc_eaCertificate; /** Test Adapter EA certificate */
var octetstring vc_eaPrivateKey; /** Test Adapter EA private key for signature */
var octetstring vc_eaPrivateEncKey; /** Test Adapter EA private key for encryption */
var octetstring vc_eaWholeHash; /** Test Adapter EA whole-hash for signature check */
var octetstring vc_eaWholeHash256; /** Test Adapter EA whole-hash using SHA 256 for encryption because of encryption key size ==32 */
var HashedId8 vc_eaHashedId8; /** Test Adapter EA HashedId8 for decryption of IUT's response */
var octetstring vc_aaPrivateKey; /** Test Adapter AA private key for signature */
var octetstring vc_aaPrivateEncKey; /** Test Adapter AA private key for encryption */
var HashedId8 vc_aaHashedId8; /** Test Adapter AA HashedId8 for decryption of IUT's response */