diff --git a/src/cam.c b/src/cam.c index 6168af4..78db5fc 100644 --- a/src/cam.c +++ b/src/cam.c @@ -18,6 +18,7 @@ #include #include +#include #include @@ -760,6 +761,10 @@ void *ca_service(void *fc) { memcpy(fmi->data.buf, bpr->data.buf, bpr->data.size); fmi->data.size = bpr->data.size; + if (facilities->logging) { + it2s_tender_db_add(&facilities->db, &facilities->epv, true, ItsPduHeader__messageID_cam, bpr->data.buf, bpr->data.size); + } + // Check if inside PZ bpr->gn.communicationProfile = 0; if (facilities->station_type != 15 && check_pz(facilities->lightship, &facilities->epv)) bpr->gn.communicationProfile = 1; diff --git a/src/config.c b/src/config.c index b962d94..1066401 100644 --- a/src/config.c +++ b/src/config.c @@ -193,6 +193,8 @@ int facilities_config(void* facilities_s) { facilities->station_type = 5; } + facilities->logging = config->general.logging; + facilities->use_security = config->security.use_security; pthread_mutex_init(&facilities->id.lock, NULL); diff --git a/src/cpm.c b/src/cpm.c index 8db8b85..a98f986 100644 --- a/src/cpm.c +++ b/src/cpm.c @@ -722,6 +722,10 @@ void *cp_service(void *fc){ /* CPM build and encoding to BDR and FDI */ if(mk_cpm(facilities, bpr->data.buf, (uint32_t *) &bpr->data.size, fmi->data.buf, (uint32_t *) &fmi->data.size, history_list, valid_array, history_timestamp) == 1) continue; + + if (facilities->logging) { + it2s_tender_db_add(&facilities->db, &facilities->epv, true, 14, bpr->data.buf, bpr->data.size); + } /* Encode TransportRequest */ asn_enc_rval_t enc_tdr = oer_encode_to_buffer(&asn_DEF_TransportRequest, NULL, tr, tr_oer+1, 2047); diff --git a/src/facilities.c b/src/facilities.c index 4287719..3f4b868 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -79,6 +79,7 @@ static int transport_indication(facilities_t *facilities, void* responder, void* asn_TYPE_descriptor_t *its_msg_descriptor = NULL; void *its_msg = NULL; + int its_msg_type = 0; switch (tpi->present) { case TransportPacketIndication_PR_btp: @@ -89,42 +90,49 @@ static int transport_indication(facilities_t *facilities, void* responder, void* case Port_cam: its_msg_descriptor = &asn_DEF_CAM; its_msg = calloc(1, sizeof(CAM_t)); + its_msg_type = ItsPduHeader__messageID_cam; handled_msg = true; break; case Port_denm: its_msg_descriptor = &asn_DEF_DENM; its_msg = calloc(1, sizeof(DENM_t)); + its_msg_type = ItsPduHeader__messageID_denm; handled_msg = true; break; case Port_ivim: its_msg_descriptor = &asn_DEF_IVIM; its_msg = calloc(1, sizeof(IVIM_t)); + its_msg_type = ItsPduHeader__messageID_ivim; handled_msg = true; break; case Port_cpm: its_msg_descriptor = &asn_DEF_CPM; its_msg = calloc(1, sizeof(CPM_t)); + its_msg_type = 14; handled_msg = true; break; case Port_saem: its_msg_descriptor = &asn_DEF_SAEM; its_msg = calloc(1, sizeof(SAEM_t)); + its_msg_type = ItsPduHeader__messageID_saem; handled_msg = true; break; case 7011: /* tolling */ its_msg_descriptor = &asn_DEF_TPM; its_msg = calloc(1, sizeof(TPM_t)); + its_msg_type = 117; handled_msg = true; break; case 2043: /* maneuvers */ its_msg_descriptor = &asn_DEF_PCM; its_msg = calloc(1, sizeof(PCM_t)); + its_msg_type = 43; handled_msg = true; break; @@ -140,6 +148,10 @@ static int transport_indication(facilities_t *facilities, void* responder, void* goto cleanup; } + if (facilities->logging) { + it2s_tender_db_add(&facilities->db, &facilities->epv, false, its_msg_type, tpi->choice.btp.data.buf, tpi->choice.btp.data.size); + } + // Get permisisons uint8_t* ssp = NULL; uint16_t ssp_len; @@ -708,10 +720,17 @@ int main() { // Tolling tolling_init(&facilities.tolling, facilities.zmq.ctx, facilities.zmq.security_address); - // DC + // PC if (facilities.coordination.active) pthread_create(&facilities.pc_service, NULL, pc_service, (void*) &facilities); + if (facilities.logging) { + if (it2s_tender_db_init(&facilities.db, "facilities", facilities.id.station_id)) { + syslog_err("[facilities] failed to initialize the database -> turning off logging"); + facilities.logging = false; + } + } + void* security_socket = zmq_socket(facilities.zmq.ctx, ZMQ_REQ); int wait_ms = 1000; zmq_setsockopt(security_socket, ZMQ_RCVTIMEO, &wait_ms, sizeof(int)); diff --git a/src/facilities.h b/src/facilities.h index a10120c..e37ac6e 100644 --- a/src/facilities.h +++ b/src/facilities.h @@ -16,6 +16,7 @@ #include #include +#include enum ID_CHANGE_STAGE { ID_CHANGE_INACTIVE, @@ -69,6 +70,10 @@ typedef struct facilities { // DC coordination_s coordination; + // Logging + bool logging; + it2s_tender_database_s db; + int station_type; bool use_security; bool replay; diff --git a/src/saem.c b/src/saem.c index f6869bb..b7e50c8 100644 --- a/src/saem.c +++ b/src/saem.c @@ -320,6 +320,11 @@ void *sa_service(void *fc) { if (bulletin->to_provide_len && sleep_ms*mk_saem_n_sleep >= 1000) { rv = mk_saem(facilities, bpr->data.buf, (uint32_t *) &bpr->data.size); if (!rv) { + + if (facilities->logging) { + it2s_tender_db_add(&facilities->db, &facilities->epv, true, messageID_saem, bpr->data.buf, bpr->data.size); + } + asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_TransportRequest, NULL, tr, tr_oer+1, 1023); if (enc.encoded == -1) { syslog_err("[facilities] encoding TR for SAEM failed"); diff --git a/src/tpm.c b/src/tpm.c index 63fcdf0..94555c5 100644 --- a/src/tpm.c +++ b/src/tpm.c @@ -155,6 +155,10 @@ int tpm_pay(void* fc, uint8_t* neighbour) { bpr->gn.trafficClass = 2; bpr->gn.packetTransportType = PacketTransportType_shb; + if (facilities->logging) { + it2s_tender_db_add(&facilities->db, &facilities->epv, true, 117, bpr->data.buf, bpr->data.size); + } + // encode TR buf[0] = 4; enc = oer_encode_to_buffer(&asn_DEF_TransportRequest, NULL, tr, buf+1, buf_len-1); @@ -319,6 +323,7 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, uint8_t* ne } size_t tpm_uper_len = (enc.encoded + 7) / 8; + // [transport] request (TR) tr = calloc(1, sizeof(TransportRequest_t)); tr->present = TransportRequest_PR_packet; @@ -349,6 +354,10 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, uint8_t* ne memcpy(bpr->gn.securityNeighbour->buf, neighbour, 8); } + if (facilities->logging) { + it2s_tender_db_add(&facilities->db, &facilities->epv, true, 117, bpr->data.buf, bpr->data.size); + } + // encode TR buf[0] = 4; enc = oer_encode_to_buffer(&asn_DEF_TransportRequest, NULL, tr, buf+1, buf_len-1);