Reduce mk_cam encoding calls
This commit is contained in:
parent
2a9bf03d67
commit
2d1696548a
42
src/cam.c
42
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;
|
int rv = 0;
|
||||||
|
|
||||||
CAM_t *cam = calloc(1, sizeof(CAM_t));
|
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;
|
*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:
|
cleanup:
|
||||||
ASN_STRUCT_FREE(asn_DEF_CAM, cam);
|
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
|
// Check permissions
|
||||||
if (ssp) {
|
if (ssp) {
|
||||||
if (cam->cam.camParameters.highFrequencyContainer.present == HighFrequencyContainer_PR_rsuContainerHighFrequency &&
|
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)) {
|
if (!permissions_check(CID_PROTECTED_ZONES, ssp, ssp_len)) {
|
||||||
rv = CAM_BAD_PERMISSIONS;
|
rv = CAM_BAD_PERMISSIONS;
|
||||||
syslog_debug("[facilities] [ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_PROTECTED_ZONES].container);
|
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 (cam->cam.camParameters.specialVehicleContainer->choice.roadWorksContainerBasic.closedLanes) {
|
||||||
if (!permissions_check(CID_CLOSED_LANES, ssp, ssp_len)) {
|
if (!permissions_check(CID_CLOSED_LANES, ssp, ssp_len)) {
|
||||||
rv = CAM_BAD_PERMISSIONS;
|
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;
|
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 (bm & 0x02) {
|
||||||
if (!permissions_check(CID_REQUEST_FOR_RIGHT_OF_WAY, ssp, ssp_len)) {
|
if (!permissions_check(CID_REQUEST_FOR_RIGHT_OF_WAY, ssp, ssp_len)) {
|
||||||
rv = CAM_BAD_PERMISSIONS;
|
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;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bm & 0x01) {
|
if (bm & 0x01) {
|
||||||
if (!permissions_check(CID_REQUEST_FOR_FREE_CROSSING_AT_A_TRAFFIC_LIGHT, ssp, ssp_len)) {
|
if (!permissions_check(CID_REQUEST_FOR_FREE_CROSSING_AT_A_TRAFFIC_LIGHT, ssp, ssp_len)) {
|
||||||
rv = CAM_BAD_PERMISSIONS;
|
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;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -498,14 +489,14 @@ enum CAM_CHECK_R check_cam(void* fc, BTPPacketIndication_t *bpi, CAM_t* cam, it2
|
||||||
case TrafficRule_noPassing:
|
case TrafficRule_noPassing:
|
||||||
if (!permissions_check(CID_NO_PASSING, ssp, ssp_len)) {
|
if (!permissions_check(CID_NO_PASSING, ssp, ssp_len)) {
|
||||||
rv = CAM_BAD_PERMISSIONS;
|
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;
|
return rv;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TrafficRule_noPassingForTrucks:
|
case TrafficRule_noPassingForTrucks:
|
||||||
if (!permissions_check(CID_NO_PASSING_FOR_TRUCKS, ssp, ssp_len)) {
|
if (!permissions_check(CID_NO_PASSING_FOR_TRUCKS, ssp, ssp_len)) {
|
||||||
rv = CAM_BAD_PERMISSIONS;
|
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;
|
return rv;
|
||||||
}
|
}
|
||||||
break;
|
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 (cam->cam.camParameters.specialVehicleContainer->choice.safetyCarContainer.speedLimit) {
|
||||||
if (!permissions_check(CID_SPEED_LIMIT, ssp, ssp_len)) {
|
if (!permissions_check(CID_SPEED_LIMIT, ssp, ssp_len)) {
|
||||||
rv = CAM_BAD_PERMISSIONS;
|
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;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -672,7 +663,7 @@ void *ca_service(void *fc) {
|
||||||
|
|
||||||
|
|
||||||
// Fill header for FacilitiesIndication and FacilitiesMessageIndication structs
|
// Fill header for FacilitiesIndication and FacilitiesMessageIndication structs
|
||||||
|
|
||||||
FacilitiesIndication_t* fi = calloc(1,sizeof(FacilitiesIndication_t));
|
FacilitiesIndication_t* fi = calloc(1,sizeof(FacilitiesIndication_t));
|
||||||
fi->present = FacilitiesIndication_PR_message;
|
fi->present = FacilitiesIndication_PR_message;
|
||||||
FacilitiesMessageIndication_t* fmi = &fi->choice.message;
|
FacilitiesMessageIndication_t* fmi = &fi->choice.message;
|
||||||
|
|
@ -687,10 +678,12 @@ void *ca_service(void *fc) {
|
||||||
usleep(1000*50);
|
usleep(1000*50);
|
||||||
|
|
||||||
if (lightship_check(facilities->lightship, &facilities->epv) && facilities->lightship->active) {
|
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) {
|
if (rv) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
memcpy(fmi->data.buf, bpr->data.buf, bpr->data.size);
|
||||||
|
fmi->data.size = bpr->data.size;
|
||||||
|
|
||||||
// Check if inside PZ
|
// Check if inside PZ
|
||||||
bpr->gn.communicationProfile = 0;
|
bpr->gn.communicationProfile = 0;
|
||||||
|
|
@ -702,16 +695,15 @@ void *ca_service(void *fc) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
asn_enc_rval_t enc_fdi = oer_encode_to_buffer(&asn_DEF_FacilitiesIndication, NULL, fi, fi_oer+1, 1023);
|
asn_enc_rval_t enc_fdi = oer_encode_to_buffer(&asn_DEF_FacilitiesIndication, NULL, fi, fi_oer+1, 1023);
|
||||||
if(enc_fdi.encoded == -1){
|
if(enc_fdi.encoded == -1){
|
||||||
syslog_err("[facilities] encoding FI for cam failed");
|
syslog_err("[facilities] encoding FI for cam failed");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
queue_add(facilities->tx_queue, tr_oer, enc.encoded+1, 3);
|
queue_add(facilities->tx_queue, tr_oer, enc.encoded+1, 3);
|
||||||
pthread_cond_signal(&facilities->tx_queue->trigger);
|
pthread_cond_signal(&facilities->tx_queue->trigger);
|
||||||
|
|
||||||
|
|
||||||
queue_add(facilities->tx_queue, fi_oer, enc_fdi.encoded+1, 5);
|
queue_add(facilities->tx_queue, fi_oer, enc_fdi.encoded+1, 5);
|
||||||
pthread_cond_signal(&facilities->tx_queue->trigger);
|
pthread_cond_signal(&facilities->tx_queue->trigger);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue