From a0e18ae4d89b7b3bb8fb4c715cd47eea63d16bac Mon Sep 17 00:00:00 2001 From: emanuel Date: Tue, 1 Mar 2022 16:49:44 +0000 Subject: [PATCH] Packet IDs --- src/denm.c | 9 ++++----- src/denm.h | 2 +- src/facilities.c | 12 ++++++++---- src/infrastructure.c | 10 ++++------ src/infrastructure.h | 2 +- src/requests.c | 28 +++++++++++++++------------- src/requests.h | 2 +- 7 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/denm.c b/src/denm.c index 8fd8b82..4a3408d 100644 --- a/src/denm.c +++ b/src/denm.c @@ -165,7 +165,7 @@ static enum EVENT_CHECK_R event_check(den_t *den, DENM_t *denm, it2s_tender_epv_ return EVENT_NEW; } -static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* id) { +static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, uint64_t* id) { uint64_t now = it2s_tender_get_clock(epv); @@ -212,8 +212,7 @@ static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* } if (index != -1) { - den->events[index]->id = rand(); - *id = den->events[index]->id; + den->events[index]->id = *id; den->events[index]->enabled = true; den->events[index]->state = state; den->events[index]->station_id = denm->denm.management.actionID.originatingStationID; @@ -236,7 +235,7 @@ static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* else return 0; // Event added to db } -static int event_update(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* id) { +static int event_update(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, uint64_t* id) { uint64_t now = it2s_tender_get_clock(epv); @@ -319,7 +318,7 @@ static int event_update(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_ else return 0; // Event updated } -enum EVENT_CHECK_R event_manage(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint32_t ssp_len) { +enum EVENT_CHECK_R event_manage(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint32_t ssp_len) { int rv = 0; switch (rv = event_check(den, denm, epv, ssp, ssp_len)) { case EVENT_NEW: diff --git a/src/denm.h b/src/denm.h index 69524cb..6bc7995 100644 --- a/src/denm.h +++ b/src/denm.h @@ -67,7 +67,7 @@ typedef struct cc_ssp_bm { * @param ssp permissions * @return 0 if event OK, 1 if event NOK */ -enum EVENT_CHECK_R event_manage(den_t* den, DENM_t* denm, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint32_t ssp_len); +enum EVENT_CHECK_R event_manage(den_t* den, DENM_t* denm, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint32_t ssp_len); void* den_service(void* fc); diff --git a/src/facilities.c b/src/facilities.c index 3f4b868..caedeed 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -77,14 +77,15 @@ static int transport_indication(facilities_t *facilities, void* responder, void* bool fwd = false; + uint64_t id = 0; + asn_TYPE_descriptor_t *its_msg_descriptor = NULL; void *its_msg = NULL; int its_msg_type = 0; switch (tpi->present) { case TransportPacketIndication_PR_btp: - ; - + id = tpi->choice.btp.id; // Parse message switch (tpi->choice.btp.destinationPort) { case Port_cam: @@ -185,7 +186,6 @@ static int transport_indication(facilities_t *facilities, void* responder, void* syslog_debug("DENM XER %d: %.*s", (int)rve.encoded, (int)rve.encoded , xml_denm); free(xml_denm); #endif - int64_t id = -1; switch (event_manage(facilities->den, its_msg, &facilities->epv, &id, ssp, ssp_len)) { case EVENT_NEW: case EVENT_CANCELLATION: @@ -243,6 +243,7 @@ static int transport_indication(facilities_t *facilities, void* responder, void* } break; case TransportPacketIndication_PR_tcp: + id = tpi->choice.tcp.id; sreq = calloc(1, sizeof(SecurityRequest_t)); sreq->present = SecurityRequest_PR_tlsRecv; @@ -315,6 +316,7 @@ static int transport_indication(facilities_t *facilities, void* responder, void* break; case TransportPacketIndication_PR_udp: + id = tpi->choice.udp.id; break; default: @@ -327,6 +329,8 @@ static int transport_indication(facilities_t *facilities, void* responder, void* fi->present = FacilitiesIndication_PR_message; FacilitiesMessageIndication_t* fmi = &fi->choice.message; + fmi->id = id; + fmi->itsMessageType = tpi->choice.btp.destinationPort; fmi->data.size = tpi->choice.btp.data.size; @@ -369,7 +373,7 @@ static int facilities_request(facilities_t *facilities, void* responder, uint8_t switch (fr->present) { case FacilitiesRequest_PR_message: - rv = facilities_request_single_message(facilities, responder, fr); + rv = facilities_request_single_message(facilities, responder, &fr->choice.message); break; case FacilitiesRequest_PR_data: diff --git a/src/infrastructure.c b/src/infrastructure.c index 1ac9cce..cb6574d 100644 --- a/src/infrastructure.c +++ b/src/infrastructure.c @@ -83,7 +83,6 @@ static enum SERVICE_EVAL_R service_check(infrastructure_t* infrastructure, enum IVIM_t* ivim = (IVIM_t*) its_msg; - uint64_t timestamp, valid_to, valid_from; if (!ivim->ivi.mandatory.timeStamp) { timestamp = now; @@ -262,7 +261,7 @@ static enum SERVICE_EVAL_R service_check(infrastructure_t* infrastructure, enum return SERVICE_NEW; } -static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id) { +static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id) { switch (type) { case SERVICE_IVI: @@ -332,8 +331,7 @@ static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type, if (index != -1) { infrastructure->services[index]->ivim = ivim; - infrastructure->services[index]->id = rand(); - *id = infrastructure->services[index]->id; + infrastructure->services[index]->id = *id; infrastructure->services[index]->enabled = true; infrastructure->services[index]->state = state; infrastructure->services[index]->station_id = ivim->header.stationID; @@ -349,7 +347,7 @@ static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type, else return 0; // Services added to db } -static int service_update(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id) { +static int service_update(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id) { switch (type) { case SERVICE_IVI: @@ -456,7 +454,7 @@ static int service_update(infrastructure_t* infrastructure, enum SERVICE_TYPE ty else return 0; // Event updated } -enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint16_t ssp_len) { +enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint16_t ssp_len) { int rv = 0; switch (rv = service_check(infrastructure, type, its_msg, epv, ssp, ssp_len)) { case SERVICE_NEW: diff --git a/src/infrastructure.h b/src/infrastructure.h index 877f950..805e163 100644 --- a/src/infrastructure.h +++ b/src/infrastructure.h @@ -86,7 +86,7 @@ enum SERVICE_EVAL_R { SERVICE_BAD_PERMISSIONS }; -enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint16_t ssp_len); +enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint16_t ssp_len); void* infrastructure_service(void* fc); diff --git a/src/requests.c b/src/requests.c index 75ee2cf..32312ce 100644 --- a/src/requests.c +++ b/src/requests.c @@ -52,9 +52,16 @@ int facilities_request_result_rejected(void* responder) { return rv; } -int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr) { +int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesMessageRequest_t* frm) { int rv = 0; + uint64_t id = 0; + if (!frm->id) { + id = rand(); + } else if (*frm->id == 0) { + id = rand(); + } + TransportRequest_t* tr = calloc(1, sizeof(TransportRequest_t)); tr->present = TransportRequest_PR_packet; TransportPacketRequest_t* tpr = &tr->choice.packet; @@ -70,7 +77,7 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, uint32_t transmission_interval = 0; uint64_t transmission_start = 0; - switch (fr->choice.message.itsMessageType) { + switch (frm->itsMessageType) { case ItsMessageType_cam: its_msg_def = &asn_DEF_CAM; its_msg = calloc(1, sizeof(CAM_t)); @@ -105,13 +112,13 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, break; default: - syslog_err("[facilities] unrecognized FR message type (%ld)", fr->choice.message.itsMessageType); + syslog_err("[facilities] unrecognized FR message type (%ld)", frm->itsMessageType); facilities_request_result_rejected(responder); rv = 1; goto cleanup; } - asn_dec_rval_t dec = uper_decode_complete(NULL, its_msg_def, (void**) &its_msg, fr->choice.message.data.buf, fr->choice.message.data.size); + asn_dec_rval_t dec = uper_decode_complete(NULL, its_msg_def, (void**) &its_msg, frm->data.buf, frm->data.size); if (dec.code) { syslog_debug("[facilities] invalid FR %s received", its_msg_def->name); facilities_request_result_rejected(responder); @@ -119,11 +126,10 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, goto cleanup; } - int64_t id = -1; bool is_update = false; int managed_msg = false; - if (fr->choice.message.itsMessageType == ItsMessageType_denm) { + if (frm->itsMessageType == ItsMessageType_denm) { managed_msg = true; uint8_t event_type = event_manage(facilities->den, its_msg, &facilities->epv, &id, NULL, 0); @@ -211,7 +217,7 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, } } } - } else if (fr->choice.message.itsMessageType == ItsMessageType_ivim) { + } else if (frm->itsMessageType == ItsMessageType_ivim) { managed_msg = true; uint8_t service_type = service_eval(facilities->infrastructure, SERVICE_IVI, its_msg, &facilities->epv, &id, NULL, 0); @@ -262,14 +268,10 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, // Forward message to [transport] if (fwd) { - if (id != -1) { - bpr->id = id; - } else { - bpr->id = 0; - } - bpr->btpType = BTPType_btpB; + bpr->id = id; + bpr->data.buf = malloc(2048); asn_enc_rval_t enc = uper_encode_to_buffer(its_msg_def, NULL, its_msg, bpr->data.buf, 2048); if (enc.encoded == -1) { diff --git a/src/requests.h b/src/requests.h index f702785..b636e10 100644 --- a/src/requests.h +++ b/src/requests.h @@ -7,7 +7,7 @@ int facilities_request_result_accepted(void* responder); int facilities_request_result_rejected(void* responder); -int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr); +int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesMessageRequest_t* frm); int facilities_request_active_episodes(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr); int facilities_request_attribute_types(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr); int facilities_request_loaded_protected_zones(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr);