From 2d1696548a0b41943c781b8faab076025c3856aa Mon Sep 17 00:00:00 2001 From: emanuel Date: Tue, 26 Oct 2021 14:20:00 +0100 Subject: [PATCH] Reduce mk_cam encoding calls --- src/cam.c | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/src/cam.c b/src/cam.c index b8a992a..d154132 100644 --- a/src/cam.c +++ b/src/cam.c @@ -86,7 +86,7 @@ static int permissions_check(int cid, uint8_t* permissions, uint8_t permissions_ } -static int mk_cam(facilities_t* facilities, uint8_t *cam_oer, uint32_t *cam_len, uint8_t *fi_oer, uint32_t *fi_len) { +static int mk_cam(facilities_t* facilities, uint8_t *cam_oer, uint32_t *cam_len) { int rv = 0; CAM_t *cam = calloc(1, sizeof(CAM_t)); @@ -290,15 +290,6 @@ static int mk_cam(facilities_t* facilities, uint8_t *cam_oer, uint32_t *cam_len, } *cam_len = (enc.encoded + 7) / 8; - asn_enc_rval_t retval_enc_fi = uper_encode_to_buffer(&asn_DEF_CAM, NULL, cam, fi_oer, 512); - if (retval_enc_fi.encoded == -1) { - syslog_err("[facilities] [ca] failed encoding CAM (%s)", retval_enc_fi.failed_type->name); - rv = 1; - goto cleanup; - } - - *fi_len = ((retval_enc_fi.encoded + 7) / 8); - cleanup: ASN_STRUCT_FREE(asn_DEF_CAM, cam); @@ -408,7 +399,7 @@ enum CAM_CHECK_R check_cam(void* fc, BTPPacketIndication_t *bpi, CAM_t* cam, it2 // Check permissions if (ssp) { if (cam->cam.camParameters.highFrequencyContainer.present == HighFrequencyContainer_PR_rsuContainerHighFrequency && - cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU) { + cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU) { if (!permissions_check(CID_PROTECTED_ZONES, ssp, ssp_len)) { rv = CAM_BAD_PERMISSIONS; syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_PROTECTED_ZONES].container); @@ -449,7 +440,7 @@ enum CAM_CHECK_R check_cam(void* fc, BTPPacketIndication_t *bpi, CAM_t* cam, it2 if (cam->cam.camParameters.specialVehicleContainer->choice.roadWorksContainerBasic.closedLanes) { if (!permissions_check(CID_CLOSED_LANES, ssp, ssp_len)) { rv = CAM_BAD_PERMISSIONS; - syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_CLOSED_LANES].container); + syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_CLOSED_LANES].container); return rv; } } @@ -474,14 +465,14 @@ enum CAM_CHECK_R check_cam(void* fc, BTPPacketIndication_t *bpi, CAM_t* cam, it2 if (bm & 0x02) { if (!permissions_check(CID_REQUEST_FOR_RIGHT_OF_WAY, ssp, ssp_len)) { rv = CAM_BAD_PERMISSIONS; - syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_REQUEST_FOR_RIGHT_OF_WAY].container); + syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_REQUEST_FOR_RIGHT_OF_WAY].container); return rv; } } if (bm & 0x01) { if (!permissions_check(CID_REQUEST_FOR_FREE_CROSSING_AT_A_TRAFFIC_LIGHT, ssp, ssp_len)) { rv = CAM_BAD_PERMISSIONS; - syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_REQUEST_FOR_FREE_CROSSING_AT_A_TRAFFIC_LIGHT].container); + syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_REQUEST_FOR_FREE_CROSSING_AT_A_TRAFFIC_LIGHT].container); return rv; } } @@ -498,14 +489,14 @@ enum CAM_CHECK_R check_cam(void* fc, BTPPacketIndication_t *bpi, CAM_t* cam, it2 case TrafficRule_noPassing: if (!permissions_check(CID_NO_PASSING, ssp, ssp_len)) { rv = CAM_BAD_PERMISSIONS; - syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_NO_PASSING].container); + syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_NO_PASSING].container); return rv; } break; case TrafficRule_noPassingForTrucks: if (!permissions_check(CID_NO_PASSING_FOR_TRUCKS, ssp, ssp_len)) { rv = CAM_BAD_PERMISSIONS; - syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_NO_PASSING_FOR_TRUCKS].container); + syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_NO_PASSING_FOR_TRUCKS].container); return rv; } break; @@ -517,7 +508,7 @@ enum CAM_CHECK_R check_cam(void* fc, BTPPacketIndication_t *bpi, CAM_t* cam, it2 if (cam->cam.camParameters.specialVehicleContainer->choice.safetyCarContainer.speedLimit) { if (!permissions_check(CID_SPEED_LIMIT, ssp, ssp_len)) { rv = CAM_BAD_PERMISSIONS; - syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_SPEED_LIMIT].container); + syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_SPEED_LIMIT].container); return rv; } } @@ -672,7 +663,7 @@ void *ca_service(void *fc) { // Fill header for FacilitiesIndication and FacilitiesMessageIndication structs - + FacilitiesIndication_t* fi = calloc(1,sizeof(FacilitiesIndication_t)); fi->present = FacilitiesIndication_PR_message; FacilitiesMessageIndication_t* fmi = &fi->choice.message; @@ -687,10 +678,12 @@ void *ca_service(void *fc) { usleep(1000*50); if (lightship_check(facilities->lightship, &facilities->epv) && facilities->lightship->active) { - rv = mk_cam(facilities, bpr->data.buf, (uint32_t *) &bpr->data.size, fmi->data.buf, (uint32_t *) &fmi->data.size); + rv = mk_cam(facilities, bpr->data.buf, (uint32_t *) &bpr->data.size); if (rv) { continue; } + memcpy(fmi->data.buf, bpr->data.buf, bpr->data.size); + fmi->data.size = bpr->data.size; // Check if inside PZ bpr->gn.communicationProfile = 0; @@ -702,16 +695,15 @@ void *ca_service(void *fc) { continue; } - asn_enc_rval_t enc_fdi = oer_encode_to_buffer(&asn_DEF_FacilitiesIndication, NULL, fi, fi_oer+1, 1023); - if(enc_fdi.encoded == -1){ - syslog_err("[facilities] encoding FI for cam failed"); - continue; - } + asn_enc_rval_t enc_fdi = oer_encode_to_buffer(&asn_DEF_FacilitiesIndication, NULL, fi, fi_oer+1, 1023); + if(enc_fdi.encoded == -1){ + syslog_err("[facilities] encoding FI for cam failed"); + continue; + } queue_add(facilities->tx_queue, tr_oer, enc.encoded+1, 3); pthread_cond_signal(&facilities->tx_queue->trigger); - queue_add(facilities->tx_queue, fi_oer, enc_fdi.encoded+1, 5); pthread_cond_signal(&facilities->tx_queue->trigger);