From 4d5d8594532c3b922f33877a2908e05f5c721b2a Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 20 Apr 2021 11:35:36 +0100 Subject: [PATCH] CPM integration with initial dissemination control functions --- src/CMakeLists.txt | 2 ++ src/config.c | 5 +++++ src/facilities.c | 15 +++++++++++++++ src/facilities.h | 6 +++++- src/requests.c | 11 +++++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 36b7f08..879df9a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,7 @@ ADD_EXECUTABLE(it2s-itss-facilities infrastructure.c requests.c facilities.c + cpm.c ) TARGET_LINK_LIBRARIES(it2s-itss-facilities @@ -19,6 +20,7 @@ TARGET_LINK_LIBRARIES(it2s-itss-facilities -lit2s-asn-camv2 -lit2s-asn-ivim -lit2s-asn-denmv2 + -lit2s-asn-cpm -lm ) diff --git a/src/config.c b/src/config.c index 2d89992..f9fd8e2 100644 --- a/src/config.c +++ b/src/config.c @@ -200,6 +200,11 @@ int facilities_config(void* facilities_s) { facilities->infrastructure->replay_interval = config->facilities.ivim.replay_interval; facilities->infrastructure->default_service_duration = config->facilities.ivim.default_service_duration * 60000; + //CPM + facilities->dissemination->active = config->facilities.cpm.activate; + facilities->dissemination->T_GenCpmMin = config->facilities.cpm.rsu_obu_period_min; + facilities->dissemination->T_GenCpmMax = config->facilities.cpm.rsu_obu_period_max; + // Replay facilities->replay = config->networking.replay.activate; diff --git a/src/facilities.c b/src/facilities.c index 2f2aa10..9ac4763 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -3,6 +3,7 @@ #include "config.h" #include "denm.h" #include "requests.h" +#include "cpm.h" #include #include @@ -16,6 +17,9 @@ #include #include #include +#include +#include +#include #include @@ -74,6 +78,12 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8 its_msg = calloc(1, sizeof(IVIM_t)); handled_msg = true; break; + case Port_cpm: + its_msg_descriptor = &asn_DEF_CPM; + its_msg = calloc(1, sizeof(CPM_t)); + handled_msg = true; + break; + default: syslog_debug("[facilities] messsage with unhandled BTP port received, ignoring"); goto cleanup; @@ -376,6 +386,7 @@ int main() { facilities.zmq.ctx = zmq_ctx_new(); facilities.lightship = lightship_init(); + facilities.dissemination = dissemination_init(); facilities.tx_queue = queue_init(); facilities.den = calloc(1, sizeof(den_t)); facilities.infrastructure = calloc(1, sizeof(infrastructure_t)); @@ -402,6 +413,9 @@ int main() { // Infrastructure pthread_create(&facilities.infrastructure_service, NULL, infrastructure_service, (void*) &facilities); + // CPM + pthread_create(&facilities.cp_service, NULL, cp_service, (void*) &facilities); + uint8_t buffer[PACKET_MAX_LEN]; syslog_info("[facilities] listening"); uint8_t code; @@ -454,6 +468,7 @@ int main() { pthread_join(facilities.ca_service, NULL); pthread_join(facilities.den_service, NULL); pthread_join(facilities.infrastructure_service, NULL); + pthread_join(facilities.cp_service, NULL); return 0; } diff --git a/src/facilities.h b/src/facilities.h index f2d4e57..5d6e20d 100644 --- a/src/facilities.h +++ b/src/facilities.h @@ -9,6 +9,7 @@ #include "denm.h" #include "infrastructure.h" #include "queue.h" +#include "cpm.h" typedef struct epv { pthread_mutex_t lock; @@ -28,7 +29,7 @@ typedef struct facilities { pthread_t den_service; pthread_t infrastructure_service; pthread_t transmitting; - + pthread_t cp_service; // ZMQ struct { void* ctx; @@ -53,6 +54,9 @@ typedef struct facilities { // Infrastructure infrastructure_t* infrastructure; + //CPM + dissemination_t* dissemination; + int station_type; bool use_security; bool replay; diff --git a/src/requests.c b/src/requests.c index b3d5028..03ed2b1 100644 --- a/src/requests.c +++ b/src/requests.c @@ -3,12 +3,14 @@ #include "denm.h" #include "infrastructure.h" #include "requests.h" +#include "cpm.h" #include #include #include #include +#include #define syslog_info(msg, ...) syslog(LOG_INFO, msg, ##__VA_ARGS__) #define syslog_emerg(msg, ...) syslog(LOG_EMERG, "%s:%d [" msg "]", __func__, __LINE__, ##__VA_ARGS__) @@ -84,6 +86,15 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, bdr->gnPacketTransportType = PacketTransportType_shb; bdr->gnTrafficClass = 1; + break; + + case ItsMessageType_cpm: + its_msg_def = &asn_DEF_CPM; + its_msg = calloc(1, sizeof(CPM_t)); + bdr->destinationPort = Port_cpm; + bdr->gnPacketTransportType = PacketTransportType_shb; + bdr->gnTrafficClass = 2; + break; default: syslog_err("[facilities] unrecognized FDRequest message type (%ld)", fdreq->choice.singleMessage.itsMessageType);