From 70bb5bf9ee27161ed73a8d6f6f95d880bd3c17ba Mon Sep 17 00:00:00 2001 From: emanuel Date: Wed, 22 Dec 2021 16:53:24 +0000 Subject: [PATCH] Handle [networking] indications --- src/CMakeLists.txt | 1 + src/facilities.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e01840d..49e4941 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,6 +16,7 @@ TARGET_LINK_LIBRARIES(it2s-itss-facilities -lit2s-asn-itss-transport -lit2s-asn-itss-security -lit2s-asn-itss-management + -lit2s-asn-itss-networking -lzmq -lpthread -lit2s-config diff --git a/src/facilities.c b/src/facilities.c index eb3c1a8..b668cbd 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -7,6 +7,7 @@ #include "cpm.h" #include "sa.h" +#include #include #include #include @@ -495,6 +496,43 @@ cleanup: return rv; } +static int networking_indication(facilities_t* facilities, void* responder, uint8_t* msg, uint32_t msg_len) { + int rv = 0; + + uint8_t code = 0; + + NetworkingIndication_t* ni = calloc(1, sizeof(NetworkingIndication_t)); + + asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_NetworkingIndication, (void**) &ni, msg, msg_len); + if (dec.code) { + rv = 1; + code = 1; + zmq_send(responder, &code, 1, 0); + goto cleanup; + } + zmq_send(responder, &code, 1, 0); + + if (ni->present != NetworkingIndication_PR_data) { + goto cleanup; + } + + if (ni->choice.data.mobileNeighbour && + *ni->choice.data.mobileNeighbour) { + + pthread_mutex_lock(&facilities->lightship->lock); + facilities->lightship->last_vehicle = it2s_tender_get_clock(&facilities->epv); + facilities->lightship->is_vehicle_near = true; + pthread_mutex_unlock(&facilities->lightship->lock); + } + + +cleanup: + ASN_STRUCT_FREE(asn_DEF_NetworkingIndication, ni); + + return rv; +} + + static int management_indication(facilities_t* facilities, void* responder, uint8_t* msg, uint32_t msg_len) { int rv = 0; @@ -655,6 +693,10 @@ int main() { rl = zmq_recv(facilities.zmq.responders[i].socket, buffer, PACKET_MAX_LEN, 0); switch (buffer[0]) { + case 2: + networking_indication(&facilities, facilities.zmq.responders[i].socket, buffer+1, rl); + break; + case 3: in_idchange = true; pthread_mutex_lock(&facilities.id.change.lock);