From 796fdeab670f57904d0c5ac55b18b14125c8b5b0 Mon Sep 17 00:00:00 2001 From: emanuel Date: Tue, 13 Jul 2021 15:56:44 +0100 Subject: [PATCH] Initial effort to support [transport] various protocols --- src/cam.c | 35 +++---- src/cpm.c | 33 ++++--- src/facilities.c | 251 +++++++++++++++++++++++++---------------------- src/requests.c | 60 +++++------ src/sa.c | 30 +++--- test/tester.c | 29 +++--- 6 files changed, 232 insertions(+), 206 deletions(-) diff --git a/src/cam.c b/src/cam.c index f0d9f77..14c2f4e 100644 --- a/src/cam.c +++ b/src/cam.c @@ -2,8 +2,7 @@ #include "facilities.h" #include -#include -#include +#include #include #include @@ -634,31 +633,33 @@ void *ca_service(void *fc) { uint8_t code = 0; facilities_t *facilities = (facilities_t*) fc; - BTPDataRequest_t *bdr = calloc(1, sizeof(BTPDataRequest_t)); + TransportDataRequest_t* tdr = calloc(1, sizeof(TransportDataRequest_t)); + tdr->present = TransportDataRequest_PR_btp; + BTPDataRequest_t *bdr = &tdr->choice.btp; bdr->btpType = BTPType_btpB; - bdr->gnDestinationAddress.buf = malloc(6); + bdr->gn.destinationAddress.buf = malloc(6); for (int i = 0; i < 6; ++i) { - bdr->gnDestinationAddress.buf[i] = 0xff; + bdr->gn.destinationAddress.buf[i] = 0xff; } - bdr->gnDestinationAddress.size = 6; + bdr->gn.destinationAddress.size = 6; - bdr->gnPacketTransportType = PacketTransportType_shb; + bdr->gn.packetTransportType = PacketTransportType_shb; bdr->destinationPort = Port_cam; - bdr->gnTrafficClass = 2; + bdr->gn.trafficClass = 2; bdr->data.buf = malloc(512); if (facilities->use_security) { - bdr->gnSecurityProfile = malloc(sizeof(long)); - *bdr->gnSecurityProfile = 1; + bdr->gn.securityProfile = malloc(sizeof(long)); + *bdr->gn.securityProfile = 1; } - uint8_t bdr_oer[1024]; - bdr_oer[0] = 4; // Facilities + uint8_t tdr_oer[1024]; + tdr_oer[0] = 4; // Facilities while (!facilities->exit) { usleep(1000*50); @@ -669,16 +670,16 @@ void *ca_service(void *fc) { } // Check if inside PZ - bdr->gnCommunicationProfile = 0; - if (facilities->station_type != 15 && check_pz(facilities->lightship, &facilities->epv)) bdr->gnCommunicationProfile = 1; + bdr->gn.communicationProfile = 0; + if (facilities->station_type != 15 && check_pz(facilities->lightship, &facilities->epv)) bdr->gn.communicationProfile = 1; - asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer+1, 1023); + asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer+1, 1023); if (enc.encoded == -1) { syslog_err("[facilities] encoding BTPDataRequest for cam failed"); continue; } - queue_add(facilities->tx_queue, bdr_oer, enc.encoded+1, 3); + queue_add(facilities->tx_queue, tdr_oer, enc.encoded+1, 3); pthread_cond_signal(&facilities->tx_queue->trigger); lightship_reset_timer(facilities->lightship, &facilities->epv); @@ -686,7 +687,7 @@ void *ca_service(void *fc) { } - ASN_STRUCT_FREE(asn_DEF_BTPDataRequest, bdr); + ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr); return NULL; } diff --git a/src/cpm.c b/src/cpm.c index 5d1efd5..5fbc85b 100644 --- a/src/cpm.c +++ b/src/cpm.c @@ -4,8 +4,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -633,22 +632,24 @@ void *cp_service(void *fc){ facilities_t *facilities = (facilities_t *) fc; memset(valid_array, 0, sizeof(valid_array)); - uint8_t bdr_oer[2048]; + uint8_t tdr_oer[2048]; uint8_t fdi_oer[2048]; - bdr_oer[0] = 4; //Facilities + tdr_oer[0] = 4; //Facilities fdi_oer[0] = 4; - BTPDataRequest_t *bdr = calloc(1, sizeof(BTPDataRequest_t)); + TransportDataRequest_t* tdr = calloc(1, sizeof(TransportDataRequest_t)); + tdr->present = TransportDataRequest_PR_btp; + BTPDataRequest_t *bdr = &tdr->choice.btp; FacilitiesDataIndication_t *fdi = calloc(1, sizeof(FacilitiesDataIndication_t)); roadRotationSin = sin(((facilities->dissemination->radar_rotation + 90.0) * PI) / 180); roadRotationCos = cos(((facilities->dissemination->radar_rotation + 90.0) * PI) / 180); /*--- Fill mandatory BTP Data Request parameters ---*/ - bdr->gnDestinationAddress.buf = malloc(6); - bdr->gnDestinationAddress.size = 6; + bdr->gn.destinationAddress.buf = malloc(6); + bdr->gn.destinationAddress.size = 6; for(int i = 0; i < 6; i++) - bdr->gnDestinationAddress.buf[i] = 0xff; //Broadcast addr + bdr->gn.destinationAddress.buf[i] = 0xff; //Broadcast addr @@ -656,13 +657,13 @@ void *cp_service(void *fc){ //The former doesn't have a source port and the latter have bdr->destinationPort = Port_cpm; //CPM entity port for communication between Facilities and Transport - bdr->gnPacketTransportType = PacketTransportType_shb; //shb = Single Hop Broadcast packet - bdr->gnTrafficClass = 2; //Identifier assigned to a GeoNetworking packet that expresses its requirements on data transport + bdr->gn.packetTransportType = PacketTransportType_shb; //shb = Single Hop Broadcast packet + bdr->gn.trafficClass = 2; //Identifier assigned to a GeoNetworking packet that expresses its requirements on data transport bdr->data.buf = malloc(1500); //CPM Data to be sent to the Transport layer if(facilities->use_security) { - bdr->gnSecurityProfile = malloc(sizeof(long)); - *bdr->gnSecurityProfile = 1; + bdr->gn.securityProfile = malloc(sizeof(long)); + *bdr->gn.securityProfile = 1; } /*--- Fill mandatory Facilities Data Indication parameters ---*/ @@ -694,8 +695,8 @@ void *cp_service(void *fc){ continue; /* Encode BTPDataRequest */ - asn_enc_rval_t enc_bdr = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer+1, 2047); - if(enc_bdr.encoded == -1){ + asn_enc_rval_t enc_tdr = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer+1, 2047); + if(enc_tdr.encoded == -1){ syslog_err("[facilities] encoding BTPDataRequest for cpm failed"); continue; } @@ -708,7 +709,7 @@ void *cp_service(void *fc){ } /* Create thread to send packet to the Transport Layer (=3) */ - queue_add(facilities->tx_queue, bdr_oer, enc_bdr.encoded+1, 3); + queue_add(facilities->tx_queue, tdr_oer, enc_tdr.encoded+1, 3); pthread_cond_signal(&facilities->tx_queue->trigger); /* Create thread to send packet to the Applications Layer (=5) */ @@ -720,7 +721,7 @@ void *cp_service(void *fc){ } } - ASN_STRUCT_FREE(asn_DEF_BTPDataRequest,bdr); + ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr); ASN_STRUCT_FREE(asn_DEF_FacilitiesDataIndication,fdi); /* Close sockets */ diff --git a/src/facilities.c b/src/facilities.c index e20b3df..fddce90 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -7,8 +7,8 @@ #include "cpm.h" #include "sa.h" -#include -#include +#include +#include #include #include #include @@ -48,11 +48,11 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8 bool handled_msg = false; FacilitiesDataIndication_t *fdi = NULL; - BTPDataIndication_t *bdi = calloc(1, sizeof(BTPDataIndication_t)); + TransportDataIndication_t* tdi = calloc(1, sizeof(TransportDataIndication_t)); - asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_BTPDataIndication, (void**) &bdi, msg, msg_len); + asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_TransportDataIndication, (void**) &tdi, msg, msg_len); if (dec.code) { - syslog_err("[facilities]<- invalid bdi received"); + syslog_err("[facilities]<- invalid TDI received"); rv = 1; code = 1; zmq_send(responder, &code, 1, 0); @@ -60,137 +60,154 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8 } zmq_send(responder, &code, 1, 0); - syslog_debug("[facilities]<- BDI (%ldB)", bdi->data.size); - - // Parse message - asn_TYPE_descriptor_t *its_msg_descriptor; - void *its_msg; - switch (bdi->destinationPort) { - case Port_cam: - its_msg_descriptor = &asn_DEF_CAM; - its_msg = calloc(1, sizeof(CAM_t)); - handled_msg = true; - break; - - case Port_denm: - its_msg_descriptor = &asn_DEF_DENM; - its_msg = calloc(1, sizeof(DENM_t)); - handled_msg = true; - break; - - case Port_ivim: - its_msg_descriptor = &asn_DEF_IVIM; - 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; - - case Port_saem: - its_msg_descriptor = &asn_DEF_SAEM; - its_msg = calloc(1, sizeof(SAEM_t)); - handled_msg = true; - break; - - default: - syslog_debug("[facilities] messsage with unhandled BTP port received, ignoring"); - goto cleanup; - } - - dec = uper_decode_complete(NULL, its_msg_descriptor, (void**) &its_msg, bdi->data.buf, bdi->data.size); - if (dec.code) { - syslog_debug("[facilities]<- invalid %s received", its_msg_descriptor->name); - rv = 1; - goto cleanup; - } - - // Get permisisons - uint8_t* ssp = NULL; - uint16_t ssp_len; - if (bdi->gnPermissions) { - ssp = bdi->gnPermissions->ssp.buf; - ssp_len = bdi->gnPermissions->ssp.size; - } + syslog_debug("[facilities]<- received TDI (%dB)", msg_len); bool fwd = false; - // Manage message - switch (bdi->destinationPort) { - case Port_cam: - switch (check_cam(facilities, bdi, its_msg, &facilities->epv, ssp, ssp_len)) { - case CAM_OK: - fwd = true; - break; - case CAM_INVALID: - case CAM_BAD_PERMISSIONS: - default: - break; - } - break; - case Port_denm: + asn_TYPE_descriptor_t *its_msg_descriptor = NULL; + void *its_msg = NULL; + + switch (tdi->present) { + case TransportDataIndication_PR_btp: ; -#ifdef DEBUG - uint8_t* xml_denm = malloc(32768); - asn_enc_rval_t rve = xer_encode_to_buffer(xml_denm, 32768, 0x02, &asn_DEF_DENM, its_msg); - 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: - case EVENT_NEGATION: - case EVENT_UPDATE: - case EVENT_NUMBER_EXCEEDED: - fwd = true; - break; - case EVENT_INVALID: - case EVENT_PASSED: - case EVENT_REPEATED: - case EVENT_BAD_PERMISSIONS: - break; - } - break; - case Port_ivim: - switch (service_eval(facilities->infrastructure, SERVICE_IVI, its_msg, &facilities->epv, &id, ssp, ssp_len)) { - case SERVICE_NEW: - case SERVICE_CANCELLATION: - case SERVICE_NEGATION: - case SERVICE_UPDATE: - case SERVICE_NUMBER_EXCEEDED: - fwd = true; + // Parse message + + switch (tdi->choice.btp.destinationPort) { + case Port_cam: + its_msg_descriptor = &asn_DEF_CAM; + its_msg = calloc(1, sizeof(CAM_t)); + handled_msg = true; break; - case SERVICE_INVALID: - case SERVICE_REPEATED: - case SERVICE_PASSED: - case SERVICE_BAD_PERMISSIONS: + + case Port_denm: + its_msg_descriptor = &asn_DEF_DENM; + its_msg = calloc(1, sizeof(DENM_t)); + handled_msg = true; + break; + + case Port_ivim: + its_msg_descriptor = &asn_DEF_IVIM; + 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; + + case Port_saem: + its_msg_descriptor = &asn_DEF_SAEM; + its_msg = calloc(1, sizeof(SAEM_t)); + handled_msg = true; + break; + + default: + syslog_debug("[facilities] messsage with unhandled BTP port received, ignoring"); + goto cleanup; + } + + dec = uper_decode_complete(NULL, its_msg_descriptor, (void**) &its_msg, tdi->choice.btp.data.buf, tdi->choice.btp.data.size); + if (dec.code) { + syslog_debug("[facilities]<- invalid %s received", its_msg_descriptor->name); + rv = 1; + goto cleanup; + } + + // Get permisisons + uint8_t* ssp = NULL; + uint16_t ssp_len; + if (tdi->choice.btp.gn.permissions) { + ssp = tdi->choice.btp.gn.permissions->ssp.buf; + ssp_len = tdi->choice.btp.gn.permissions->ssp.size; + } + + // Manage message + switch (tdi->choice.btp.destinationPort) { + case Port_cam: + switch (check_cam(facilities, &tdi->choice.btp, its_msg, &facilities->epv, ssp, ssp_len)) { + case CAM_OK: + fwd = true; + break; + case CAM_INVALID: + case CAM_BAD_PERMISSIONS: + default: + break; + } + break; + + case Port_denm: + ; +#ifdef DEBUG + uint8_t* xml_denm = malloc(32768); + asn_enc_rval_t rve = xer_encode_to_buffer(xml_denm, 32768, 0x02, &asn_DEF_DENM, its_msg); + 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: + case EVENT_NEGATION: + case EVENT_UPDATE: + case EVENT_NUMBER_EXCEEDED: + fwd = true; + break; + case EVENT_INVALID: + case EVENT_PASSED: + case EVENT_REPEATED: + case EVENT_BAD_PERMISSIONS: + break; + } + break; + + case Port_ivim: + switch (service_eval(facilities->infrastructure, SERVICE_IVI, its_msg, &facilities->epv, &id, ssp, ssp_len)) { + case SERVICE_NEW: + case SERVICE_CANCELLATION: + case SERVICE_NEGATION: + case SERVICE_UPDATE: + case SERVICE_NUMBER_EXCEEDED: + fwd = true; + break; + case SERVICE_INVALID: + case SERVICE_REPEATED: + case SERVICE_PASSED: + case SERVICE_BAD_PERMISSIONS: + default: + break; + } + break; + + case Port_saem: + saem_check(facilities, &facilities->press, its_msg); + break; + default: break; } break; - - case Port_saem: - saem_check(facilities, &facilities->press, its_msg); + case TransportDataIndication_PR_tcp: + break; + case TransportDataIndication_PR_udp: break; default: break; } + // Forward to application if (fwd) { fdi = calloc(1, sizeof(FacilitiesDataIndication_t)); - fdi->itsMessageType = bdi->destinationPort; + fdi->itsMessageType = tdi->choice.btp.destinationPort; - fdi->data.size = bdi->data.size; - fdi->data.buf = malloc(bdi->data.size); - memcpy(fdi->data.buf, bdi->data.buf, bdi->data.size); + fdi->data.size = tdi->choice.btp.data.size; + fdi->data.buf = malloc(tdi->choice.btp.data.size); + memcpy(fdi->data.buf, tdi->choice.btp.data.buf, tdi->choice.btp.data.size); uint8_t buffer[PACKET_MAX_LEN]; buffer[0] = 4; // Facilities @@ -201,10 +218,10 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8 } cleanup: - if (handled_msg && bdi->destinationPort != Port_denm && bdi->destinationPort != Port_ivim) { + if (handled_msg && tdi->choice.btp.destinationPort != Port_denm && tdi->choice.btp.destinationPort != Port_ivim) { ASN_STRUCT_FREE(*its_msg_descriptor, its_msg); } - ASN_STRUCT_FREE(asn_DEF_BTPDataIndication, bdi); + ASN_STRUCT_FREE(asn_DEF_TransportDataIndication, tdi); ASN_STRUCT_FREE(asn_DEF_FacilitiesDataIndication, fdi); return rv; diff --git a/src/requests.c b/src/requests.c index 40b695d..8d9bce5 100644 --- a/src/requests.c +++ b/src/requests.c @@ -6,7 +6,7 @@ #include "cpm.h" #include -#include +#include #include #include @@ -53,7 +53,9 @@ int facilities_request_result_rejected(void* responder) { int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq) { int rv = 0; - BTPDataRequest_t* bdr = calloc(1, sizeof(BTPDataRequest_t)); + TransportDataRequest_t* tdr = calloc(1, sizeof(TransportDataRequest_t)); + tdr->present = TransportDataRequest_PR_btp; + BTPDataRequest_t* bdr = &tdr->choice.btp; void *its_msg = NULL; asn_TYPE_descriptor_t *its_msg_def = NULL; @@ -69,24 +71,24 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, its_msg_def = &asn_DEF_CAM; its_msg = calloc(1, sizeof(CAM_t)); bdr->destinationPort = Port_cam; - bdr->gnPacketTransportType = PacketTransportType_shb; - bdr->gnTrafficClass = 1; + bdr->gn.packetTransportType = PacketTransportType_shb; + bdr->gn.trafficClass = 1; break; case ItsMessageType_denm: its_msg_def = &asn_DEF_DENM; its_msg = calloc(1, sizeof(DENM_t)); bdr->destinationPort = Port_denm; - bdr->gnPacketTransportType = PacketTransportType_gbc; - bdr->gnTrafficClass = 2; + bdr->gn.packetTransportType = PacketTransportType_gbc; + bdr->gn.trafficClass = 2; break; case ItsMessageType_ivim: its_msg_def = &asn_DEF_IVIM; its_msg = calloc(1, sizeof(IVIM_t)); bdr->destinationPort = Port_ivim; - bdr->gnPacketTransportType = PacketTransportType_shb; - bdr->gnTrafficClass = 1; + bdr->gn.packetTransportType = PacketTransportType_shb; + bdr->gn.trafficClass = 1; break; @@ -94,8 +96,8 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, its_msg_def = &asn_DEF_CPM; its_msg = calloc(1, sizeof(CPM_t)); bdr->destinationPort = Port_cpm; - bdr->gnPacketTransportType = PacketTransportType_shb; - bdr->gnTrafficClass = 2; + bdr->gn.packetTransportType = PacketTransportType_shb; + bdr->gn.trafficClass = 2; break; default: @@ -273,52 +275,52 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, } bdr->data.size = (enc.encoded + 7) / 8; - bdr->gnDestinationAddress.buf = malloc(6); - for (int i = 0; i < 6; ++i) bdr->gnDestinationAddress.buf[i] = 0xff; - bdr->gnDestinationAddress.size = 6; + bdr->gn.destinationAddress.buf = malloc(6); + for (int i = 0; i < 6; ++i) bdr->gn.destinationAddress.buf[i] = 0xff; + bdr->gn.destinationAddress.size = 6; if (transmission_start) { - bdr->gnRepetitionStart = malloc(sizeof(long)); - *bdr->gnRepetitionStart = transmission_start; + bdr->gn.repetitionStart = malloc(sizeof(long)); + *bdr->gn.repetitionStart = transmission_start; } if (transmission_interval) { - bdr->gnRepetitionInterval = malloc(sizeof(long)); - *bdr->gnRepetitionInterval = transmission_interval; + bdr->gn.repetitionInterval = malloc(sizeof(long)); + *bdr->gn.repetitionInterval = transmission_interval; } if (transmission_duration) { - bdr->gnMaximumRepetitionTime = malloc(sizeof(long)); - *bdr->gnMaximumRepetitionTime = transmission_duration; + bdr->gn.maximumRepetitionTime = malloc(sizeof(long)); + *bdr->gn.maximumRepetitionTime = transmission_duration; } if (is_update) { - bdr->gnIsUpdate = malloc(sizeof(long)); - *bdr->gnIsUpdate = 1; + bdr->gn.isUpdate = malloc(sizeof(long)); + *bdr->gn.isUpdate = 1; } if (facilities->use_security) { - bdr->gnSecurityProfile = malloc(sizeof(long)); - *bdr->gnSecurityProfile = 1; + bdr->gn.securityProfile = malloc(sizeof(long)); + *bdr->gn.securityProfile = 1; } - uint8_t bdr_oer[2048]; - bdr_oer[0] = 4; // [facilities] service id - enc = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer + 1, 2047); + uint8_t tdr_oer[2048]; + tdr_oer[0] = 4; // [facilities] service id + enc = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer + 1, 2047); if (enc.encoded == -1) { - syslog_err("[facilities] failed encoding BDR (%s)", enc.failed_type->name); + syslog_err("[facilities] failed encoding TDR (%s)", enc.failed_type->name); rv = 1; goto cleanup; } - queue_add(facilities->tx_queue, bdr_oer, enc.encoded+1, 3); + queue_add(facilities->tx_queue, tdr_oer, enc.encoded+1, 3); pthread_cond_signal(&facilities->tx_queue->trigger); } cleanup: if (its_msg_def && !managed_msg) ASN_STRUCT_FREE(*its_msg_def, its_msg); - ASN_STRUCT_FREE(asn_DEF_BTPDataRequest, bdr); + ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr); return rv; } diff --git a/src/sa.c b/src/sa.c index 903fe8c..928d0c3 100644 --- a/src/sa.c +++ b/src/sa.c @@ -3,7 +3,7 @@ #include "infrastructure.h" #include -#include +#include #include #include @@ -140,32 +140,34 @@ cleanup: void *sa_service(void *fc) { facilities_t *facilities = (facilities_t*) fc; - BTPDataRequest_t *bdr = calloc(1, sizeof(BTPDataRequest_t)); + TransportDataRequest_t *tdr = calloc(1, sizeof(TransportDataRequest_t)); + tdr->present = TransportDataRequest_PR_btp; + BTPDataRequest_t *bdr = &tdr->choice.btp; bdr->btpType = BTPType_btpB; - bdr->gnDestinationAddress.buf = malloc(6); + bdr->gn.destinationAddress.buf = malloc(6); for (int i = 0; i < 6; ++i) { - bdr->gnDestinationAddress.buf[i] = 0xff; + bdr->gn.destinationAddress.buf[i] = 0xff; } - bdr->gnDestinationAddress.size = 6; + bdr->gn.destinationAddress.size = 6; - bdr->gnPacketTransportType = PacketTransportType_shb; + bdr->gn.packetTransportType = PacketTransportType_shb; bdr->destinationPort = Port_saem; - bdr->gnTrafficClass = 2; + bdr->gn.trafficClass = 2; bdr->data.buf = malloc(512); bdr->data.size = 512; if (facilities->use_security) { - bdr->gnSecurityProfile = malloc(sizeof(long)); - *bdr->gnSecurityProfile = 1; + bdr->gn.securityProfile = malloc(sizeof(long)); + *bdr->gn.securityProfile = 1; } - uint8_t bdr_oer[1024]; - bdr_oer[0] = 4; // Facilities + uint8_t tdr_oer[1024]; + tdr_oer[0] = 4; // Facilities int rv = 0; @@ -177,19 +179,19 @@ void *sa_service(void *fc) { continue; } - asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer+1, 1023); + asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer+1, 1023); if (enc.encoded == -1) { syslog_err("[facilities] encoding BTPDataRequest for SAEM failed"); continue; } - queue_add(facilities->tx_queue, bdr_oer, enc.encoded+1, 3); + queue_add(facilities->tx_queue, tdr_oer, enc.encoded+1, 3); pthread_cond_signal(&facilities->tx_queue->trigger); lightship_reset_timer(facilities->lightship, &facilities->epv); } - ASN_STRUCT_FREE(asn_DEF_BTPDataRequest, bdr); + ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr); return NULL; diff --git a/test/tester.c b/test/tester.c index adf160a..c3f25ec 100644 --- a/test/tester.c +++ b/test/tester.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include #include @@ -144,15 +144,15 @@ int cam_gen(void* ctx) { zmq_close(transport_socket); - BTPDataRequest_t* bdr = NULL; - asn_dec_rval_t dec = asn_decode(NULL, ATS_CANONICAL_OER, &asn_DEF_BTPDataRequest, (void**) &bdr, buffer+1, 2047); + TransportDataRequest_t* tdr = NULL; + asn_dec_rval_t dec = asn_decode(NULL, ATS_CANONICAL_OER, &asn_DEF_TransportDataRequest, (void**) &tdr, buffer+1, 2047); if (dec.code) { printf(" FAIL\n"); fflush(stdout); return 1; } - printf(" - Received CAM BDR (%ldB)\n", bdr->data.size); fflush(stdout); + printf(" - Received CAM BDR (%ldB)\n", tdr->choice.btp.data.size); fflush(stdout); - if (bdr->destinationPort == Port_cam) { + if (tdr->choice.btp.destinationPort == Port_cam) { printf(" OK\n"); fflush(stdout); } else { printf(" FAIL\n"); fflush(stdout); @@ -165,7 +165,10 @@ int cam_gen(void* ctx) { int forward_up(void* ctx) { printf("Testing forwarding up:\n"); fflush(stdout); - BTPDataIndication_t* bdi = calloc(1, sizeof(BTPDataIndication_t)); + + TransportDataIndication_t* tdi = calloc(1, sizeof(TransportDataIndication_t)); + tdi->present = TransportDataIndication_PR_btp; + BTPDataIndication_t* bdi = &tdi->choice.btp; char* cam_hex = "02027dfddf4403ca4059bba5f38cc40dba9ffffffc2230eff200e11fc0078082a88a8337fee3fff600004dffea800618d08018efff14003ac68800c77ff8e002263460063bffd1000fb1a30031dffe2800958d30018efff840048c68800c77ffae002c63480063bffbd001a31a40031dfff28002d8cf0018c0"; @@ -175,21 +178,21 @@ int forward_up(void* ctx) { bdi->data.buf = cam; bdi->data.size = cam_len; - bdi->gnDestinationAddress.buf = calloc(1, 6); - bdi->gnDestinationAddress.size = 6; + bdi->gn.destinationAddress.buf = calloc(1, 6); + bdi->gn.destinationAddress.size = 6; bdi->destinationPort = Port_cam; - uint8_t b_bdi_cam[512]; - b_bdi_cam[0] = 3; + uint8_t b_tdi_cam[512]; + b_tdi_cam[0] = 3; - asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_BTPDataIndication, bdi, b_bdi_cam+1, 511); + asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_TransportDataIndication, tdi, b_tdi_cam+1, 511); void* facilities_socket = zmq_socket(ctx, ZMQ_REQ); int code = 0; zmq_connect(facilities_socket, "ipc:///tmp/itss/facilities"); - zmq_send(facilities_socket, b_bdi_cam, enc.encoded+1, 0); + zmq_send(facilities_socket, b_tdi_cam, enc.encoded+1, 0); zmq_recv(facilities_socket, &code, 1, 0); if (code) { printf(" FAIL\n"); fflush(stdout);