Prefixed ASN.1 types

This commit is contained in:
emanuel 2024-01-25 15:20:06 +00:00
parent bca6bc9187
commit afeeb9d186
24 changed files with 1023 additions and 1022 deletions

View File

@ -15,22 +15,24 @@ ADD_EXECUTABLE(it2s-itss-facilities
)
TARGET_LINK_LIBRARIES(it2s-itss-facilities
-lit2s-asn-itss-facilities
-lit2s-asn-itss-security
-lit2s-asn-itss-management
-lit2s-asn-itss-networking
-lit2s-asn-etsi-its-sdu-itss-facilities
-lit2s-asn-etsi-its-sdu-itss-security
-lit2s-asn-etsi-its-sdu-itss-management
-lit2s-asn-etsi-its-sdu-itss-networking
-lit2s-asn-etsi-its-sdu-cdd-1.3.1
-lzmq
-lpthread
-lit2s-config-etsi-its
-lit2s-asn-camv2
-lit2s-asn-ivim
-lit2s-asn-denmv2
-lit2s-asn-cpm
-lit2s-asn-saem
-lit2s-asn-tpm
-lit2s-asn-vcm
-lit2s-asn-evcsnm
-lit2s-asn-evrsrm
-lit2s-asn-etsi-its-v1-cdd-1.3.1
-lit2s-asn-etsi-its-v1-cam
-lit2s-asn-etsi-its-v1-ivim
-lit2s-asn-etsi-its-v1-denm
-lit2s-asn-etsi-its-v1-cpm
-lit2s-asn-etsi-its-v1-saem
-lit2s-asn-etsi-its-v1-tpm
-lit2s-asn-etsi-its-v1-vcm
-lit2s-asn-etsi-its-v1-evcsnm
-lit2s-asn-etsi-its-v1-evrsrm
-lit2s-tender
-lm
-lrt

192
src/cam.c
View File

@ -1,10 +1,10 @@
#include "cam.h"
#include "facilities.h"
#include <it2s-asn/itss-networking/NetworkingRequest.h>
#include <it2s-asn/itss-facilities/FacilitiesIndication.h>
#include <it2s-asn/itss-management/ManagementRequest.h>
#include <it2s-asn/camv2/CAM.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-management/EIS_ManagementRequest.h>
#include <it2s-asn/etsi-its-v1/cam/EI1_CAM.h>
#include <sys/mman.h>
#include <stdint.h>
@ -161,22 +161,22 @@ static int mk_cam(uint8_t *cam_oer, uint16_t *cam_len) {
lightship_t* lightship = &facilities.lightship;
CAM_t *cam = calloc(1, sizeof(CAM_t));
EI1_CAM_t *cam = calloc(1, sizeof(EI1_CAM_t));
cam->header.protocolVersion = 2;
cam->header.messageID = messageID_cam;
cam->header.messageID = EI1_messageID_cam;
pthread_mutex_lock(&facilities.id.lock);
cam->header.stationID = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
cam->cam.camParameters.basicContainer.stationType = facilities.station_type;
BasicContainer_t* bc = &cam->cam.camParameters.basicContainer;
EI1_BasicContainer_t* bc = &cam->cam.camParameters.basicContainer;
uint64_t now = itss_time_get();
pthread_mutex_lock(&lightship->lock);
if (facilities.station_type != StationType_roadSideUnit) {
if (facilities.station_type != EI1_StationType_roadSideUnit) {
cam->cam.generationDeltaTime = now % 65536;
itss_space_lock();
@ -190,8 +190,8 @@ static int mk_cam(uint8_t *cam_oer, uint16_t *cam_len) {
uint16_t lat_conf = epv.space.latitude_conf;
uint16_t lon_conf = epv.space.longitude_conf;
cam->cam.camParameters.highFrequencyContainer.present = HighFrequencyContainer_PR_basicVehicleContainerHighFrequency;
BasicVehicleContainerHighFrequency_t* bvc_hf = &cam->cam.camParameters.highFrequencyContainer.choice.basicVehicleContainerHighFrequency;
cam->cam.camParameters.highFrequencyContainer.present = EI1_HighFrequencyContainer_PR_basicVehicleContainerHighFrequency;
EI1_BasicVehicleContainerHighFrequency_t* bvc_hf = &cam->cam.camParameters.highFrequencyContainer.choice.basicVehicleContainerHighFrequency;
// Set speed
bvc_hf->speed.speedValue = epv.space.speed;
@ -215,15 +215,15 @@ static int mk_cam(uint8_t *cam_oer, uint16_t *cam_len) {
bvc_hf->vehicleWidth = facilities.vehicle.width;
bvc_hf->vehicleLength.vehicleLengthValue = facilities.vehicle.length;
bvc_hf->vehicleLength.vehicleLengthConfidenceIndication = VehicleLengthConfidenceIndication_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationValue = LongitudinalAccelerationValue_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationConfidence = AccelerationConfidence_unavailable;
bvc_hf->vehicleLength.vehicleLengthConfidenceIndication = EI1_VehicleLengthConfidenceIndication_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationValue = EI1_LongitudinalAccelerationValue_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationConfidence = EI1_AccelerationConfidence_unavailable;
bvc_hf->driveDirection = DriveDirection_unavailable;
bvc_hf->curvature.curvatureValue = CurvatureValue_unavailable;
bvc_hf->curvature.curvatureConfidence = CurvatureConfidence_unavailable;
bvc_hf->yawRate.yawRateValue = YawRateValue_unavailable;
bvc_hf->yawRate.yawRateConfidence = YawRateConfidence_unavailable;
bvc_hf->driveDirection = EI1_DriveDirection_unavailable;
bvc_hf->curvature.curvatureValue = EI1_CurvatureValue_unavailable;
bvc_hf->curvature.curvatureConfidence = EI1_CurvatureConfidence_unavailable;
bvc_hf->yawRate.yawRateValue = EI1_YawRateValue_unavailable;
bvc_hf->yawRate.yawRateConfidence = EI1_YawRateConfidence_unavailable;
/*
// Save current values
@ -260,72 +260,72 @@ static int mk_cam(uint8_t *cam_oer, uint16_t *cam_len) {
else if (long_a < -160) long_a = -160;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationValue = long_a;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationConfidence = AccelerationConfidence_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationConfidence = EI1_AccelerationConfidence_unavailable;
} else {
bvc_hf->longitudinalAcceleration.longitudinalAccelerationValue = LongitudinalAccelerationValue_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationConfidence = AccelerationConfidence_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationValue = EI1_LongitudinalAccelerationValue_unavailable;
bvc_hf->longitudinalAcceleration.longitudinalAccelerationConfidence = EI1_AccelerationConfidence_unavailable;
}
// Low frequency container
if (now > lightship->t_last_cam_lfc + 500) {
cam->cam.camParameters.lowFrequencyContainer = calloc(1, sizeof(LowFrequencyContainer_t));
cam->cam.camParameters.lowFrequencyContainer = calloc(1, sizeof(EI1_LowFrequencyContainer_t));
cam->cam.camParameters.lowFrequencyContainer->present = LowFrequencyContainer_PR_basicVehicleContainerLowFrequency;
cam->cam.camParameters.lowFrequencyContainer->present = EI1_LowFrequencyContainer_PR_basicVehicleContainerLowFrequency;
BasicVehicleContainerLowFrequency_t* bvc_lf = &cam->cam.camParameters.lowFrequencyContainer->choice.basicVehicleContainerLowFrequency;
EI1_BasicVehicleContainerLowFrequency_t* bvc_lf = &cam->cam.camParameters.lowFrequencyContainer->choice.basicVehicleContainerLowFrequency;
PathHistory_t* ph = &cam->cam.camParameters.lowFrequencyContainer->choice.basicVehicleContainerLowFrequency.pathHistory;
EI1_PathHistory_t* ph = &cam->cam.camParameters.lowFrequencyContainer->choice.basicVehicleContainerLowFrequency.pathHistory;
if (lightship->path_history_len != 0) {
ph->list.array = malloc((lightship->path_history_len) * sizeof(void*));
ph->list.count = lightship->path_history_len;
ph->list.size = (lightship->path_history_len) * sizeof(void*);
ph->list.array[0] = calloc(1,sizeof(PathPoint_t));
ph->list.array[0] = calloc(1,sizeof(EI1_PathPoint_t));
if (lightship->path_history[0]->alt != AltitudeValue_unavailable && pn.alt != AltitudeValue_unavailable) {
if (lightship->path_history[0]->alt != EI1_AltitudeValue_unavailable && pn.alt != EI1_AltitudeValue_unavailable) {
ph->list.array[0]->pathPosition.deltaAltitude = lightship->path_history[0]->alt - pn.alt;
} else {
ph->list.array[0]->pathPosition.deltaAltitude = DeltaAltitude_unavailable;
ph->list.array[0]->pathPosition.deltaAltitude = EI1_DeltaAltitude_unavailable;
}
if (lightship->path_history[0]->lat != Latitude_unavailable && pn.lat != Latitude_unavailable) {
if (lightship->path_history[0]->lat != EI1_Latitude_unavailable && pn.lat != EI1_Latitude_unavailable) {
ph->list.array[0]->pathPosition.deltaLatitude = lightship->path_history[0]->lat - pn.lat;
} else {
ph->list.array[0]->pathPosition.deltaLatitude = DeltaLatitude_unavailable;
ph->list.array[0]->pathPosition.deltaLatitude = EI1_DeltaLatitude_unavailable;
}
if (lightship->path_history[0]->lon != Longitude_unavailable && pn.lon != Longitude_unavailable) {
if (lightship->path_history[0]->lon != EI1_Longitude_unavailable && pn.lon != EI1_Longitude_unavailable) {
ph->list.array[0]->pathPosition.deltaLongitude = lightship->path_history[0]->lon - pn.lon;
} else {
ph->list.array[0]->pathPosition.deltaLongitude = DeltaLongitude_unavailable;
ph->list.array[0]->pathPosition.deltaLongitude = EI1_DeltaLongitude_unavailable;
}
ph->list.array[0]->pathDeltaTime = calloc(1,sizeof(PathDeltaTime_t));
ph->list.array[0]->pathDeltaTime = calloc(1,sizeof(EI1_PathDeltaTime_t));
*ph->list.array[0]->pathDeltaTime = (pn.ts - lightship->path_history[0]->ts)/10;
for (int i = 1; i < lightship->path_history_len; ++i) {
ph->list.array[i] = calloc(1,sizeof(PathPoint_t));
ph->list.array[i] = calloc(1,sizeof(EI1_PathPoint_t));
if (lightship->path_history[i]->alt != AltitudeValue_unavailable && lightship->path_history[i-1]->alt != AltitudeValue_unavailable) {
if (lightship->path_history[i]->alt != EI1_AltitudeValue_unavailable && lightship->path_history[i-1]->alt != EI1_AltitudeValue_unavailable) {
ph->list.array[i]->pathPosition.deltaAltitude = lightship->path_history[i]->alt - lightship->path_history[i-1]->alt;
} else {
ph->list.array[i]->pathPosition.deltaAltitude = DeltaAltitude_unavailable;
ph->list.array[i]->pathPosition.deltaAltitude = EI1_DeltaAltitude_unavailable;
}
if (lightship->path_history[i]->lat != Latitude_unavailable && lightship->path_history[i-1]->lat != Latitude_unavailable) {
if (lightship->path_history[i]->lat != EI1_Latitude_unavailable && lightship->path_history[i-1]->lat != EI1_Latitude_unavailable) {
ph->list.array[i]->pathPosition.deltaLatitude = lightship->path_history[i]->lat - lightship->path_history[i-1]->lat;
} else {
ph->list.array[i]->pathPosition.deltaLatitude = DeltaLatitude_unavailable;
ph->list.array[i]->pathPosition.deltaLatitude = EI1_DeltaLatitude_unavailable;
}
if (lightship->path_history[i]->lon != Longitude_unavailable && lightship->path_history[i-1]->lon != Longitude_unavailable) {
if (lightship->path_history[i]->lon != EI1_Longitude_unavailable && lightship->path_history[i-1]->lon != EI1_Longitude_unavailable) {
ph->list.array[i]->pathPosition.deltaLongitude = lightship->path_history[i]->lon - lightship->path_history[i-1]->lon;
} else {
ph->list.array[i]->pathPosition.deltaLongitude = DeltaLongitude_unavailable;
ph->list.array[i]->pathPosition.deltaLongitude = EI1_DeltaLongitude_unavailable;
}
ph->list.array[i]->pathDeltaTime = calloc(1,sizeof(PathDeltaTime_t));
ph->list.array[i]->pathDeltaTime = calloc(1,sizeof(EI1_PathDeltaTime_t));
*ph->list.array[i]->pathDeltaTime = (lightship->path_history[i-1]->ts - lightship->path_history[i]->ts)/10;
}
}
@ -346,21 +346,21 @@ static int mk_cam(uint8_t *cam_oer, uint16_t *cam_len) {
// Set GPS coordinates
bc->referencePosition.latitude = epv.space.latitude;
bc->referencePosition.longitude = epv.space.longitude;
bc->referencePosition.positionConfidenceEllipse.semiMinorConfidence = SemiAxisLength_unavailable;
bc->referencePosition.positionConfidenceEllipse.semiMajorConfidence = SemiAxisLength_unavailable;
bc->referencePosition.positionConfidenceEllipse.semiMajorOrientation = HeadingValue_unavailable;
bc->referencePosition.positionConfidenceEllipse.semiMinorConfidence = EI1_SemiAxisLength_unavailable;
bc->referencePosition.positionConfidenceEllipse.semiMajorConfidence = EI1_SemiAxisLength_unavailable;
bc->referencePosition.positionConfidenceEllipse.semiMajorOrientation = EI1_HeadingValue_unavailable;
itss_space_unlock();
cam->cam.camParameters.highFrequencyContainer.present = HighFrequencyContainer_PR_rsuContainerHighFrequency;
cam->cam.camParameters.highFrequencyContainer.present = EI1_HighFrequencyContainer_PR_rsuContainerHighFrequency;
if (lightship->protected_zones.pz_len > 0) {
cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU = calloc(1, sizeof(ProtectedCommunicationZonesRSU_t));
ProtectedCommunicationZonesRSU_t *pzs = cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU;
cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU = calloc(1, sizeof(EI1_ProtectedCommunicationZonesRSU_t));
EI1_ProtectedCommunicationZonesRSU_t *pzs = cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU;
pzs->list.count = lightship->protected_zones.pz_len;
pzs->list.size = lightship->protected_zones.pz_len * sizeof(void*);
pzs->list.array = malloc(lightship->protected_zones.pz_len * sizeof(void*));
for (int i = 0; i < lightship->protected_zones.pz_len; ++i) {
pzs->list.array[i] = calloc(1, sizeof(ProtectedCommunicationZone_t));
pzs->list.array[i] = calloc(1, sizeof(EI1_ProtectedCommunicationZone_t));
pzs->list.array[i]->protectedZoneLatitude = lightship->protected_zones.pz[i]->protectedZoneLatitude;
pzs->list.array[i]->protectedZoneLongitude = lightship->protected_zones.pz[i]->protectedZoneLongitude;
pzs->list.array[i]->protectedZoneType = lightship->protected_zones.pz[i]->protectedZoneType;
@ -385,7 +385,7 @@ static int mk_cam(uint8_t *cam_oer, uint16_t *cam_len) {
pthread_mutex_unlock(&lightship->lock);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_CAM, NULL, cam, cam_oer, 512);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_CAM, NULL, cam, cam_oer, 512);
if (enc.encoded == -1) {
log_error("[ca] failed encoding CAM (%s)", enc.failed_type->name);
rv = 1;
@ -394,7 +394,7 @@ static int mk_cam(uint8_t *cam_oer, uint16_t *cam_len) {
*cam_len = (enc.encoded + 7) / 8;
cleanup:
ASN_STRUCT_FREE(asn_DEF_CAM, cam);
ASN_STRUCT_FREE(asn_DEF_EI1_CAM, cam);
return rv;
}
@ -420,7 +420,7 @@ int lightship_check() {
pthread_mutex_lock(&lightship->lock);
if (lightship->type == StationType_roadSideUnit) { // RSU
if (lightship->type == EI1_StationType_roadSideUnit) { // RSU
if (lightship->is_vehicle_near && now > lightship->next_cam_min) {
rv = 1;
}
@ -459,7 +459,7 @@ int lightship_check() {
if (lightship->protected_zones.pz[i]->expiryTime) {
asn_INTEGER2ulong(lightship->protected_zones.pz[i]->expiryTime, (unsigned long long*) &expiry);
if (now >= expiry) {
ASN_STRUCT_FREE(asn_DEF_ProtectedCommunicationZone, lightship->protected_zones.pz[i]);
ASN_STRUCT_FREE(asn_DEF_EI1_ProtectedCommunicationZone, lightship->protected_zones.pz[i]);
for (int j = i; j < lightship->protected_zones.pz_len - 1; ++j) {
lightship->protected_zones.pz[j] = lightship->protected_zones.pz[j+1];
}
@ -483,7 +483,7 @@ void lightship_reset_timer() {
pthread_mutex_lock(&lightship->lock);
if (lightship->type != StationType_roadSideUnit) { // Vehicle
if (lightship->type != EI1_StationType_roadSideUnit) { // Vehicle
lightship->next_cam_max = now + lightship->vehicle_gen_max;
lightship->next_cam_min = now + lightship->vehicle_gen_min;
} else { // RSU
@ -496,7 +496,7 @@ void lightship_reset_timer() {
pthread_mutex_unlock(&lightship->lock);
}
enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp, uint32_t ssp_len) {
enum CAM_CHECK_R check_cam(EIS_BTPPacketIndication_t *bpi, EI1_CAM_t* cam, uint8_t* ssp, uint32_t ssp_len) {
int rv = 0;
lightship_t* lightship = &facilities.lightship;
@ -504,7 +504,7 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
// Check permissions
if (ssp) {
if (cam->cam.camParameters.highFrequencyContainer.present == HighFrequencyContainer_PR_rsuContainerHighFrequency &&
if (cam->cam.camParameters.highFrequencyContainer.present == EI1_HighFrequencyContainer_PR_rsuContainerHighFrequency &&
cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU) {
if (!permissions_check(CID_PROTECTED_ZONES, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
@ -514,30 +514,30 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
}
if (cam->cam.camParameters.specialVehicleContainer) {
switch (cam->cam.camParameters.specialVehicleContainer->present) {
case SpecialVehicleContainer_PR_NOTHING:
case EI1_SpecialVehicleContainer_PR_NOTHING:
break;
case SpecialVehicleContainer_PR_publicTransportContainer:
case EI1_SpecialVehicleContainer_PR_publicTransportContainer:
if (!permissions_check(CID_PUBLIC_TRANSPORT, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_PUBLIC_TRANSPORT].container);
return rv;
}
break;
case SpecialVehicleContainer_PR_specialTransportContainer:
case EI1_SpecialVehicleContainer_PR_specialTransportContainer:
if (!permissions_check(CID_SPECIAL_TRANSPORT, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_SPECIAL_TRANSPORT].container);
return rv;
}
break;
case SpecialVehicleContainer_PR_dangerousGoodsContainer:
case EI1_SpecialVehicleContainer_PR_dangerousGoodsContainer:
if (!permissions_check(CID_DANGEROUS_GOODS, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_DANGEROUS_GOODS].container);
return rv;
}
break;
case SpecialVehicleContainer_PR_roadWorksContainerBasic:
case EI1_SpecialVehicleContainer_PR_roadWorksContainerBasic:
if (!permissions_check(CID_ROADWORK, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_ROADWORK].container);
@ -551,14 +551,14 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
}
}
break;
case SpecialVehicleContainer_PR_rescueContainer:
case EI1_SpecialVehicleContainer_PR_rescueContainer:
if (!permissions_check(CID_RESCUE, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_RESCUE].container);
return rv;
}
break;
case SpecialVehicleContainer_PR_emergencyContainer:
case EI1_SpecialVehicleContainer_PR_emergencyContainer:
if (!permissions_check(CID_EMERGENCY, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_EMERGENCY].container);
@ -584,7 +584,7 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
}
}
break;
case SpecialVehicleContainer_PR_safetyCarContainer:
case EI1_SpecialVehicleContainer_PR_safetyCarContainer:
if (!permissions_check(CID_SAFETY_CAR, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_SAFETY_CAR].container);
@ -592,14 +592,14 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
}
if (cam->cam.camParameters.specialVehicleContainer->choice.safetyCarContainer.trafficRule) {
switch (*cam->cam.camParameters.specialVehicleContainer->choice.safetyCarContainer.trafficRule) {
case TrafficRule_noPassing:
case EI1_TrafficRule_noPassing:
if (!permissions_check(CID_NO_PASSING, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_NO_PASSING].container);
return rv;
}
break;
case TrafficRule_noPassingForTrucks:
case EI1_TrafficRule_noPassingForTrucks:
if (!permissions_check(CID_NO_PASSING_FOR_TRUCKS, ssp, ssp_len)) {
rv = CAM_BAD_PERMISSIONS;
log_debug("[ca] received cam does not have permissions for '%s'", CID_SSP_BM_MAP[CID_NO_PASSING_FOR_TRUCKS].container);
@ -624,17 +624,17 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
}
pthread_mutex_lock(&lightship->lock);
if (lightship->type == StationType_roadSideUnit) {
if (lightship->type == EI1_StationType_roadSideUnit) {
// Send CAMs if vehicles nearby
if (bpi->stationType != StationType_roadSideUnit && bpi->isNeighbour) {
if (bpi->stationType != EI1_StationType_roadSideUnit && bpi->isNeighbour) {
lightship->t_last_vehicle = now;
lightship->is_vehicle_near = true;
}
} else {
// Protected zones
if (cam->cam.camParameters.basicContainer.stationType == StationType_roadSideUnit &&
if (cam->cam.camParameters.basicContainer.stationType == EI1_StationType_roadSideUnit &&
cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU) {
ProtectedCommunicationZonesRSU_t *pzs = cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU;
EI1_ProtectedCommunicationZonesRSU_t *pzs = cam->cam.camParameters.highFrequencyContainer.choice.rsuContainerHighFrequency.protectedCommunicationZonesRSU;
if (pzs->list.count > 0 && pzs->list.count + lightship->protected_zones.pz_len < 255) {
bool new_pz = false;
@ -652,7 +652,7 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
new_pz = true;
lightship->protected_zones.pz[lightship->protected_zones.pz_len] = calloc(1, sizeof(ProtectedCommunicationZone_t));
lightship->protected_zones.pz[lightship->protected_zones.pz_len] = calloc(1, sizeof(EI1_ProtectedCommunicationZone_t));
lightship->protected_zones.pz[lightship->protected_zones.pz_len]->protectedZoneLatitude = pzs->list.array[k]->protectedZoneLatitude;
lightship->protected_zones.pz[lightship->protected_zones.pz_len]->protectedZoneLongitude = pzs->list.array[k]->protectedZoneLongitude;
lightship->protected_zones.pz[lightship->protected_zones.pz_len]->protectedZoneType = pzs->list.array[k]->protectedZoneType;
@ -676,20 +676,20 @@ enum CAM_CHECK_R check_cam(BTPPacketIndication_t *bpi, CAM_t* cam, uint8_t* ssp,
// Inform [management]
if (new_pz) {
uint8_t b_oer[512];
ManagementRequest_t* mreq = calloc(1, sizeof(ManagementRequest_t));
mreq->present = ManagementRequest_PR_attributes;
mreq->choice.attributes.present = ManagementRequestAttributes_PR_set;
mreq->choice.attributes.choice.set.protectedZones = calloc(1, sizeof(struct protectedZones));
EIS_ManagementRequest_t* mreq = calloc(1, sizeof(EIS_ManagementRequest_t));
mreq->present = EIS_ManagementRequest_PR_attributes;
mreq->choice.attributes.present = EIS_ManagementRequestAttributes_PR_set;
mreq->choice.attributes.choice.set.protectedZones = calloc(1, sizeof(struct EIS_protectedZones));
mreq->choice.attributes.choice.set.protectedZones->list.count = lightship->protected_zones.pz_len;
mreq->choice.attributes.choice.set.protectedZones->list.size = lightship->protected_zones.pz_len * sizeof(void*);
mreq->choice.attributes.choice.set.protectedZones->list.array = calloc(lightship->protected_zones.pz_len, sizeof(void*));
for (int p = 0; p < lightship->protected_zones.pz_len; ++p) {
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_ProtectedCommunicationZone, NULL, lightship->protected_zones.pz[p], b_oer, 512);
oer_decode(NULL, &asn_DEF_ProtectedCommunicationZone, (void**) &mreq->choice.attributes.choice.set.protectedZones->list.array[p], b_oer, enc.encoded);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_ProtectedCommunicationZone, NULL, lightship->protected_zones.pz[p], b_oer, 512);
oer_decode(NULL, &asn_DEF_EIS_ProtectedCommunicationZone, (void**) &mreq->choice.attributes.choice.set.protectedZones->list.array[p], b_oer, enc.encoded);
}
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_ManagementRequest, NULL, mreq, b_oer, 512);
ASN_STRUCT_FREE(asn_DEF_ManagementRequest, mreq);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_ManagementRequest, NULL, mreq, b_oer, 512);
ASN_STRUCT_FREE(asn_DEF_EIS_ManagementRequest, mreq);
void* management_socket = itss_0connect(facilities.zmq.management_address, ZMQ_REQ);
itss_0send(management_socket, b_oer, enc.encoded);
log_debug("[ca]-> sending MReq.attributes.set.protectedZones to ->[management]");
@ -739,23 +739,23 @@ static int check_pz() {
void* ca_service() {
int rv = 0;
NetworkingRequest_t* nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
EIS_NetworkingRequest_t* nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->network.choice.gn.trafficClass = 2;
npr->network.choice.gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) {
npr->network.choice.gn.destinationAddress.buf[i] = 0xff;
}
npr->network.choice.gn.destinationAddress.size = 6;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.securityProfile.sign = true;
npr->transport.present = NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = BTPType_btpB;
npr->transport.choice.btp.destinationPort = Port_cam;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = EIS_BTPType_btpB;
npr->transport.choice.btp.destinationPort = EIS_Port_cam;
if (facilities.edm.enabled) {
npr->transport.choice.btp.destinationPortInfo = calloc(1, sizeof(OCTET_STRING_t));
npr->transport.choice.btp.destinationPortInfo->size = 2;
@ -768,10 +768,10 @@ void* ca_service() {
// 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;
fmi->itsMessageType = ItsMessageType_cam;
EIS_FacilitiesIndication_t* fi = calloc(1,sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_message;
EIS_FacilitiesMessageIndication_t* fmi = &fi->choice.message;
fmi->itsMessageType = EIS_ItsMessageType_cam;
fmi->data.buf = malloc(buf_len);
uint8_t nr_oer[buf_len];
@ -788,7 +788,7 @@ void* ca_service() {
}
if (facilities.edm.enabled) {
edm_encap(npr->data.buf, (uint16_t*) &npr->data.size, buf_len, Port_cam);
edm_encap(npr->data.buf, (uint16_t*) &npr->data.size, buf_len, EIS_Port_cam);
}
memcpy(fmi->data.buf, npr->data.buf, npr->data.size);
@ -802,13 +802,13 @@ void* ca_service() {
npr->id = id;
fmi->id = id;
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_NetworkingRequest, NULL, nr, nr_oer+1, 1023);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_NetworkingRequest, NULL, nr, nr_oer+1, 1023);
if (enc.encoded == -1) {
log_error("encoding TR for cam failed");
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_EIS_FacilitiesIndication, NULL, fi, fi_oer+1, 1023);
if(enc_fdi.encoded == -1){
log_error("encoding FI for cam failed");
continue;
@ -825,7 +825,7 @@ void* ca_service() {
pthread_mutex_lock(&facilities.id.lock);
uint32_t station_id = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
itss_db_add(facilities.logging.dbms, station_id, npr->id, true, messageID_cam, NULL, npr->data.buf, npr->data.size);
itss_db_add(facilities.logging.dbms, station_id, npr->id, true, EI1_messageID_cam, NULL, npr->data.buf, npr->data.size);
}
if (facilities.logging.recorder) {
@ -848,8 +848,8 @@ void* ca_service() {
}
ASN_STRUCT_FREE(asn_DEF_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesIndication, fi);
return NULL;
}

View File

@ -6,8 +6,8 @@
#include <pthread.h>
#include <stdbool.h>
#include <it2s-asn/camv2/CAM.h>
#include <it2s-asn/itss-networking/NetworkingIndication.h>
#include <it2s-asn/etsi-its-v1/cam/EI1_CAM.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingIndication.h>
#include <it2s-tender/epv.h>
@ -84,7 +84,7 @@ typedef struct lightship {
uint32_t rsu_vehicle_permanence;
struct {
ProtectedCommunicationZone_t ** pz;
EI1_ProtectedCommunicationZone_t ** pz;
uint16_t pz_len;
} protected_zones;
@ -116,7 +116,7 @@ void lightship_reset_timer();
*
* @return A CAM check code
*/
enum CAM_CHECK_R check_cam(BTPPacketIndication_t* bpi, CAM_t* cam,uint8_t* ssp, uint32_t ssp_len);
enum CAM_CHECK_R check_cam(EIS_BTPPacketIndication_t* bpi, EI1_CAM_t* cam,uint8_t* ssp, uint32_t ssp_len);
/*
* @brief Main CA service

View File

@ -12,16 +12,16 @@
#include <it2s-config/t2c-etsi-its.h>
#include <dirent.h>
#include <sys/time.h>
#include <it2s-asn/camv2/ProtectedCommunicationZone.h>
#include <it2s-asn/tpm/TollingPaymentInfo.h>
#include <it2s-asn/etsi-its-sdu/cdd-1.3.1/EIS_ProtectedCommunicationZone.h>
#include <it2s-asn/etsi-its-v1/tpm/EI1_TollingPaymentInfo.h>
#include <zmq.h>
#include <it2s-tender/packet.h>
#include <it2s-asn/itss-management/ManagementRequest.h>
#include <it2s-asn/itss-management/ManagementReply.h>
#include <it2s-asn/itss-security/SecurityRequest.h>
#include <it2s-asn/itss-security/SecurityReply.h>
#include <it2s-asn/etsi-its-sdu/itss-management/EIS_ManagementRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-management/EIS_ManagementReply.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityReply.h>
static int fetch_target_address(char** addresses, uint16_t addresses_len) {
int index = -1;
@ -239,20 +239,20 @@ int facilities_config() {
if (facilities.id.change.random) {
// Ask [security] for station id
SecurityRequest_t* sREQ = calloc(1, sizeof(SecurityRequest_t));
SecurityReply_t* sREP = NULL;
EIS_SecurityRequest_t* sREQ = calloc(1, sizeof(EIS_SecurityRequest_t));
EIS_SecurityReply_t* sREP = NULL;
sREQ->present = SecurityRequest_PR_ids;
sREQ->present = EIS_SecurityRequest_PR_ids;
sREQ->choice.ids.list.count = 2;
sREQ->choice.ids.list.size = 2*sizeof(void*);
sREQ->choice.ids.list.array = malloc(2*sizeof(void*));
sREQ->choice.ids.list.array[0] = calloc(1, sizeof(SecurityIdType_t));
*sREQ->choice.ids.list.array[0] = SecurityIdType_stationId;
sREQ->choice.ids.list.array[1] = calloc(1, sizeof(SecurityIdType_t));
*sREQ->choice.ids.list.array[1] = SecurityIdType_ipv6Address;
sREQ->choice.ids.list.array[0] = calloc(1, sizeof(EIS_SecurityIdType_t));
*sREQ->choice.ids.list.array[0] = EIS_SecurityIdType_stationId;
sREQ->choice.ids.list.array[1] = calloc(1, sizeof(EIS_SecurityIdType_t));
*sREQ->choice.ids.list.array[1] = EIS_SecurityIdType_ipv6Address;
uint8_t b_tx[256], b_rx[256];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_SecurityRequest, NULL, sREQ, b_tx, 256);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_SecurityRequest, NULL, sREQ, b_tx, 256);
void* ss = itss_0connect(facilities.zmq.security_address, ZMQ_REQ);
itss_0send(ss, b_tx, enc.encoded);
@ -263,19 +263,19 @@ int facilities_config() {
goto cleanup;
}
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_SecurityReply, (void**) &sREP, b_rx, 256);
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_EIS_SecurityReply, (void**) &sREP, b_rx, 256);
if (sREP->returnCode == SecurityReplyReturnCode_rejected) {
if (sREP->returnCode == EIS_SecurityReplyReturnCode_rejected) {
// TODO handle it
goto cleanup;
}
for (int i = 0; i < sREP->data->choice.ids.list.count; ++i) {
switch (sREP->data->choice.ids.list.array[i]->present) {
case SecurityId_PR_stationId:
case EIS_SecurityId_PR_stationId:
facilities.id.station_id = sREP->data->choice.ids.list.array[i]->choice.stationId;
break;
case SecurityId_PR_ipv6Address:
case EIS_SecurityId_PR_ipv6Address:
memcpy(facilities.id.ipv6_addr, sREP->data->choice.ids.list.array[i]->choice.ipv6Address.buf, 16);
break;
default:
@ -283,8 +283,8 @@ int facilities_config() {
}
}
ASN_STRUCT_FREE(asn_DEF_SecurityRequest, sREQ);
ASN_STRUCT_FREE(asn_DEF_SecurityReply, sREP);
ASN_STRUCT_FREE(asn_DEF_EIS_SecurityRequest, sREQ);
ASN_STRUCT_FREE(asn_DEF_EIS_SecurityReply, sREP);
} else {
facilities.id.station_id = itss_cfg->security.identity.station_id;
@ -414,17 +414,17 @@ int facilities_config() {
}
fclose(fp);
ProtectedCommunicationZone_t *zone = calloc(1, sizeof(ProtectedCommunicationZone_t));
EIS_ProtectedCommunicationZone_t *zone = calloc(1, sizeof(EIS_ProtectedCommunicationZone_t));
asn_dec_rval_t dec = xer_decode(NULL, &asn_DEF_ProtectedCommunicationZone, (void**) &zone, pz_xml, size);
asn_dec_rval_t dec = xer_decode(NULL, &asn_DEF_EIS_ProtectedCommunicationZone, (void**) &zone, pz_xml, size);
if (!dec.code) {
facilities.lightship.protected_zones.pz[i] = zone;
facilities.lightship.protected_zones.pz[i] = (EI1_ProtectedCommunicationZone_t*)zone;
++facilities.lightship.protected_zones.pz_len;
++i;
log_debug("[config] loaded protection zone @ (%lld, %lld)", zone->protectedZoneLatitude, zone->protectedZoneLongitude);
} else {
log_error("[config] failure to decode protection zone '%s'", dir->d_name);
ASN_STRUCT_FREE(asn_DEF_ProtectedCommunicationZone, zone);
ASN_STRUCT_FREE(asn_DEF_EIS_ProtectedCommunicationZone, zone);
}
}
@ -460,9 +460,9 @@ int facilities_config() {
}
fclose(fp);
TollingPaymentInfo_t *ti = calloc(1, sizeof(TollingPaymentInfo_t));
EI1_TollingPaymentInfo_t *ti = calloc(1, sizeof(EI1_TollingPaymentInfo_t));
asn_dec_rval_t dec = xer_decode(NULL, &asn_DEF_TollingPaymentInfo, (void**) &ti, ti_xml, size);
asn_dec_rval_t dec = xer_decode(NULL, &asn_DEF_EI1_TollingPaymentInfo, (void**) &ti, ti_xml, size);
if (!dec.code) {
facilities.tolling.infos.z[i] = calloc(1, sizeof(tolling_info_t));
facilities.tolling.infos.z[i]->asn = ti;
@ -470,11 +470,11 @@ int facilities_config() {
++i;
log_debug("[config] loaded tolling info | id:%lld type:%s",
ti->id,
ti->tollType==TollType_entry ? "entry": ti->tollType==TollType_exit ? "exit": "single"
ti->tollType==EI1_TollType_entry ? "entry": ti->tollType==EI1_TollType_exit ? "exit": "single"
);
} else {
log_error("[config] failure to decode tolling info '%s'", dir->d_name);
ASN_STRUCT_FREE(asn_DEF_TollingPaymentInfo, ti);
ASN_STRUCT_FREE(asn_DEF_EI1_TollingPaymentInfo, ti);
}
}
@ -486,9 +486,9 @@ int facilities_config() {
facilities.edm.enabled = itss_cfg->applications.extensions.enabled;
ManagementRequest_t* mreq = calloc(1, sizeof(ManagementRequest_t));
mreq->present = ManagementRequest_PR_attributes;
mreq->choice.attributes.present = ManagementRequestAttributes_PR_get;
EIS_ManagementRequest_t* mreq = calloc(1, sizeof(EIS_ManagementRequest_t));
mreq->present = EIS_ManagementRequest_PR_attributes;
mreq->choice.attributes.present = EIS_ManagementRequestAttributes_PR_get;
mreq->choice.attributes.choice.get.coordinates = 1;
mreq->choice.attributes.choice.get.altitude = 1;
mreq->choice.attributes.choice.get.heading = 1;
@ -501,7 +501,7 @@ int facilities_config() {
mreq->choice.attributes.choice.get.trajectory = etsi_its_cfg->facilities.mcm.activate;
void* management_socket = itss_0connect(facilities.zmq.management_address, ZMQ_REQ);
uint8_t b_tx[256], b_rx[256];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_ManagementRequest, NULL, mreq, b_tx, 256);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_ManagementRequest, NULL, mreq, b_tx, 256);
itss_0send(management_socket, b_tx, enc.encoded);
int rl = itss_0recv_rt(&management_socket, b_rx, 256, b_tx, 256, -1);
@ -511,10 +511,10 @@ int facilities_config() {
goto cleanup;
}
ManagementReply_t* mrep = calloc(1, sizeof(ManagementReply_t));
oer_decode(NULL, &asn_DEF_ManagementReply, (void**) &mrep, b_rx, 256);
EIS_ManagementReply_t* mrep = calloc(1, sizeof(EIS_ManagementReply_t));
oer_decode(NULL, &asn_DEF_EIS_ManagementReply, (void**) &mrep, b_rx, 256);
long lat, lon, alt, alt_conf;
if (mrep->returnCode == ManagementReplyReturnCode_accepted &&
if (mrep->returnCode == EIS_ManagementReplyReturnCode_accepted &&
mrep->data &&
mrep->data->choice.attributes.coordinates &&
mrep->data->choice.attributes.altitude &&
@ -557,8 +557,8 @@ int facilities_config() {
rv = 1;
goto cleanup;
}
ASN_STRUCT_FREE(asn_DEF_ManagementRequest, mreq);
ASN_STRUCT_FREE(asn_DEF_ManagementReply, mrep);
ASN_STRUCT_FREE(asn_DEF_EIS_ManagementRequest, mreq);
ASN_STRUCT_FREE(asn_DEF_EIS_ManagementReply, mrep);
if (etsi_its_cfg->facilities.saem.activate) { // TODO handle various services
facilities.bulletin.to_provide_len = 1;

View File

@ -1,12 +1,12 @@
#include "cpm.h"
#include "facilities.h"
#include <it2s-asn/cpm/CPM.h>
#include <it2s-asn/itss-networking/NetworkingRequest.h>
#include <it2s-asn/etsi-its-v1/cpm/EI1_CPM.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingRequest.h>
#include <math.h>
#include <signal.h>
#include <unistd.h>
#include <it2s-asn/itss-facilities/FacilitiesIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesIndication.h>
#include <arpa/inet.h>
#include <stdbool.h>
@ -479,9 +479,9 @@ long rotate_y(long x, long y) {
return (long)(x * roadRotationSin + y * roadRotationCos);
}
static void set_values(int i, int j, uint64_t timestamp, CPM_t* cpm_tx, long history_list[NOF_OBJECTS][4], int valid_array[], uint64_t history_timestamp[]){
static void set_values(int i, int j, uint64_t timestamp, EI1_CPM_t* cpm_tx, long history_list[NOF_OBJECTS][4], int valid_array[], uint64_t history_timestamp[]){
/* Fill CPM */
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j] = calloc(1, sizeof(PerceivedObject_t));
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j] = calloc(1, sizeof(EI1_PerceivedObject_t));
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->objectID = (long)as_objects[i].u8_objectID;
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->timeOfMeasurement = 0; //Sem informaçao do radar
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->objectConfidence = 95;
@ -497,46 +497,46 @@ static void set_values(int i, int j, uint64_t timestamp, CPM_t* cpm_tx, long his
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->ySpeed.value = rotate_y(
(long)as_objects[i].f_xSpeed * 100, (long)as_objects[i].f_ySpeed * 100);
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->ySpeed.confidence = 40;
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->objectRefPoint = ObjectRefPoint_bottomMid;
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->objectRefPoint = EI1_ObjectRefPoint_bottomMid;
/* Detected Object Class*/
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->classification = calloc(1, sizeof(ObjectClassDescription_t));
ObjectClassDescription_t *class = cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->classification;
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->classification = calloc(1, sizeof(EI1_ObjectClassDescription_t));
EI1_ObjectClassDescription_t *class = cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array[j]->classification;
class->list.size = 1 * sizeof(void*);
class->list.array = malloc(1* sizeof(void*));
class->list.count = 1;
class->list.array[0] = calloc(1, sizeof(ObjectClass_t));
class->list.array[0] = calloc(1, sizeof(EI1_ObjectClass_t));
class->list.array[0]->confidence = 0;
int obj_len = (int)(as_objects[i].f_objectLength*10);
if (obj_len == 10) {
class->list.array[0]->Class.present = class_PR_person;
class->list.array[0]->Class.present = EI1_class_PR_person;
class->list.array[0]->Class.choice.person.type = 1; // pedestrian
class->list.array[0]->Class.choice.person.confidence = 0;
} else if (obj_len == 16) {
class->list.array[0]->Class.present = class_PR_person;
class->list.array[0]->Class.present = EI1_class_PR_person;
class->list.array[0]->Class.choice.person.type = 3; // cyclist
class->list.array[0]->Class.choice.person.confidence = 0;
} else if (obj_len == 26) {
class->list.array[0]->Class.present = class_PR_vehicle;
class->list.array[0]->Class.present = EI1_class_PR_vehicle;
class->list.array[0]->Class.choice.vehicle.type = 2; // motorcycle
class->list.array[0]->Class.choice.vehicle.confidence = 0;
} else if (obj_len >= 46 && obj_len <= 54) {
class->list.array[0]->Class.present = class_PR_vehicle;
class->list.array[0]->Class.present = EI1_class_PR_vehicle;
class->list.array[0]->Class.choice.vehicle.type = 3; // passenger car
class->list.array[0]->Class.choice.vehicle.confidence = 0;
} else if (obj_len >= 56 && obj_len <= 88) {
class->list.array[0]->Class.present = class_PR_vehicle;
class->list.array[0]->Class.present = EI1_class_PR_vehicle;
class->list.array[0]->Class.choice.vehicle.type = 5; // light truck
class->list.array[0]->Class.choice.vehicle.confidence = 0;
} else if (obj_len >= 90) {
class->list.array[0]->Class.present = class_PR_vehicle;
class->list.array[0]->Class.present = EI1_class_PR_vehicle;
class->list.array[0]->Class.choice.vehicle.type = 6; // heavy truck
class->list.array[0]->Class.choice.vehicle.confidence = 0;
} else {
class->list.array[0]->Class.present = class_PR_other;
class->list.array[0]->Class.present = EI1_class_PR_other;
class->list.array[0]->Class.choice.other.type = 0; // unknown
class->list.array[0]->Class.choice.other.confidence = 0;
}
@ -554,7 +554,7 @@ static void set_values(int i, int j, uint64_t timestamp, CPM_t* cpm_tx, long his
static int mk_cpm(uint8_t *bdr_oer, uint32_t *bdr_len, uint8_t *fdi_oer, uint32_t *fdi_len, long history_list[NOF_OBJECTS][4], int valid_array[], uint64_t history_timestamp[]) {
/* Variables */
CPM_t* cpm_tx = calloc(1, sizeof(CPM_t));
EI1_CPM_t* cpm_tx = calloc(1, sizeof(EI1_CPM_t));
long euclidian_dist, abs_speed, abs_speed_hist, angle, angle_hist, angle_diff;
int j = 0, rv = 0;
@ -579,41 +579,41 @@ static int mk_cpm(uint8_t *bdr_oer, uint32_t *bdr_len, uint8_t *fdi_oer, uint32_
itss_space_unlock();
cpm_tx->cpm.generationDeltaTime = generationDeltaTime;
cpm_tx->cpm.cpmParameters.managementContainer.stationType = StationType_roadSideUnit;
cpm_tx->cpm.cpmParameters.managementContainer.stationType = EI1_StationType_roadSideUnit;
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.latitude = lat;
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.longitude = lon;
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.positionConfidenceEllipse.semiMajorConfidence = 100; // TODO
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.positionConfidenceEllipse.semiMinorConfidence = 100; // TODO
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.positionConfidenceEllipse.semiMajorOrientation = HeadingValue_wgs84North; // TODO
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.positionConfidenceEllipse.semiMajorOrientation = EI1_HeadingValue_wgs84North; // TODO
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.altitude.altitudeValue = alt;
cpm_tx->cpm.cpmParameters.managementContainer.referencePosition.altitude.altitudeConfidence = alt_conf;
if(dissemination_check(0) == 1){ /* Sensor Information Container Inclusion Management */
cpm_tx->cpm.cpmParameters.sensorInformationContainer = calloc(1, sizeof(SensorInformationContainer_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer = calloc(1, sizeof(EI1_SensorInformationContainer_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.count = 1;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.size = 1;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array = calloc(1, sizeof(SensorInformation_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0] = calloc(1, sizeof(SensorInformation_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array = calloc(1, sizeof(EI1_SensorInformation_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0] = calloc(1, sizeof(EI1_SensorInformation_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->sensorID = 0;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->type = SensorType_radar;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.present = DetectionArea_PR_stationarySensorRadial;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->type = EI1_SensorType_radar;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.present = EI1_DetectionArea_PR_stationarySensorRadial;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.range = 3400;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.stationaryHorizontalOpeningAngleStart = facilities.dissemination.opening_angle_start;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.stationaryHorizontalOpeningAngleEnd = facilities.dissemination.opening_angle_end;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.verticalOpeningAngleStart = calloc(1, sizeof(CartesianAngleValue_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.verticalOpeningAngleStart = calloc(1, sizeof(EI1_CartesianAngleValue_t));
(*cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.verticalOpeningAngleStart) = 1730;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.verticalOpeningAngleEnd = calloc(1, sizeof(CartesianAngleValue_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.verticalOpeningAngleEnd = calloc(1, sizeof(EI1_CartesianAngleValue_t));
(*cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.verticalOpeningAngleEnd) = 1890;
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.sensorHeight = calloc(1, sizeof(SensorHeight_t));
cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.sensorHeight = calloc(1, sizeof(EI1_SensorHeight_t));
(*cpm_tx->cpm.cpmParameters.sensorInformationContainer->list.array[0]->detectionArea.choice.stationarySensorRadial.sensorHeight) = 600;
dissemination_reset_timer(0);
}
if (s_objectControl.u8_numberOfObjects > 0) {
cpm_tx->cpm.cpmParameters.perceivedObjectContainer = calloc(1, sizeof(PerceivedObjectContainer_t));
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array = calloc(s_objectControl.u8_numberOfObjects,sizeof(PerceivedObject_t*));
cpm_tx->cpm.cpmParameters.perceivedObjectContainer = calloc(1, sizeof(EI1_PerceivedObjectContainer_t));
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.array = calloc(s_objectControl.u8_numberOfObjects,sizeof(EI1_PerceivedObject_t*));
cpm_tx->cpm.cpmParameters.perceivedObjectContainer->list.count = s_objectControl.u8_numberOfObjects;
@ -663,7 +663,7 @@ static int mk_cpm(uint8_t *bdr_oer, uint32_t *bdr_len, uint8_t *fdi_oer, uint32_
//BDR
memset(bdr_oer, 0, 1500);
asn_enc_rval_t retval_enc_bdr = uper_encode_to_buffer(&asn_DEF_CPM, NULL, cpm_tx, bdr_oer, 1500);
asn_enc_rval_t retval_enc_bdr = uper_encode_to_buffer(&asn_DEF_EI1_CPM, NULL, cpm_tx, bdr_oer, 1500);
if (retval_enc_bdr.encoded == -1) {
log_error("[cp] failed encoding CPM (%s)", retval_enc_bdr.failed_type->name);
rv = 1;
@ -674,7 +674,7 @@ static int mk_cpm(uint8_t *bdr_oer, uint32_t *bdr_len, uint8_t *fdi_oer, uint32_
//FDI
memset(fdi_oer, 0, 1500);
asn_enc_rval_t retval_enc_fdi = uper_encode_to_buffer(&asn_DEF_CPM, NULL, cpm_tx, fdi_oer, 1500);
asn_enc_rval_t retval_enc_fdi = uper_encode_to_buffer(&asn_DEF_EI1_CPM, NULL, cpm_tx, fdi_oer, 1500);
if (retval_enc_fdi.encoded == -1) {
log_error("[cp] failed encoding CPM (%s)", retval_enc_fdi.failed_type->name);
rv = 1;
@ -684,7 +684,7 @@ static int mk_cpm(uint8_t *bdr_oer, uint32_t *bdr_len, uint8_t *fdi_oer, uint32_
*fdi_len = ((retval_enc_fdi.encoded + 7) / 8);
cleanup:
ASN_STRUCT_FREE(asn_DEF_CPM, cpm_tx);
ASN_STRUCT_FREE(asn_DEF_EI1_CPM, cpm_tx);
return rv;
}
@ -708,27 +708,27 @@ void *cp_service(){
tr_oer[0] = 4; //Facilities
fi_oer[0] = 4;
NetworkingRequest_t* nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
EIS_NetworkingRequest_t* nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->network.choice.gn.trafficClass = 2;
npr->network.choice.gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) {
npr->network.choice.gn.destinationAddress.buf[i] = 0xff;
}
npr->network.choice.gn.destinationAddress.size = 6;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.securityProfile.sign = true;
npr->transport.present = NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = BTPType_btpB;
npr->transport.choice.btp.destinationPort = Port_cpm;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = EIS_BTPType_btpB;
npr->transport.choice.btp.destinationPort = EIS_Port_cpm;
FacilitiesIndication_t* fi = calloc(1, sizeof(FacilitiesIndication_t));
fi->present = FacilitiesIndication_PR_message;
FacilitiesMessageIndication_t* fmi = &fi->choice.message;
EIS_FacilitiesIndication_t* fi = calloc(1, sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_message;
EIS_FacilitiesMessageIndication_t* fmi = &fi->choice.message;
roadRotationSin = sin(((facilities.dissemination.radar_rotation + 90.0) * PI) / 180);
roadRotationCos = cos(((facilities.dissemination.radar_rotation + 90.0) * PI) / 180);
@ -737,7 +737,7 @@ void *cp_service(){
npr->data.buf = malloc(1500); //CPM Data to be sent to the Networking layer
/*--- Fill mandatory Facilities Message Indication parameters ---*/
fmi->itsMessageType = ItsMessageType_cpm;
fmi->itsMessageType = EIS_ItsMessageType_cpm;
fmi->data.buf = malloc(1500);
/* Creating sockets and waiting for radar to connect*/
@ -768,14 +768,14 @@ void *cp_service(){
fmi->id = id;
/* Encode NetworkingRequest */
asn_enc_rval_t enc_tdr = oer_encode_to_buffer(&asn_DEF_NetworkingRequest, NULL, nr, tr_oer+1, 2047);
asn_enc_rval_t enc_tdr = oer_encode_to_buffer(&asn_DEF_EIS_NetworkingRequest, NULL, nr, tr_oer+1, 2047);
if(enc_tdr.encoded == -1){
log_error("encoding TR for cpm failed");
continue;
}
/* Encode FacilitiesIndication */
asn_enc_rval_t enc_fdi = oer_encode_to_buffer(&asn_DEF_FacilitiesIndication, NULL, fi, fi_oer+1, 2047);
asn_enc_rval_t enc_fdi = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesIndication, NULL, fi, fi_oer+1, 2047);
if(enc_fdi.encoded == -1){
log_error("encoding FI for cpm failed");
continue;
@ -820,8 +820,8 @@ void *cp_service(){
}
}
ASN_STRUCT_FREE(asn_DEF_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesIndication, fi);
/* Close sockets */
if(facilities.dissemination.tmc_connect)

View File

@ -5,7 +5,7 @@
#include <arpa/inet.h>
#include <stdbool.h>
#include <it2s-asn/cpm/CPM.h>
#include <it2s-asn/etsi-its-v1/cpm/EI1_CPM.h>
#include <termios.h>
#include <unistd.h>
#include <time.h>

View File

@ -67,7 +67,7 @@ static int permissions_check(int cause_code, uint8_t* permissions, uint8_t permi
}
static enum EVENT_CHECK_R event_check(DENM_t *denm, uint8_t* ssp, uint32_t ssp_len) {
static enum EVENT_CHECK_R event_check(EI1_DENM_t *denm, uint8_t* ssp, uint32_t ssp_len) {
int rv = 0;
den_t* den = &facilities.den;
@ -155,7 +155,7 @@ static enum EVENT_CHECK_R event_check(DENM_t *denm, uint8_t* ssp, uint32_t ssp_l
return EVENT_NEW;
}
static int event_add(DENM_t *denm, uint64_t* id) {
static int event_add(EI1_DENM_t *denm, uint64_t* id) {
den_t* den = &facilities.den;
uint64_t now = itss_time_get();
@ -226,7 +226,7 @@ static int event_add(DENM_t *denm, uint64_t* id) {
else return 0; // Event added to db
}
static int event_update(DENM_t *denm, uint64_t* id) {
static int event_update(EI1_DENM_t *denm, uint64_t* id) {
den_t* den = &facilities.den;
uint64_t now = itss_time_get();
@ -300,7 +300,7 @@ static int event_update(DENM_t *denm, uint64_t* id) {
den->events[index]->latitude = denm->denm.management.eventPosition.latitude;
den->events[index]->longitude = denm->denm.management.eventPosition.longitude;
ASN_STRUCT_FREE(asn_DEF_DENM, den->events[index]->denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, den->events[index]->denm);
den->events[index]->denm = denm;
}
@ -310,30 +310,30 @@ static int event_update(DENM_t *denm, uint64_t* id) {
else return 0; // Event updated
}
enum EVENT_CHECK_R event_manage(DENM_t *denm, uint64_t* id, uint8_t* ssp, uint32_t ssp_len) {
enum EVENT_CHECK_R event_manage(EI1_DENM_t *denm, uint64_t* id, uint8_t* ssp, uint32_t ssp_len) {
int rv = 0;
switch (rv = event_check(denm, ssp, ssp_len)) {
case EVENT_NEW:
log_debug("[den] new event received");
if (event_add(denm, id)) {
log_debug("[den] failed adding event, max events reached");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
rv = -1;
}
break;
case EVENT_INVALID:
log_debug("[den] invalid event received, ignoring");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
break;
case EVENT_PASSED:
log_debug("[den] old event received, ignoring");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
break;
case EVENT_CANCELLATION:
log_debug("[den] event cancellation received");
if (event_update(denm, id)) {
log_debug("[den] failed cancelling event, event not found");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
rv = EVENT_NUMBER_EXCEEDED;
}
break;
@ -341,7 +341,7 @@ enum EVENT_CHECK_R event_manage(DENM_t *denm, uint64_t* id, uint8_t* ssp, uint32
log_debug("[den] event negation received");
if (event_update(denm, id)) {
log_debug("[den] failed negating event, event not found");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
rv = EVENT_NUMBER_EXCEEDED;
}
break;
@ -349,21 +349,21 @@ enum EVENT_CHECK_R event_manage(DENM_t *denm, uint64_t* id, uint8_t* ssp, uint32
log_debug("[den] event update received");
if (event_update(denm, id)) {
log_debug("[den] failed updating event, event not found");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
rv = EVENT_NUMBER_EXCEEDED;
}
break;
case EVENT_REPEATED:
log_debug("[den] repeated event received or referenceTime doesn't allow an update, ignoring");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
break;
case EVENT_NUMBER_EXCEEDED:
log_debug("[den] max events reached, ignoring");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
break;
case EVENT_BAD_PERMISSIONS:
log_debug("[den] permisisons check failed for the received event, ignoring");
ASN_STRUCT_FREE(asn_DEF_DENM, denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, denm);
break;
}
return rv;
@ -398,7 +398,7 @@ void* den_service() {
log_debug("[den] removed event %d (expiration)", i);
den->events[i]->enabled = false;
ASN_STRUCT_FREE(asn_DEF_DENM, den->events[i]->denm);
ASN_STRUCT_FREE(asn_DEF_EI1_DENM, den->events[i]->denm);
switch (den->events[i]->state) {
case EVENT_ACTIVE:
--den->n_active_events;

View File

@ -2,7 +2,7 @@
#define FACILITIES_DENM_H
#include <stdint.h>
#include <it2s-asn/denmv2/DENM.h>
#include <it2s-asn/etsi-its-v1/denm/EI1_DENM.h>
#include <pthread.h>
#include <stdbool.h>
@ -16,7 +16,7 @@ enum EVENT_STATE {
typedef struct event {
uint64_t id;
DENM_t *denm;
EI1_DENM_t *denm;
uint32_t station_id;
uint32_t sn;
uint64_t detection_time;
@ -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(DENM_t* denm, uint64_t* id, uint8_t* ssp, uint32_t ssp_len);
enum EVENT_CHECK_R event_manage(EI1_DENM_t* denm, uint64_t* id, uint8_t* ssp, uint32_t ssp_len);
int den_init();
void* den_service();

View File

@ -1,28 +1,28 @@
#include "edm.h"
#include "facilities.h"
#include <it2s-asn/itss-facilities/FacilitiesIndication.h>
#include <it2s-asn/itss-facilities/FacilitiesResponse.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesResponse.h>
#include <it2s-tender/packet.h>
int edm_encap(uint8_t* msg, uint16_t* msg_len, uint16_t msg_buf_len, int its_msg_type) {
edm_t* edm = &facilities.edm;
int rv = 0;
FacilitiesIndication_t* fi = NULL;
FacilitiesResponse_t* fr = NULL;
EIS_FacilitiesIndication_t* fi = NULL;
EIS_FacilitiesResponse_t* fr = NULL;
uint16_t b_len = 1380;
uint8_t b1[b_len], b2[b_len];
fi = calloc(1, sizeof(FacilitiesIndication_t));
fi->present = FacilitiesIndication_PR_extension;
fi = calloc(1, sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_extension;
fi->choice.extension.data.size = *msg_len;
fi->choice.extension.data.buf = malloc(*msg_len);
memcpy(fi->choice.extension.data.buf, msg, *msg_len);
fi->choice.extension.itsMessageType = its_msg_type;
b1[0] = ITSS_FACILITIES;
asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_FacilitiesIndication, fi, b1+1, b_len-1);
asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_EIS_FacilitiesIndication, fi, b1+1, b_len-1);
if (enc.encoded == -1) {
return 1;
}
@ -39,13 +39,13 @@ int edm_encap(uint8_t* msg, uint16_t* msg_len, uint16_t msg_buf_len, int its_msg
}
pthread_mutex_unlock(&edm->lock);
asn_dec_rval_t dec = asn_decode(NULL, ATS_CANONICAL_OER, &asn_DEF_FacilitiesResponse, (void**) &fr, b2, rl);
asn_dec_rval_t dec = asn_decode(NULL, ATS_CANONICAL_OER, &asn_DEF_EIS_FacilitiesResponse, (void**) &fr, b2, rl);
if (dec.code != 0) {
rv = 1;
goto cleanup;
}
if (fr->present != FacilitiesResponse_PR_extension ||
if (fr->present != EIS_FacilitiesResponse_PR_extension ||
fr->choice.extension.returnCode != 0) {
rv = 1;
goto cleanup;
@ -62,8 +62,8 @@ int edm_encap(uint8_t* msg, uint16_t* msg_len, uint16_t msg_buf_len, int its_msg
log_debug("[edm] request took %ld us", itss_ts_get(TIME_MICROSECONDS) - t_init);
cleanup:
ASN_STRUCT_FREE(asn_DEF_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_FacilitiesResponse, fr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesResponse, fr);
return rv;
}

176
src/evm.c
View File

@ -2,10 +2,10 @@
#include "facilities.h"
#include <fcntl.h>
#include <it2s-asn/evcsnm/EvcsnPdu.h>
#include <it2s-asn/itss-facilities/FacilitiesIndication.h>
#include <it2s-asn/itss-management/ManagementRequest.h>
#include <it2s-asn/itss-networking/NetworkingRequest.h>
#include <it2s-asn/etsi-its-v1/evcsnm/EI1_EvcsnPdu.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-management/EIS_ManagementRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingRequest.h>
#include <it2s-tender/constants.h>
#include <it2s-tender/database.h>
#include <it2s-tender/packet.h>
@ -38,7 +38,7 @@ static int mk_evcsnm(uint8_t *evcsnm_oer, uint32_t *evcsnm_len) {
int rv = 0;
int shm_fd, shm_valid = 0;
EvcsnPdu_t *evcsnm = calloc(1, sizeof(EvcsnPdu_t));
EI1_EvcsnPdu_t *evcsnm = calloc(1, sizeof(EI1_EvcsnPdu_t));
evcsnm->header.protocolVersion = 2;
evcsnm->header.messageID = 1;
pthread_mutex_lock(&facilities.id.lock);
@ -54,8 +54,8 @@ static int mk_evcsnm(uint8_t *evcsnm_oer, uint32_t *evcsnm_len) {
evcsnm->evcsn.evcsnData.chargingStationsData.list.array = calloc(1, sizeof(void *));
evcsnm->evcsn.evcsnData.chargingStationsData.list.count = 1;
evcsnm->evcsn.evcsnData.chargingStationsData.list.size = sizeof(void *) * 1;
evcsnm->evcsn.evcsnData.chargingStationsData.list.array[0] = calloc(1, sizeof(struct ItsChargingStationData));
struct ItsChargingStationData *cs0 = evcsnm->evcsn.evcsnData.chargingStationsData.list.array[0];
evcsnm->evcsn.evcsnData.chargingStationsData.list.array[0] = calloc(1, sizeof(struct EI1_ItsChargingStationData));
struct EI1_ItsChargingStationData *cs0 = evcsnm->evcsn.evcsnData.chargingStationsData.list.array[0];
cs0->chargingStationID = 0;
itss_space_lock();
itss_space_get();
@ -63,9 +63,9 @@ static int mk_evcsnm(uint8_t *evcsnm_oer, uint32_t *evcsnm_len) {
cs0->chargingStationLocation.longitude = -86628610;
cs0->chargingStationLocation.altitude.altitudeValue = epv.space.altitude;
cs0->chargingStationLocation.altitude.altitudeConfidence = epv.space.altitude_conf;
cs0->chargingStationLocation.positionConfidenceEllipse.semiMajorConfidence = SemiAxisLength_unavailable;
cs0->chargingStationLocation.positionConfidenceEllipse.semiMinorConfidence = SemiAxisLength_unavailable;
cs0->chargingStationLocation.positionConfidenceEllipse.semiMajorOrientation = HeadingValue_unavailable;
cs0->chargingStationLocation.positionConfidenceEllipse.semiMajorConfidence = EI1_SemiAxisLength_unavailable;
cs0->chargingStationLocation.positionConfidenceEllipse.semiMinorConfidence = EI1_SemiAxisLength_unavailable;
cs0->chargingStationLocation.positionConfidenceEllipse.semiMajorOrientation = EI1_HeadingValue_unavailable;
cs0->accessibility = *create_utf8_from_string("Free Access", strlen("Free Access"));
cs0->pricing = *create_utf8_from_string(".15 €/kWh", strlen(".15 €/kWh"));
cs0->openingDaysHours = *create_utf8_from_string("Always", strlen("Always"));
@ -74,8 +74,8 @@ static int mk_evcsnm(uint8_t *evcsnm_oer, uint32_t *evcsnm_len) {
cs0->chargingSpotsAvailable.list.array = calloc(1, sizeof(void *));
cs0->chargingSpotsAvailable.list.count = 1;
cs0->chargingSpotsAvailable.list.size = sizeof(void *) * 1;
cs0->chargingSpotsAvailable.list.array[0] = calloc(1, sizeof(struct ItsChargingSpotDataElements));
struct ItsChargingSpotDataElements *cs_elem0 = cs0->chargingSpotsAvailable.list.array[0];
cs0->chargingSpotsAvailable.list.array[0] = calloc(1, sizeof(struct EI1_ItsChargingSpotDataElements));
struct EI1_ItsChargingSpotDataElements *cs_elem0 = cs0->chargingSpotsAvailable.list.array[0];
cs_elem0->energyAvailability = *create_utf8_from_string("Max: 30kW", strlen("Max: 30kW"));
cs_elem0->type.buf = calloc(1, sizeof(uint8_t));
cs_elem0->type.size = 1;
@ -85,14 +85,14 @@ static int mk_evcsnm(uint8_t *evcsnm_oer, uint32_t *evcsnm_len) {
cs_elem0->typeOfReceptacle.size = 1;
cs_elem0->typeOfReceptacle.bits_unused = 0;
cs_elem0->typeOfReceptacle.buf[0] = 0x0D;
cs_elem0->parkingPlacesData = calloc(1, sizeof(struct ParkingPlacesData));
cs_elem0->parkingPlacesData = calloc(1, sizeof(struct EI1_ParkingPlacesData));
cs_elem0->parkingPlacesData->list.array = calloc(2, sizeof(void *));
cs_elem0->parkingPlacesData->list.count = 2;
cs_elem0->parkingPlacesData->list.size = sizeof(void *) * 2;
// As requested onnly 2 parking places are available
for (int parckingPlaceIndex = 0; parckingPlaceIndex < 2; parckingPlaceIndex++) {
cs_elem0->parkingPlacesData->list.array[parckingPlaceIndex] = calloc(1, sizeof(struct SpotAvailability));
struct SpotAvailability *spot = cs_elem0->parkingPlacesData->list.array[parckingPlaceIndex];
cs_elem0->parkingPlacesData->list.array[parckingPlaceIndex] = calloc(1, sizeof(struct EI1_SpotAvailability));
struct EI1_SpotAvailability *spot = cs_elem0->parkingPlacesData->list.array[parckingPlaceIndex];
spot->maxWaitingTimeMinutes = 0;
spot->blocking = 1;
}
@ -101,7 +101,7 @@ static int mk_evcsnm(uint8_t *evcsnm_oer, uint32_t *evcsnm_len) {
//{
// }
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EvcsnPdu, NULL, evcsnm, evcsnm_oer, 512);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_EvcsnPdu, NULL, evcsnm, evcsnm_oer, 512);
if (enc.encoded == -1) {
log_error("[ev] failed encoding evcsnm (%s)", enc.failed_type->name);
rv = 1;
@ -110,64 +110,64 @@ static int mk_evcsnm(uint8_t *evcsnm_oer, uint32_t *evcsnm_len) {
*evcsnm_len = (enc.encoded + 7) / 8;
cleanup:
ASN_STRUCT_FREE(asn_DEF_EvcsnPdu, evcsnm);
ASN_STRUCT_FREE(asn_DEF_EI1_EvcsnPdu, evcsnm);
return rv;
}
static uint64_t pre_reservation_id = 1;
static uint64_t reservation_id = 1;
int evrsrm_recv(EV_RSR_t *evrsr_request) {
int evrsrm_recv(EI1_EV_RSR_t *evrsr_request) {
int rv = 0;
NetworkingRequest_t* nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
EIS_NetworkingRequest_t* nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->network.choice.gn.trafficClass = 2;
npr->network.choice.gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) {
npr->network.choice.gn.destinationAddress.buf[i] = 0xff;
}
npr->network.choice.gn.destinationAddress.size = 6;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.securityProfile.sign = true;
npr->transport.present = NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = BTPType_btpB;
npr->transport.choice.btp.destinationPort = Port_evrsr;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = EIS_BTPType_btpB;
npr->transport.choice.btp.destinationPort = EIS_Port_evrsr;
npr->data.buf = malloc(512);
// 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;
fmi->itsMessageType = ItsMessageType_evrsr;
EIS_FacilitiesIndication_t *fi = calloc(1, sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_message;
EIS_FacilitiesMessageIndication_t *fmi = &fi->choice.message;
fmi->itsMessageType = EIS_ItsMessageType_evrsr;
fmi->data.buf = malloc(512);
uint8_t tr_oer[1024];
uint8_t fi_oer[1024];
tr_oer[0] = 4; // Facilities
fi_oer[0] = 4;
if (!(evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_preReservationRequestMessage ||
evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_reservationRequestMessage ||
evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_cancellationRequestMessage ||
evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_updateRequestMessage)) {
if (!(evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_preReservationRequestMessage ||
evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_reservationRequestMessage ||
evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_cancellationRequestMessage ||
evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_updateRequestMessage)) {
rv = 1;
goto cleanup;
}
int evrsr_response;
if (evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_preReservationRequestMessage)
if (evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_preReservationRequestMessage)
evrsr_response = evrsrm_pre_reservation_response(npr->data.buf, (uint32_t *)&npr->data.size);
else if (evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_reservationRequestMessage)
else if (evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_reservationRequestMessage)
evrsr_response = evrsrm_reservation_response(evrsr_request, npr->data.buf, (uint32_t *)&npr->data.size);
else if (evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_cancellationRequestMessage)
else if (evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_cancellationRequestMessage)
evrsr_response = evrsrm_cancellation_response(evrsr_request, npr->data.buf, (uint32_t *)&npr->data.size);
else if (evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_updateRequestMessage)
else if (evrsr_request->messageBody.present == EI1_EV_RSR_MessageBody_PR_updateRequestMessage)
evrsr_response = evrsrm_update_response(evrsr_request, npr->data.buf, (uint32_t *)&npr->data.size);
if (evrsr_response != 0) {
rv = 1;
@ -180,14 +180,14 @@ int evrsrm_recv(EV_RSR_t *evrsr_request) {
npr->id = id;
fmi->id = id;
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_NetworkingRequest, NULL, nr, tr_oer + 1, 1023);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_NetworkingRequest, NULL, nr, tr_oer + 1, 1023);
if (enc.encoded == -1) {
log_error("[ev] failed encoding transport request (%s)", enc.failed_type->name);
rv = 1;
goto cleanup;
}
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_EIS_FacilitiesIndication, NULL, fi, fi_oer + 1, 1023);
if (enc_fdi.encoded == -1) {
log_error("[ev] encoding FI for evrsrm failed");
rv = 1;
@ -202,23 +202,23 @@ cleanup:
return rv;
}
static int evrsrm_cancellation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len){
static int evrsrm_cancellation_response(EI1_EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len){
int rv = 0;
EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t));
EI1_EV_RSR_t *evrsr_response = calloc(1, sizeof(EI1_EV_RSR_t));
evrsr_response->header.protocolVersion = 1;
evrsr_response->header.messageID = 7;
pthread_mutex_lock(&facilities.id.lock);
evrsr_response->header.stationID = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
evrsr_response->messageBody.present = EV_RSR_MessageBody_PR_cancellationResponseMessage;
CancellationResponseMessage_t *evrsr_cancellation_response = &evrsr_response->messageBody.choice.cancellationResponseMessage;
evrsr_response->messageBody.present = EI1_EV_RSR_MessageBody_PR_cancellationResponseMessage;
EI1_CancellationResponseMessage_t *evrsr_cancellation_response = &evrsr_response->messageBody.choice.cancellationResponseMessage;
evrsr_cancellation_response->reservation_ID.buf = calloc(8, sizeof(uint8_t));
evrsr_cancellation_response->reservation_ID.size = 8;
memccpy(evrsr_cancellation_response->reservation_ID.buf, evrsrm_request->messageBody.choice.cancellationRequestMessage.reservation_ID.buf, 0, 8);
evrsr_cancellation_response->cancellationResponseCode = CancellationResponseCode_ok;
evrsr_cancellation_response->cancellationResponseCode = EI1_CancellationResponseCode_ok;
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
if (enc.encoded == -1) {
log_error("[ev] failed encoding evrsrm cancellation response (%s)", enc.failed_type->name);
rv = 1;
@ -226,27 +226,27 @@ static int evrsrm_cancellation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsr
}
*evrsrm_len = (enc.encoded + 7) / 8;
cleanup:
ASN_STRUCT_FREE(asn_DEF_EV_RSR, evrsr_response);
ASN_STRUCT_FREE(asn_DEF_EI1_EV_RSR, evrsr_response);
return rv;
}
static int evrsrm_update_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len){
static int evrsrm_update_response(EI1_EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len){
int rv = 0;
EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t));
EI1_EV_RSR_t *evrsr_response = calloc(1, sizeof(EI1_EV_RSR_t));
evrsr_response->header.protocolVersion = 1;
evrsr_response->header.messageID = 7;
pthread_mutex_lock(&facilities.id.lock);
evrsr_response->header.stationID = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
evrsr_response->messageBody.present = EV_RSR_MessageBody_PR_updateResponseMessage;
UpdateResponseMessage_t *evrsr_update_response = &evrsr_response->messageBody.choice.updateResponseMessage;
evrsr_response->messageBody.present = EI1_EV_RSR_MessageBody_PR_updateResponseMessage;
EI1_UpdateResponseMessage_t *evrsr_update_response = &evrsr_response->messageBody.choice.updateResponseMessage;
evrsr_update_response->reservation_ID.buf = calloc(8, sizeof(uint8_t));
evrsr_update_response->reservation_ID.size = 8;
memccpy(evrsr_update_response->reservation_ID.buf, evrsrm_request->messageBody.choice.updateRequestMessage.reservation_ID.buf, 0, 8);
evrsr_update_response->updateResponseCode = UpdateResponseCode_ok;
evrsr_update_response->updateResponseCode = EI1_UpdateResponseCode_ok;
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
if (enc.encoded == -1) {
log_error("[ev] failed encoding evrsrm update response (%s)", enc.failed_type->name);
rv = 1;
@ -254,26 +254,26 @@ static int evrsrm_update_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer,
}
*evrsrm_len = (enc.encoded + 7) / 8;
cleanup:
ASN_STRUCT_FREE(asn_DEF_EV_RSR, evrsr_response);
ASN_STRUCT_FREE(asn_DEF_EI1_EV_RSR, evrsr_response);
return rv;
}
static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len) {
static int evrsrm_reservation_response(EI1_EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len) {
int rv = 0;
EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t));
EI1_EV_RSR_t *evrsr_response = calloc(1, sizeof(EI1_EV_RSR_t));
evrsr_response->header.protocolVersion = 1;
evrsr_response->header.messageID = 7;
pthread_mutex_lock(&facilities.id.lock);
evrsr_response->header.stationID = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
evrsr_response->messageBody.present = EV_RSR_MessageBody_PR_reservationResponseMessage;
evrsr_response->messageBody.present = EI1_EV_RSR_MessageBody_PR_reservationResponseMessage;
ReservationResponseMessage_t *response = &evrsr_response->messageBody.choice.reservationResponseMessage;
EI1_ReservationResponseMessage_t *response = &evrsr_response->messageBody.choice.reservationResponseMessage;
// Assumes the pre reservation was successful
response->reservationResponseCode = ReservationResponseCode_ok;
response->reservationResponseCode = EI1_ReservationResponseCode_ok;
response->reservation_ID = calloc(1, sizeof(Reservation_ID_t));
response->reservation_ID = calloc(1, sizeof(EI1_Reservation_ID_t));
response->reservation_ID->buf = calloc(8, sizeof(uint8_t));
response->reservation_ID->size = 8;
response->reservation_ID->buf[0] = '0' + reservation_id / 10000000;
@ -285,7 +285,7 @@ static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm
response->reservation_ID->buf[6] = '0' + (reservation_id / 10) % 10;
response->reservation_ID->buf[7] = '0' + reservation_id % 10;
response->reservation_Password = calloc(1, sizeof(Reservation_Password_t));
response->reservation_Password = calloc(1, sizeof(EI1_Reservation_Password_t));
response->reservation_Password->buf = calloc(8, sizeof(uint8_t));
response->reservation_Password->size = 8;
response->reservation_Password->buf[0] = 'i';
@ -300,7 +300,7 @@ static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm
response->expirationTime = evrsrm_request->messageBody.choice.reservationRequestMessage.arrivalTime;
response->expirationTime += 15 * 60 * 1000; // 15 minutes
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
if (enc.encoded == -1) {
log_error("[ev] failed encoding evrsrm reservation response (%s)", enc.failed_type->name);
rv = 1;
@ -310,20 +310,20 @@ static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm
reservation_id++;
cleanup:
ASN_STRUCT_FREE(asn_DEF_EV_RSR, evrsr_response);
ASN_STRUCT_FREE(asn_DEF_EI1_EV_RSR, evrsr_response);
return rv;
}
static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm_len) {
int rv = 0;
EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t));
EI1_EV_RSR_t *evrsr_response = calloc(1, sizeof(EI1_EV_RSR_t));
evrsr_response->header.protocolVersion = 1;
evrsr_response->header.messageID = 7;
pthread_mutex_lock(&facilities.id.lock);
evrsr_response->header.stationID = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
evrsr_response->messageBody.present = EV_RSR_MessageBody_PR_preReservationResponseMessage;
evrsr_response->messageBody.present = EI1_EV_RSR_MessageBody_PR_preReservationResponseMessage;
PreReservationResponseMessage_t *response = &evrsr_response->messageBody.choice.preReservationResponseMessage;
EI1_PreReservationResponseMessage_t *response = &evrsr_response->messageBody.choice.preReservationResponseMessage;
response->preReservation_ID.buf = calloc(8, sizeof(uint8_t));
response->preReservation_ID.size = 8;
response->preReservation_ID.buf[0] = '0' + (pre_reservation_id / 10000000);
@ -343,7 +343,7 @@ static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm
response->supportedPaymentTypes.buf[0] = 0x00;
response->preReservationExpirationTime = 0;
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
if (enc.encoded == -1) {
log_error("[ev] failed encoding evrsrm pre reservation response (%s)", enc.failed_type->name);
rv = 1;
@ -353,56 +353,56 @@ static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm
pre_reservation_id++;
cleanup:
ASN_STRUCT_FREE(asn_DEF_EV_RSR, evrsr_response);
ASN_STRUCT_FREE(asn_DEF_EI1_EV_RSR, evrsr_response);
return rv;
}
int evcsnm_check(EvcsnPdu_t *evcsnm) {
int evcsnm_check(EI1_EvcsnPdu_t *evcsnm) {
return 0;
}
int evrsrm_check(EV_RSR_t *evrsrm) {
int evrsrm_check(EI1_EV_RSR_t *evrsrm) {
return 0;
}
enum EVM_CHECK_R check_evcsnm(BTPPacketIndication_t *bpi, EvcsnPdu_t *evcsnm, uint8_t *ssp, uint32_t ssp_len) {
enum EVM_CHECK_R check_evcsnm(EIS_BTPPacketIndication_t *bpi, EI1_EvcsnPdu_t *evcsnm, uint8_t *ssp, uint32_t ssp_len) {
return 0;
}
enum EVM_CHECK_R check_evrsrm(BTPPacketIndication_t *bpi, EV_RSR_t *evrsrm, uint8_t *ssp, uint32_t ssp_len) {
enum EVM_CHECK_R check_evrsrm(EIS_BTPPacketIndication_t *bpi, EI1_EV_RSR_t *evrsrm, uint8_t *ssp, uint32_t ssp_len) {
return 0;
}
void *evcsn_service() {
int rv = 0;
NetworkingRequest_t* nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
EIS_NetworkingRequest_t* nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->network.choice.gn.trafficClass = 2;
npr->network.choice.gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) {
npr->network.choice.gn.destinationAddress.buf[i] = 0xff;
}
npr->network.choice.gn.destinationAddress.size = 6;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.securityProfile.sign = true;
npr->transport.present = NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = BTPType_btpB;
npr->transport.choice.btp.destinationPort = Port_poi;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = EIS_BTPType_btpB;
npr->transport.choice.btp.destinationPort = EIS_Port_poi;
npr->data.buf = malloc(512);
// 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;
fmi->itsMessageType = ItsMessageType_poi;
EIS_FacilitiesIndication_t *fi = calloc(1, sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_message;
EIS_FacilitiesMessageIndication_t *fmi = &fi->choice.message;
fmi->itsMessageType = EIS_ItsMessageType_poi;
fmi->data.buf = malloc(512);
uint8_t tr_oer[1024];
@ -423,13 +423,13 @@ void *evcsn_service() {
npr->id = id;
fmi->id = id;
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_NetworkingRequest, NULL, nr, tr_oer + 1, 1023);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_NetworkingRequest, NULL, nr, tr_oer + 1, 1023);
if (enc.encoded == -1) {
log_error("encoding TR for evcsnm failed");
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_EIS_FacilitiesIndication, NULL, fi, fi_oer + 1, 1023);
if (enc_fdi.encoded == -1) {
log_error("encoding FI for evcsnm failed");
continue;
@ -444,7 +444,7 @@ void *evcsn_service() {
pthread_mutex_lock(&facilities.id.lock);
uint32_t station_id = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
itss_db_add(facilities.logging.dbms, station_id, npr->id, true, messageID_evcsn, NULL, npr->data.buf, npr->data.size);
itss_db_add(facilities.logging.dbms, station_id, npr->id, true, EI1_messageID_evcsn, NULL, npr->data.buf, npr->data.size);
}
if (facilities.logging.recorder) {
@ -466,7 +466,7 @@ void *evcsn_service() {
}
}
ASN_STRUCT_FREE(asn_DEF_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingRequest, nr);
return NULL;
}

View File

@ -1,15 +1,15 @@
#ifndef FACILITIES_EVM_H
#define FACILITIES_EVM_H
#include <it2s-asn/evcsnm/EvcsnPdu.h>
#include <it2s-asn/evrsrm/EV-RSR.h>
#include <it2s-asn/etsi-its-v1/evcsnm/EI1_EvcsnPdu.h>
#include <it2s-asn/etsi-its-v1/evrsrm/EI1_EV-RSR.h>
#include <it2s-tender/epv.h>
#include <pthread.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <it2s-asn/itss-networking/NetworkingIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingIndication.h>
enum EVM_CHECK_R {
EVM_OK,
@ -22,14 +22,14 @@ enum EVM_CHECK_R {
*
* @return A EVM check code
*/
enum EVM_CHECK_R check_evcsnm(BTPPacketIndication_t *bpi, EvcsnPdu_t *evcsnm, uint8_t *ssp, uint32_t ssp_len);
enum EVM_CHECK_R check_evcsnm(EIS_BTPPacketIndication_t *bpi, EI1_EvcsnPdu_t *evcsnm, uint8_t *ssp, uint32_t ssp_len);
/*
* @brief Analyzes a received EVRSRM
*
* @return A EVM check code
*/
enum EVM_CHECK_R check_evrsrm(BTPPacketIndication_t *bpi, EV_RSR_t *evrsrm, uint8_t *ssp, uint32_t ssp_len);
enum EVM_CHECK_R check_evrsrm(EIS_BTPPacketIndication_t *bpi, EI1_EV_RSR_t *evrsrm, uint8_t *ssp, uint32_t ssp_len);
/*
* @brief Main CA service
@ -44,7 +44,7 @@ void *evcsn_service();
*
* @return 0 on success, 1 otherwise
*/
int evrsrm_recv(EV_RSR_t *evrsr_request);
int evrsrm_recv(EI1_EV_RSR_t *evrsr_request);
/**
* @brief Creates a pre reservation response.
@ -64,7 +64,7 @@ static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm
* @return The reservation response
*/
static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len);
static int evrsrm_reservation_response(EI1_EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len);
/**
* @brief Creates a reservation cancellation response.
@ -74,7 +74,7 @@ static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm
* @return The reservation response
*/
static int evrsrm_cancellation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len);
static int evrsrm_cancellation_response(EI1_EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len);
/**
* @brief Creates a reservation update response.
@ -84,7 +84,7 @@ static int evrsrm_cancellation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsr
* @return The reservation response
*/
static int evrsrm_update_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len);
static int evrsrm_update_response(EI1_EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len);
/**
@ -93,14 +93,14 @@ static int evrsrm_update_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer,
* @return 0 on success, other value otherwise
*/
int evcsnm_check(EvcsnPdu_t *evcsnm);
int evcsnm_check(EI1_EvcsnPdu_t *evcsnm);
/**
* Analyses a evrsrm
* @param evrsrm The evrsrm to be analyzed
* @return 0 on success, other value otherwise
*/
int evrsrm_check(EV_RSR_t *evrsrm);
int evrsrm_check(EI1_EV_RSR_t *evrsrm);
typedef struct evm_args {
bool activate;

View File

@ -1,22 +1,22 @@
#include "facilities.h"
#include <it2s-asn/camv2/CAM.h>
#include <it2s-asn/cpm/CPM.h>
#include <it2s-asn/denmv2/DENM.h>
#include <it2s-asn/itss-facilities/FacilitiesIndication.h>
#include <it2s-asn/itss-facilities/FacilitiesReply.h>
#include <it2s-asn/itss-facilities/FacilitiesRequest.h>
#include <it2s-asn/itss-management/ManagementIndication.h>
#include <it2s-asn/itss-management/ManagementRequest.h>
#include <it2s-asn/itss-networking/NetworkingIndication.h>
#include <it2s-asn/itss-security/SecurityIndication.h>
#include <it2s-asn/itss-security/SecurityReply.h>
#include <it2s-asn/itss-security/SecurityRequest.h>
#include <it2s-asn/itss-security/SecurityResponse.h>
#include <it2s-asn/itss-networking/NetworkingIndication.h>
#include <it2s-asn/itss-networking/NetworkingRequest.h>
#include <it2s-asn/ivim/IVIM.h>
#include <it2s-asn/saem/SAEM.h>
#include <it2s-asn/etsi-its-v1/cam/EI1_CAM.h>
#include <it2s-asn/etsi-its-v1/cpm/EI1_CPM.h>
#include <it2s-asn/etsi-its-v1/denm/EI1_DENM.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesReply.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-management/EIS_ManagementIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-management/EIS_ManagementRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityReply.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityResponse.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingRequest.h>
#include <it2s-asn/etsi-its-v1/ivim/EI1_IVIM.h>
#include <it2s-asn/etsi-its-v1/saem/EI1_SAEM.h>
#include <it2s-tender/packet.h>
#include <it2s-tender/recorder.h>
#include <it2s-tender/space.h>
@ -48,9 +48,9 @@ static int networking_indication(void *responder, void **security_socket, uint8_
uint8_t code = 0;
bool stored = false;
NetworkingIndication_t *ni = calloc(1, sizeof(NetworkingIndication_t));
EIS_NetworkingIndication_t *ni = calloc(1, sizeof(EIS_NetworkingIndication_t));
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_NetworkingIndication, (void **)&ni, msg, msg_len);
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_EIS_NetworkingIndication, (void **)&ni, msg, msg_len);
if (dec.code) {
log_error("<- invalid TI received");
rv = 1;
@ -62,10 +62,10 @@ static int networking_indication(void *responder, void **security_socket, uint8_
itss_0send(responder, &code, 1);
switch (ni->present) {
case NetworkingIndication_PR_packet:
case EIS_NetworkingIndication_PR_packet:
networking_packet_indication(&ni->choice.packet, security_socket);
break;
case NetworkingIndication_PR_data:
case EIS_NetworkingIndication_PR_data:
networking_data_indication(&ni->choice.data, security_socket);
goto cleanup;
default:
@ -75,7 +75,7 @@ static int networking_indication(void *responder, void **security_socket, uint8_
}
cleanup:
ASN_STRUCT_FREE(asn_DEF_NetworkingIndication, ni);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingIndication, ni);
return rv;
}
@ -83,9 +83,9 @@ cleanup:
static int facilities_request(void *responder, uint8_t *msg, uint32_t msg_len) {
int rv = 0;
FacilitiesRequest_t *fr = calloc(1, sizeof(FacilitiesRequest_t));
EIS_FacilitiesRequest_t *fr = calloc(1, sizeof(EIS_FacilitiesRequest_t));
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_FacilitiesRequest, (void **)&fr, msg, msg_len);
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_EIS_FacilitiesRequest, (void **)&fr, msg, msg_len);
if (dec.code) {
log_error("<- invalid FR received");
facilities_request_result_rejected(responder);
@ -94,25 +94,25 @@ static int facilities_request(void *responder, uint8_t *msg, uint32_t msg_len) {
}
switch (fr->present) {
case FacilitiesRequest_PR_message:
case EIS_FacilitiesRequest_PR_message:
rv = facilities_request_single_message(responder, &fr->choice.message);
break;
case FacilitiesRequest_PR_data:
case EIS_FacilitiesRequest_PR_data:
switch (fr->choice.data.present) {
case FacilitiesDataRequest_PR_activeEpisodes:
case EIS_FacilitiesDataRequest_PR_activeEpisodes:
rv = facilities_request_active_episodes(responder, fr);
break;
case FacilitiesDataRequest_PR_attributeTypes:
case EIS_FacilitiesDataRequest_PR_attributeTypes:
rv = facilities_request_attribute_types(responder, fr);
break;
case FacilitiesDataRequest_PR_loadedProtectionZones:
case EIS_FacilitiesDataRequest_PR_loadedProtectionZones:
rv = facilities_request_loaded_protected_zones(responder, fr);
break;
case FacilitiesDataRequest_PR_chainInfoSet:
case EIS_FacilitiesDataRequest_PR_chainInfoSet:
rv = facilities_request_chaininfo_set(responder, &fr->choice.data.choice.chainInfoSet);
break;
@ -132,7 +132,7 @@ static int facilities_request(void *responder, uint8_t *msg, uint32_t msg_len) {
}
cleanup:
ASN_STRUCT_FREE(asn_DEF_FacilitiesRequest, fr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesRequest, fr);
return rv;
}
@ -140,14 +140,14 @@ cleanup:
static int security_indication(void *responder_secured, uint8_t *msg, uint32_t msg_len) {
int rv = 0;
SecurityIndication_t *si = calloc(1, sizeof(SecurityIndication_t));
SecurityResponse_t *sr = calloc(1, sizeof(SecurityResponse_t));
EIS_SecurityIndication_t *si = calloc(1, sizeof(EIS_SecurityIndication_t));
EIS_SecurityResponse_t *sr = calloc(1, sizeof(EIS_SecurityResponse_t));
uint8_t buffer[64];
asn_enc_rval_t enc;
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_SecurityIndication, (void **)&si, msg, msg_len);
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_EIS_SecurityIndication, (void **)&si, msg, msg_len);
if (dec.code) {
log_error("<- invalid SIndication received");
rv = 1;
@ -163,8 +163,8 @@ static int security_indication(void *responder_secured, uint8_t *msg, uint32_t m
}
if (facilities.id.change.stage == ID_CHANGE_PREPARE &&
si->choice.idChangeEvent.command != SecurityIdChangeEventType_commit &&
si->choice.idChangeEvent.command != SecurityIdChangeEventType_abort) {
si->choice.idChangeEvent.command != EIS_SecurityIdChangeEventType_commit &&
si->choice.idChangeEvent.command != EIS_SecurityIdChangeEventType_abort) {
pthread_mutex_unlock(&facilities.id.change.lock);
log_debug("current identity change state is prepare, but received identity change command is not commit nor abort");
rv = 1;
@ -174,7 +174,7 @@ static int security_indication(void *responder_secured, uint8_t *msg, uint32_t m
bool id_changed = false;
switch (si->choice.idChangeEvent.command) {
case SecurityIdChangeEventType_prepare:
case EIS_SecurityIdChangeEventType_prepare:
facilities.id.change.stage = ID_CHANGE_PREPARE;
@ -182,7 +182,7 @@ static int security_indication(void *responder_secured, uint8_t *msg, uint32_t m
pthread_mutex_lock(&facilities.lightship.lock);
break;
case SecurityIdChangeEventType_commit:;
case EIS_SecurityIdChangeEventType_commit:;
facilities.id.change.stage = ID_CHANGE_COMMIT;
// Reset lightship
@ -201,10 +201,10 @@ static int security_indication(void *responder_secured, uint8_t *msg, uint32_t m
// Change Station ID
for (int i = 0; i < si->choice.idChangeEvent.ids.list.count; ++i) {
switch (si->choice.idChangeEvent.ids.list.array[i]->present) {
case SecurityId_PR_stationId:
case EIS_SecurityId_PR_stationId:
facilities.id.station_id = si->choice.idChangeEvent.ids.list.array[i]->choice.stationId;
break;
case SecurityId_PR_ipv6Address:
case EIS_SecurityId_PR_ipv6Address:
memcpy(facilities.id.ipv6_addr, si->choice.idChangeEvent.ids.list.array[i]->choice.ipv6Address.buf, 16);
break;
default:
@ -220,7 +220,7 @@ static int security_indication(void *responder_secured, uint8_t *msg, uint32_t m
break;
case SecurityIdChangeEventType_abort:
case EIS_SecurityIdChangeEventType_abort:
pthread_mutex_unlock(&facilities.id.lock);
pthread_mutex_unlock(&facilities.lightship.lock);
@ -234,24 +234,24 @@ static int security_indication(void *responder_secured, uint8_t *msg, uint32_t m
goto cleanup;
}
sr->present = SecurityResponse_PR_idChangeEvent;
sr->present = EIS_SecurityResponse_PR_idChangeEvent;
sr->choice.idChangeEvent.returnCode = 0;
enc = oer_encode_to_buffer(&asn_DEF_SecurityResponse, NULL, sr, buffer, 64);
enc = oer_encode_to_buffer(&asn_DEF_EIS_SecurityResponse, NULL, sr, buffer, 64);
itss_0send(responder_secured, buffer, enc.encoded);
pthread_mutex_unlock(&facilities.id.change.lock);
cleanup:
if (rv) {
sr->present = SecurityResponse_PR_idChangeEvent;
sr->present = EIS_SecurityResponse_PR_idChangeEvent;
sr->choice.idChangeEvent.returnCode = 1;
enc = oer_encode_to_buffer(&asn_DEF_SecurityResponse, NULL, sr, buffer, 64);
enc = oer_encode_to_buffer(&asn_DEF_EIS_SecurityResponse, NULL, sr, buffer, 64);
itss_0send(responder_secured, buffer, enc.encoded);
}
pthread_mutex_unlock(&facilities.id.change.lock);
ASN_STRUCT_FREE(asn_DEF_SecurityResponse, sr);
ASN_STRUCT_FREE(asn_DEF_SecurityIndication, si);
ASN_STRUCT_FREE(asn_DEF_EIS_SecurityResponse, sr);
ASN_STRUCT_FREE(asn_DEF_EIS_SecurityIndication, si);
return rv;
}
@ -262,9 +262,9 @@ static int management_indication(void *responder, uint8_t *msg, uint32_t msg_len
uint8_t code = 0;
ManagementIndication_t *mi = calloc(1, sizeof(ManagementIndication_t));
EIS_ManagementIndication_t *mi = calloc(1, sizeof(EIS_ManagementIndication_t));
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_ManagementIndication, (void **)&mi, msg, msg_len);
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_EIS_ManagementIndication, (void **)&mi, msg, msg_len);
if (dec.code) {
rv = 1;
code = 1;
@ -273,7 +273,7 @@ static int management_indication(void *responder, uint8_t *msg, uint32_t msg_len
}
itss_0send(responder, &code, 1);
if (mi->present == ManagementIndication_PR_attributes) {
if (mi->present == EIS_ManagementIndication_PR_attributes) {
itss_space_lock();
epv.space.latitude = mi->choice.attributes.coordinates.latitude;
epv.space.latitude_conf = mi->choice.attributes.coordinates.latitudeConfidence;
@ -305,7 +305,7 @@ static int management_indication(void *responder, uint8_t *msg, uint32_t msg_len
}
cleanup:
ASN_STRUCT_FREE(asn_DEF_ManagementIndication, mi);
ASN_STRUCT_FREE(asn_DEF_EIS_ManagementIndication, mi);
return rv;
}

View File

@ -1,14 +1,14 @@
#include "indications.h"
#include <it2s-asn/itss-security/SecurityRequest.h>
#include <it2s-asn/itss-security/SecurityReply.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityReply.h>
#include <it2s-tender/packet.h>
static void tcp_conn_reset(TCPConnRSTInfo_t* cri, void** security_socket) {
static void tcp_conn_reset(EIS_TCPConnRSTInfo_t* cri, void** security_socket) {
if (cri->destinationAddress.size != 16) return;
SecurityRequest_t* sreq = NULL;
EIS_SecurityRequest_t* sreq = NULL;
// Reset tolling, tls
tolling_t* tolling = &facilities.tolling;
@ -20,13 +20,13 @@ static void tcp_conn_reset(TCPConnRSTInfo_t* cri, void** security_socket) {
) {
for (int i = 0; i < bulletin->to_consume_len; ++i) {
if (!memcmp(bulletin->to_consume[i]->endpoint.ipv6_addr, cri->destinationAddress.buf, 16)) {
sreq = calloc(1, sizeof(SecurityRequest_t));
sreq->present = SecurityRequest_PR_tlsReset;
sreq = calloc(1, sizeof(EIS_SecurityRequest_t));
sreq->present = EIS_SecurityRequest_PR_tlsReset;
sreq->choice.tlsReset.connId = tolling->station.obu.tls_conn_id;
uint8_t b_s[64], b_r[64];
b_s[0] = 4;
asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_SecurityRequest, sreq, b_s+1, 63);
asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_EIS_SecurityRequest, sreq, b_s+1, 63);
if (enc.encoded == -1) {
log_error("[facilities] SecurityRequest.tlsReset encoding failed");
}
@ -40,18 +40,18 @@ static void tcp_conn_reset(TCPConnRSTInfo_t* cri, void** security_socket) {
}
ASN_STRUCT_FREE(asn_DEF_SecurityRequest, sreq);
ASN_STRUCT_FREE(asn_DEF_EIS_SecurityRequest, sreq);
}
int networking_data_indication(NetworkingDataIndication_t* ndi, void** security_socket) {
int networking_data_indication(EIS_NetworkingDataIndication_t* ndi, void** security_socket) {
int rv = 0;
switch (ndi->present) {
case NetworkingDataIndication_PR_transport:
case EIS_NetworkingDataIndication_PR_transport:
switch (ndi->choice.transport.present) {
case NetworkingDataIndicationTP_PR_tcp:
case EIS_NetworkingDataIndicationTP_PR_tcp:
switch (ndi->choice.transport.choice.tcp.present) {
case TCPDataIndication_PR_connInfoReset:
case EIS_TCPDataIndication_PR_connInfoReset:
tcp_conn_reset(&ndi->choice.transport.choice.tcp.choice.connInfoReset, security_socket);
break;
default:
@ -64,7 +64,7 @@ int networking_data_indication(NetworkingDataIndication_t* ndi, void** security_
goto cleanup;
}
break;
case NetworkingDataIndication_PR_network:
case EIS_NetworkingDataIndication_PR_network:
if (ndi->choice.network.mobileNeighbour &&
*ndi->choice.network.mobileNeighbour) {
pthread_mutex_lock(&facilities.lightship.lock);

View File

@ -1,6 +1,6 @@
#pragma once
#include "facilities.h"
#include <it2s-asn/itss-networking/NetworkingIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingIndication.h>
int networking_data_indication(NetworkingDataIndication_t* tpi, void** security_socket);
int networking_data_indication(EIS_NetworkingDataIndication_t* tpi, void** security_socket);

View File

@ -6,9 +6,9 @@
#include <it2s-tender/space.h>
#include <it2s-tender/time.h>
#include <it2s-asn/ivim/ISO14823Code.h>
#include <it2s-asn/etsi-its-v1/ivi-1/EI1_ISO14823Code.h>
const ivi_diid_ssp_bm_t DIID_SSP_BM_MAP[] = {
static const ivi_diid_ssp_bm_t DIID_SSP_BM_MAP[] = {
{"Vienna Convention Code for road sign", IVI_DIID_ViennaCodeConvention, 0x800000},
{"ISO 14823 traffic sign pictogram (danger/warning)", IVI_DIID_TrafficSignPictogramDangerWarning, 0x400000},
{"ISO 14823 traffic sign pictogram (regulatory)", IVI_DIID_TrafficSignPictogramRegulatory, 0x200000},
@ -25,7 +25,7 @@ const ivi_diid_ssp_bm_t DIID_SSP_BM_MAP[] = {
};
static int permissions_check(int diid, uint8_t* permissions, uint8_t permissions_len) {
/* IVIM SSP scheme
/* EI1_IVIM SSP scheme
*
* byte | description
* ---------------------------------
@ -71,7 +71,7 @@ static enum SERVICE_EVAL_R service_check(enum SERVICE_TYPE type, void* its_msg,
return -1;
}
IVIM_t* ivim = (IVIM_t*) its_msg;
EI1_IVIM_t* ivim = (EI1_IVIM_t*) its_msg;
uint64_t timestamp, valid_to, valid_from;
if (!ivim->ivi.mandatory.timeStamp) {
@ -103,46 +103,46 @@ static enum SERVICE_EVAL_R service_check(enum SERVICE_TYPE type, void* its_msg,
if (ivim->ivi.optional) {
for (int i = 0; i < ivim->ivi.optional->list.count; ++i) {
switch (ivim->ivi.optional->list.array[i]->present) {
case IviContainer_PR_giv:
case EI1_IviContainer_PR_giv:
;
GeneralIviContainer_t* giv = &ivim->ivi.optional->list.array[i]->choice.giv;
EI1_GeneralIviContainer_t* giv = &ivim->ivi.optional->list.array[i]->choice.giv;
for (int j = 0; j < giv->list.count; ++j) {
GicPart_t* gicp = giv->list.array[j];
EI1_GicPart_t* gicp = giv->list.array[j];
for (int k = 0; k < gicp->roadSignCodes.list.count; ++k) {
struct RSCode__code* code = &gicp->roadSignCodes.list.array[k]->code;
struct EI1_RSCode__code* code = &gicp->roadSignCodes.list.array[k]->code;
switch (code->present) {
case RSCode__code_PR_viennaConvention:
case EI1_RSCode__code_PR_viennaConvention:
if (!permissions_check(IVI_DIID_ViennaCodeConvention, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
case RSCode__code_PR_iso14823:
case EI1_RSCode__code_PR_iso14823:
switch (code->choice.iso14823.pictogramCode.serviceCategoryCode.present) {
case ISO14823Code__pictogramCode__serviceCategoryCode_PR_trafficSignPictogram:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode_PR_trafficSignPictogram:
switch (code->choice.iso14823.pictogramCode.serviceCategoryCode.choice.trafficSignPictogram) {
case ISO14823Code__pictogramCode__serviceCategoryCode__trafficSignPictogram_dangerWarning:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode__trafficSignPictogram_dangerWarning:
if (!permissions_check(IVI_DIID_TrafficSignPictogramDangerWarning, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
case ISO14823Code__pictogramCode__serviceCategoryCode__trafficSignPictogram_regulatory:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode__trafficSignPictogram_regulatory:
if (!permissions_check(IVI_DIID_TrafficSignPictogramRegulatory, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
case ISO14823Code__pictogramCode__serviceCategoryCode__trafficSignPictogram_informative:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode__trafficSignPictogram_informative:
if (!permissions_check(IVI_DIID_TrafficSignPictogramInformative, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
}
break;
case ISO14823Code__pictogramCode__serviceCategoryCode_PR_publicFacilitiesPictogram:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode_PR_publicFacilitiesPictogram:
if (!permissions_check(IVI_DIID_ServiceCategoryCodePublicFacilitiesPictogram, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
case ISO14823Code__pictogramCode__serviceCategoryCode_PR_ambientOrRoadConditionPictogram:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode_PR_ambientOrRoadConditionPictogram:
switch (code->choice.iso14823.pictogramCode.serviceCategoryCode.choice.ambientOrRoadConditionPictogram) {
case ISO14823Code__pictogramCode__serviceCategoryCode__ambientOrRoadConditionPictogram_ambientCondition:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode__ambientOrRoadConditionPictogram_ambientCondition:
if (!permissions_check(IVI_DIID_ServiceCategoryCodeAmbientOrRoadConditionPictogramAmbientCondition, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
case ISO14823Code__pictogramCode__serviceCategoryCode__ambientOrRoadConditionPictogram_roadCondition:
case EI1_ISO14823Code__pictogramCode__serviceCategoryCode__ambientOrRoadConditionPictogram_roadCondition:
if (!permissions_check(IVI_DIID_ServiceCategoryCodeAmbientOrRoadConditionPictogramRoadCondition, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
}
@ -152,7 +152,7 @@ static enum SERVICE_EVAL_R service_check(enum SERVICE_TYPE type, void* its_msg,
}
break;
case RSCode__code_PR_itisCodes:
case EI1_RSCode__code_PR_itisCodes:
if (!permissions_check(IVI_DIID_itisCodes, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
@ -168,15 +168,15 @@ static enum SERVICE_EVAL_R service_check(enum SERVICE_TYPE type, void* its_msg,
} // end giv list for
break;
case IviContainer_PR_rcc:
case EI1_IviContainer_PR_rcc:
if (!permissions_check(IVI_DIID_rcc, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
case IviContainer_PR_tc:
case EI1_IviContainer_PR_tc:
if (!permissions_check(IVI_DIID_tc, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
case IviContainer_PR_lac:
case EI1_IviContainer_PR_lac:
if (!permissions_check(IVI_DIID_lac, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
break;
@ -188,7 +188,7 @@ static enum SERVICE_EVAL_R service_check(enum SERVICE_TYPE type, void* its_msg,
} // end optional list for
} // end optional if
if (ivim->ivi.mandatory.iviStatus == IviStatus_negation) {
if (ivim->ivi.mandatory.iviStatus == EI1_IviStatus_negation) {
if (!permissions_check(IVI_DIID_StatusNegation, ssp, ssp_len)) {return SERVICE_BAD_PERMISSIONS;}
}
} // end parameters check
@ -262,7 +262,7 @@ static int service_add(enum SERVICE_TYPE type, void* its_msg, uint64_t* id) {
return -1;
}
IVIM_t* ivim = (IVIM_t*) its_msg;
EI1_IVIM_t* ivim = (EI1_IVIM_t*) its_msg;
uint64_t now = itss_time_get();
@ -350,7 +350,7 @@ static int service_update(enum SERVICE_TYPE type, void* its_msg, uint64_t* id) {
return -1;
}
IVIM_t* ivim = (IVIM_t*) its_msg;
EI1_IVIM_t* ivim = (EI1_IVIM_t*) its_msg;
uint64_t now = itss_time_get();
@ -438,7 +438,7 @@ static int service_update(enum SERVICE_TYPE type, void* its_msg, uint64_t* id) {
infrastructure->services[index]->valid_to = now + 600 * 1000;
}
ASN_STRUCT_FREE(asn_DEF_IVIM, infrastructure->services[index]->ivim);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, infrastructure->services[index]->ivim);
infrastructure->services[index]->ivim = ivim;
}
@ -459,23 +459,23 @@ enum SERVICE_EVAL_R service_eval(enum SERVICE_TYPE type, void* its_msg, uint64_t
log_debug("[infrastructure] new service received");
if (service_add(type, its_msg, id)) {
log_debug("[infrastructure] failed adding service, max services reached");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
rv = -1;
}
break;
case SERVICE_INVALID:
log_debug("[infrastructure] invalid service received, ignoring");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
break;
case SERVICE_PASSED:
log_debug("[infrastructure] old service received, ignoring");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
break;
case SERVICE_CANCELLATION:
log_debug("[infrastructure] service cancellation received");
if (service_update(type, its_msg, id)) {
log_debug("[infrastructure] failed cancelling service, event not found");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
rv = -1;
}
break;
@ -483,7 +483,7 @@ enum SERVICE_EVAL_R service_eval(enum SERVICE_TYPE type, void* its_msg, uint64_t
log_debug("[infrastructure] service negation received");
if (service_update(type, its_msg, id)) {
log_debug("[infrastructure] failed negating service, service not found");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
rv = -1;
}
break;
@ -491,21 +491,21 @@ enum SERVICE_EVAL_R service_eval(enum SERVICE_TYPE type, void* its_msg, uint64_t
log_debug("[infrastructure] service update received");
if (service_update(type, its_msg, id)) {
log_debug("[infrastructure] failed updating service, service not found");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
rv = -1;
}
break;
case SERVICE_REPEATED:
log_debug("[infrastructure] repeated service received or timeStamp doesn't allow an update, ignoring");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
break;
case SERVICE_NUMBER_EXCEEDED:
log_debug("[infrastructure] max services reached, ignoring");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
break;
case SERVICE_BAD_PERMISSIONS:
log_debug("[infrastructure] invalid service permissions, ignoring");
ASN_STRUCT_FREE(asn_DEF_IVIM, its_msg);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, its_msg);
break;
}
return rv;
@ -542,7 +542,7 @@ void* infrastructure_service() {
log_debug("[infrastructure] removed service %d (expiration)", i);
infrastructure->services[i]->enabled = false;
ASN_STRUCT_FREE(asn_DEF_IVIM, infrastructure->services[i]->ivim);
ASN_STRUCT_FREE(asn_DEF_EI1_IVIM, infrastructure->services[i]->ivim);
switch (infrastructure->services[i]->state) {
case SERVICE_ACTIVE:
--infrastructure->n_active_services;

View File

@ -1,7 +1,7 @@
#pragma once
#include <stdint.h>
#include <it2s-asn/ivim/IVIM.h>
#include <it2s-asn/etsi-its-v1/ivim/EI1_IVIM.h>
#include <pthread.h>
#include <stdbool.h>
#include <it2s-tender/epv.h>
@ -49,7 +49,7 @@ typedef struct service {
uint32_t station_id;
enum SERVICE_STATE state;
IVIM_t *ivim;
EI1_IVIM_t *ivim;
uint64_t ivi_id_number;
uint64_t timestamp;
uint64_t valid_from;

View File

@ -1,12 +1,11 @@
#include "requests.h"
#include <it2s-asn/camv2/asn_application.h>
#include <it2s-asn/cpm/CPM.h>
#include <it2s-asn/itss-facilities/FacilitiesReply.h>
#include <it2s-asn/itss-networking/NetworkingRequest.h>
#include <it2s-asn/itss-facilities/FacilitiesIndication.h>
#include <it2s-asn/itss-security/SecurityRequest.h>
#include <it2s-asn/itss-security/SecurityReply.h>
#include <it2s-asn/etsi-its-v1/cpm/EI1_CPM.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesReply.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityReply.h>
#include <it2s-tender/packet.h>
#include <it2s-tender/recorder.h>
#include <it2s-tender/space.h>
@ -22,11 +21,11 @@
#include "tpm.h"
static void fwd_to_apps(uint8_t* msg, uint16_t msg_len, int its_msg_type, uint32_t iid) {
FacilitiesIndication_t* fi = NULL;
EIS_FacilitiesIndication_t* fi = NULL;
fi = calloc(1, sizeof(FacilitiesIndication_t));
fi->present = FacilitiesIndication_PR_message;
FacilitiesMessageIndication_t *fmi = &fi->choice.message;
fi = calloc(1, sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_message;
EIS_FacilitiesMessageIndication_t *fmi = &fi->choice.message;
fmi->id = iid;
@ -38,7 +37,7 @@ static void fwd_to_apps(uint8_t* msg, uint16_t msg_len, int its_msg_type, uint32
uint8_t buffer[ITSS_SDU_MAX_LEN];
buffer[0] = 4; // Facilities
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesIndication, NULL, fi, buffer + 1, ITSS_SDU_MAX_LEN - 1);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesIndication, NULL, fi, buffer + 1, ITSS_SDU_MAX_LEN - 1);
log_debug("-> FI.message ->[applications] | id:%08x size:%dB",
(uint32_t)iid, enc.encoded+1);
@ -50,45 +49,45 @@ static void fwd_to_apps(uint8_t* msg, uint16_t msg_len, int its_msg_type, uint32
(uint32_t)iid, enc.encoded+1);
}
ASN_STRUCT_FREE(asn_DEF_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesIndication, fi);
}
int facilities_request_result_accepted(void *responder) {
int rv = 0;
FacilitiesReply_t *fr = calloc(1, sizeof(FacilitiesReply_t));
fr->present = FacilitiesReply_PR_message;
EIS_FacilitiesReply_t *fr = calloc(1, sizeof(EIS_FacilitiesReply_t));
fr->present = EIS_FacilitiesReply_PR_message;
fr->choice.message.returnCode = 0;
uint8_t fr_oer[32];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesReply, NULL, fr, fr_oer, 32);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesReply, NULL, fr, fr_oer, 32);
itss_0send(responder, fr_oer, enc.encoded);
ASN_STRUCT_FREE(asn_DEF_FacilitiesReply, fr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesReply, fr);
return rv;
}
int facilities_request_result_rejected(void *responder) {
int rv = 0;
FacilitiesReply_t *fr = calloc(1, sizeof(FacilitiesReply_t));
fr->present = FacilitiesReply_PR_message;
EIS_FacilitiesReply_t *fr = calloc(1, sizeof(EIS_FacilitiesReply_t));
fr->present = EIS_FacilitiesReply_PR_message;
fr->choice.message.returnCode = 1;
uint8_t fr_oer[32];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesReply, NULL, fr, fr_oer, 32);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesReply, NULL, fr, fr_oer, 32);
itss_0send(responder, fr_oer, enc.encoded);
ASN_STRUCT_FREE(asn_DEF_FacilitiesReply, fr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesReply, fr);
return rv;
}
int facilities_request_single_message(void *responder, FacilitiesMessageRequest_t *frm) {
int facilities_request_single_message(void *responder, EIS_FacilitiesMessageRequest_t *frm) {
int rv = 0;
NetworkingRequest_t* nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
npr->transport.present = NetworkingPacketRequestTP_PR_btp;
EIS_NetworkingRequest_t* nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_btp;
void *its_msg = NULL;
asn_TYPE_descriptor_t *its_msg_def = NULL;
@ -100,44 +99,44 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
uint64_t transmission_start = 0;
switch (frm->itsMessageType) {
case ItsMessageType_cam:
its_msg_def = &asn_DEF_CAM;
its_msg = calloc(1, sizeof(CAM_t));
npr->transport.choice.btp.destinationPort = Port_cam;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
case EIS_ItsMessageType_cam:
its_msg_def = &asn_DEF_EI1_CAM;
its_msg = calloc(1, sizeof(EI1_CAM_t));
npr->transport.choice.btp.destinationPort = EIS_Port_cam;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.trafficClass = 1;
break;
case ItsMessageType_denm:
its_msg_def = &asn_DEF_DENM;
its_msg = calloc(1, sizeof(DENM_t));
npr->transport.choice.btp.destinationPort = Port_denm;
npr->network.choice.gn.packetTransportType = PacketTransportType_gbc;
case EIS_ItsMessageType_denm:
its_msg_def = &asn_DEF_EI1_DENM;
its_msg = calloc(1, sizeof(EI1_DENM_t));
npr->transport.choice.btp.destinationPort = EIS_Port_denm;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_gbc;
npr->network.choice.gn.trafficClass = 2;
break;
case ItsMessageType_ivim:
its_msg_def = &asn_DEF_IVIM;
its_msg = calloc(1, sizeof(IVIM_t));
npr->transport.choice.btp.destinationPort = Port_ivim;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
case EIS_ItsMessageType_ivim:
its_msg_def = &asn_DEF_EI1_IVIM;
its_msg = calloc(1, sizeof(EI1_IVIM_t));
npr->transport.choice.btp.destinationPort = EIS_Port_ivim;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.trafficClass = 1;
break;
case ItsMessageType_cpm:
its_msg_def = &asn_DEF_CPM;
its_msg = calloc(1, sizeof(CPM_t));
npr->transport.choice.btp.destinationPort = Port_cpm;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
case EIS_ItsMessageType_cpm:
its_msg_def = &asn_DEF_EI1_CPM;
its_msg = calloc(1, sizeof(EI1_CPM_t));
npr->transport.choice.btp.destinationPort = EIS_Port_cpm;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.trafficClass = 2;
break;
case ItsMessageType_evrsr:
its_msg_def = &asn_DEF_EV_RSR;
its_msg = calloc(1, sizeof(EV_RSR_t));
npr->transport.choice.btp.destinationPort = Port_evrsr;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
case EIS_ItsMessageType_evrsr:
its_msg_def = &asn_DEF_EI1_EV_RSR;
its_msg = calloc(1, sizeof(EI1_EV_RSR_t));
npr->transport.choice.btp.destinationPort = EIS_Port_evrsr;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.trafficClass = 1;
break;
@ -166,7 +165,7 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
bool is_update = false;
int managed_msg = false;
if (frm->itsMessageType == ItsMessageType_denm) {
if (frm->itsMessageType == EIS_ItsMessageType_denm) {
managed_msg = true;
uint8_t event_type = event_manage(its_msg, &id, NULL, 0);
@ -188,21 +187,21 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
if (fwd) {
// set stationID
pthread_mutex_lock(&facilities.id.lock);
((DENM_t *)its_msg)->header.stationID = facilities.id.station_id;
((EI1_DENM_t *)its_msg)->header.stationID = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
// Set only one trace
if (facilities.station_type != 15) {
pthread_mutex_lock(&facilities.lightship.lock);
if (facilities.lightship.path_history_len > 0) {
if (!((DENM_t *)its_msg)->denm.location) {
((DENM_t *)its_msg)->denm.location = calloc(1, sizeof(LocationContainer_t));
if (!((EI1_DENM_t *)its_msg)->denm.location) {
((EI1_DENM_t *)its_msg)->denm.location = calloc(1, sizeof(EI1_LocationContainer_t));
}
((DENM_t *)its_msg)->denm.location->traces.list.count = 1;
((DENM_t *)its_msg)->denm.location->traces.list.size = 1 * sizeof(void *);
((DENM_t *)its_msg)->denm.location->traces.list.array = malloc(1 * sizeof(void *));
((DENM_t *)its_msg)->denm.location->traces.list.array[0] = calloc(1, sizeof(PathHistory_t));
PathHistory_t *ph = ((DENM_t *)its_msg)->denm.location->traces.list.array[0];
((EI1_DENM_t *)its_msg)->denm.location->traces.list.count = 1;
((EI1_DENM_t *)its_msg)->denm.location->traces.list.size = 1 * sizeof(void *);
((EI1_DENM_t *)its_msg)->denm.location->traces.list.array = malloc(1 * sizeof(void *));
((EI1_DENM_t *)its_msg)->denm.location->traces.list.array[0] = calloc(1, sizeof(EI1_PathHistory_t));
EI1_PathHistory_t *ph = ((EI1_DENM_t *)its_msg)->denm.location->traces.list.array[0];
pos_point_t **path_history = facilities.lightship.path_history;
uint16_t path_history_len = facilities.lightship.path_history_len;
@ -211,53 +210,53 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
ph->list.count = path_history_len;
ph->list.size = (path_history_len) * sizeof(void *);
ph->list.array[0] = calloc(1, sizeof(PathPoint_t));
ph->list.array[0] = calloc(1, sizeof(EI1_PathPoint_t));
itss_space_lock();
if (path_history[0]->alt != AltitudeValue_unavailable && epv.space.altitude != AltitudeValue_unavailable) {
if (path_history[0]->alt != EI1_AltitudeValue_unavailable && epv.space.altitude != EI1_AltitudeValue_unavailable) {
ph->list.array[0]->pathPosition.deltaAltitude = path_history[0]->alt - epv.space.altitude;
} else {
ph->list.array[0]->pathPosition.deltaAltitude = DeltaAltitude_unavailable;
ph->list.array[0]->pathPosition.deltaAltitude = EI1_DeltaAltitude_unavailable;
}
if (path_history[0]->lat != Latitude_unavailable && epv.space.latitude != Latitude_unavailable) {
if (path_history[0]->lat != EI1_Latitude_unavailable && epv.space.latitude != EI1_Latitude_unavailable) {
ph->list.array[0]->pathPosition.deltaLatitude = path_history[0]->lat - epv.space.latitude;
} else {
ph->list.array[0]->pathPosition.deltaLatitude = DeltaLatitude_unavailable;
ph->list.array[0]->pathPosition.deltaLatitude = EI1_DeltaLatitude_unavailable;
}
if (path_history[0]->lon != Longitude_unavailable && epv.space.longitude != Longitude_unavailable) {
if (path_history[0]->lon != EI1_Longitude_unavailable && epv.space.longitude != EI1_Longitude_unavailable) {
ph->list.array[0]->pathPosition.deltaLongitude = path_history[0]->lon - epv.space.longitude;
} else {
ph->list.array[0]->pathPosition.deltaLongitude = DeltaLongitude_unavailable;
ph->list.array[0]->pathPosition.deltaLongitude = EI1_DeltaLongitude_unavailable;
}
itss_space_unlock();
ph->list.array[0]->pathDeltaTime = calloc(1, sizeof(PathDeltaTime_t));
ph->list.array[0]->pathDeltaTime = calloc(1, sizeof(EI1_PathDeltaTime_t));
*ph->list.array[0]->pathDeltaTime = (itss_time_get() - path_history[0]->ts) / 10;
for (int i = 1; i < path_history_len; ++i) {
ph->list.array[i] = calloc(1, sizeof(PathPoint_t));
ph->list.array[i] = calloc(1, sizeof(EI1_PathPoint_t));
if (path_history[i]->alt != AltitudeValue_unavailable && path_history[i - 1]->alt != AltitudeValue_unavailable) {
if (path_history[i]->alt != EI1_AltitudeValue_unavailable && path_history[i - 1]->alt != EI1_AltitudeValue_unavailable) {
ph->list.array[i]->pathPosition.deltaAltitude = path_history[i]->alt - path_history[i - 1]->alt;
} else {
ph->list.array[i]->pathPosition.deltaAltitude = DeltaAltitude_unavailable;
ph->list.array[i]->pathPosition.deltaAltitude = EI1_DeltaAltitude_unavailable;
}
if (path_history[i]->lat != Latitude_unavailable && path_history[i - 1]->lat != Latitude_unavailable) {
if (path_history[i]->lat != EI1_Latitude_unavailable && path_history[i - 1]->lat != EI1_Latitude_unavailable) {
ph->list.array[i]->pathPosition.deltaLatitude = path_history[i]->lat - path_history[i - 1]->lat;
} else {
ph->list.array[i]->pathPosition.deltaLatitude = DeltaLatitude_unavailable;
ph->list.array[i]->pathPosition.deltaLatitude = EI1_DeltaLatitude_unavailable;
}
if (path_history[i]->lon != Longitude_unavailable && path_history[i - 1]->lon != Longitude_unavailable) {
if (path_history[i]->lon != EI1_Longitude_unavailable && path_history[i - 1]->lon != EI1_Longitude_unavailable) {
ph->list.array[i]->pathPosition.deltaLongitude = path_history[i]->lon - path_history[i - 1]->lon;
} else {
ph->list.array[i]->pathPosition.deltaLongitude = DeltaLongitude_unavailable;
ph->list.array[i]->pathPosition.deltaLongitude = EI1_DeltaLongitude_unavailable;
}
ph->list.array[i]->pathDeltaTime = calloc(1, sizeof(PathDeltaTime_t));
ph->list.array[i]->pathDeltaTime = calloc(1, sizeof(EI1_PathDeltaTime_t));
*ph->list.array[i]->pathDeltaTime = (path_history[i - 1]->ts - path_history[i]->ts) / 10;
}
}
@ -265,17 +264,17 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
}
// get, set retransmission, duration
if (((DENM_t *)its_msg)->denm.management.transmissionInterval) {
transmission_interval = *((uint32_t *)((DENM_t *)its_msg)->denm.management.transmissionInterval);
if (((EI1_DENM_t *)its_msg)->denm.management.transmissionInterval) {
transmission_interval = *((uint32_t *)((EI1_DENM_t *)its_msg)->denm.management.transmissionInterval);
if (((DENM_t *)its_msg)->denm.management.validityDuration) {
transmission_duration = *((uint32_t *)((DENM_t *)its_msg)->denm.management.validityDuration) * 1000;
if (((EI1_DENM_t *)its_msg)->denm.management.validityDuration) {
transmission_duration = *((uint32_t *)((EI1_DENM_t *)its_msg)->denm.management.validityDuration) * 1000;
} else {
transmission_duration = 600 * 1000;
}
}
}
} else if (frm->itsMessageType == ItsMessageType_ivim) {
} else if (frm->itsMessageType == EIS_ItsMessageType_ivim) {
managed_msg = true;
uint8_t service_type = service_eval(SERVICE_IVI, its_msg, &id, NULL, 0);
@ -296,23 +295,23 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
if (fwd) {
uint64_t valid_to, valid_from;
if (!((IVIM_t *)its_msg)->ivi.mandatory.validFrom) {
if (!((EI1_IVIM_t *)its_msg)->ivi.mandatory.validFrom) {
valid_from = itss_time_get();
} else {
asn_INTEGER2ulong((INTEGER_t *)((IVIM_t *)its_msg)->ivi.mandatory.validFrom, (unsigned long long *)&valid_from);
asn_INTEGER2ulong((INTEGER_t *)((EI1_IVIM_t *)its_msg)->ivi.mandatory.validFrom, (unsigned long long *)&valid_from);
}
if (!((IVIM_t *)its_msg)->ivi.mandatory.validTo) {
if (!((EI1_IVIM_t *)its_msg)->ivi.mandatory.validTo) {
valid_to = valid_from + facilities.infrastructure.default_service_duration;
} else {
asn_INTEGER2ulong((INTEGER_t *)((IVIM_t *)its_msg)->ivi.mandatory.validTo, (unsigned long long *)&valid_to);
asn_INTEGER2ulong((INTEGER_t *)((EI1_IVIM_t *)its_msg)->ivi.mandatory.validTo, (unsigned long long *)&valid_to);
}
transmission_start = valid_from;
transmission_interval = facilities.infrastructure.replay_interval;
transmission_duration = valid_to - valid_from;
}
} else if (frm->itsMessageType == ItsMessageType_evrsr) {
} else if (frm->itsMessageType == EIS_ItsMessageType_evrsr) {
managed_msg = true;
}
if (!facilities.replay) {
@ -325,7 +324,7 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
// Forward message to [networking]
if (fwd) {
npr->transport.choice.btp.btpType = BTPType_btpB;
npr->transport.choice.btp.btpType = EIS_BTPType_btpB;
npr->id = id;
@ -367,7 +366,7 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
uint8_t tr_oer[2048];
tr_oer[0] = 4; // [facilities] service id
enc = oer_encode_to_buffer(&asn_DEF_NetworkingRequest, NULL, nr, tr_oer + 1, 2047);
enc = oer_encode_to_buffer(&asn_DEF_EIS_NetworkingRequest, NULL, nr, tr_oer + 1, 2047);
if (enc.encoded == -1) {
log_error("failed encoding TR (%s)", enc.failed_type->name);
rv = 1;
@ -398,19 +397,19 @@ int facilities_request_single_message(void *responder, FacilitiesMessageRequest_
cleanup:
if (its_msg_def && !managed_msg)
ASN_STRUCT_FREE(*its_msg_def, its_msg);
ASN_STRUCT_FREE(asn_DEF_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingRequest, nr);
return rv;
}
int facilities_request_active_episodes(void *responder, FacilitiesRequest_t *freq) {
int facilities_request_active_episodes(void *responder, EIS_FacilitiesRequest_t *freq) {
int rv = 0;
FacilitiesReply_t *frep = calloc(1, sizeof(FacilitiesReply_t));
EIS_FacilitiesReply_t *frep = calloc(1, sizeof(EIS_FacilitiesReply_t));
uint8_t *frep_oer = NULL;
frep->present = FacilitiesReply_PR_data;
frep->choice.data.present = FacilitiesDataReply_PR_episodes;
frep->present = EIS_FacilitiesReply_PR_data;
frep->choice.data.present = EIS_FacilitiesDataReply_PR_episodes;
pthread_mutex_lock(&facilities.den.lock);
pthread_mutex_lock(&facilities.infrastructure.lock);
@ -422,10 +421,10 @@ int facilities_request_active_episodes(void *responder, FacilitiesRequest_t *fre
for (int e = 0; e < freq->choice.data.choice.activeEpisodes.list.count; ++e) {
switch (*freq->choice.data.choice.activeEpisodes.list.array[e]) {
case EpisodeType_denm:
case EIS_EpisodeType_denm:
na += nae;
break;
case EpisodeType_ivim:
case EIS_EpisodeType_ivim:
na += nas;
break;
}
@ -437,13 +436,13 @@ int facilities_request_active_episodes(void *responder, FacilitiesRequest_t *fre
for (int e = 0, j = 0; e < freq->choice.data.choice.activeEpisodes.list.count; ++e) {
switch (*freq->choice.data.choice.activeEpisodes.list.array[e]) {
case EpisodeType_denm:
case EIS_EpisodeType_denm:
for (int i = 0, n = 0; n < nae; ++i) {
if (facilities.den.events[i]->enabled && facilities.den.events[i]->state == EVENT_ACTIVE) {
frep->choice.data.choice.episodes.list.array[j] = calloc(1, sizeof(ItsMessage_t));
frep->choice.data.choice.episodes.list.array[j]->itsMessageType = ItsMessageType_denm;
frep->choice.data.choice.episodes.list.array[j] = calloc(1, sizeof(EIS_ItsMessage_t));
frep->choice.data.choice.episodes.list.array[j]->itsMessageType = EIS_ItsMessageType_denm;
frep->choice.data.choice.episodes.list.array[j]->data.buf = malloc(2048);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_DENM, NULL, facilities.den.events[i]->denm, frep->choice.data.choice.episodes.list.array[j]->data.buf, 2048);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_DENM, NULL, facilities.den.events[i]->denm, frep->choice.data.choice.episodes.list.array[j]->data.buf, 2048);
if (enc.encoded == -1) { /* encoding shouldn't fail as all saved DENMs are structurally valid */
log_error("failed encoding DENM for FDResult (%s)", enc.failed_type->name);
frep->choice.data.choice.episodes.list.array[j]->data.size = 0;
@ -455,13 +454,13 @@ int facilities_request_active_episodes(void *responder, FacilitiesRequest_t *fre
}
}
break;
case EpisodeType_ivim:
case EIS_EpisodeType_ivim:
for (int i = 0, n = 0; n < nas; ++i) {
if (facilities.infrastructure.services[i]->enabled && facilities.infrastructure.services[i]->state == SERVICE_ACTIVE) {
frep->choice.data.choice.episodes.list.array[j] = calloc(1, sizeof(ItsMessage_t));
frep->choice.data.choice.episodes.list.array[j]->itsMessageType = ItsMessageType_ivim;
frep->choice.data.choice.episodes.list.array[j] = calloc(1, sizeof(EIS_ItsMessage_t));
frep->choice.data.choice.episodes.list.array[j]->itsMessageType = EIS_ItsMessageType_ivim;
frep->choice.data.choice.episodes.list.array[j]->data.buf = malloc(2048);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_IVIM, NULL, facilities.infrastructure.services[i]->ivim, frep->choice.data.choice.episodes.list.array[j]->data.buf, 2048);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_IVIM, NULL, facilities.infrastructure.services[i]->ivim, frep->choice.data.choice.episodes.list.array[j]->data.buf, 2048);
if (enc.encoded == -1) { /* encoding shouldn't fail as all saved DENMs are structurally valid */
log_error("failed encoding IVIM for FDResult (%s)", enc.failed_type->name);
frep->choice.data.choice.episodes.list.array[j]->data.size = 0;
@ -488,7 +487,7 @@ int facilities_request_active_episodes(void *responder, FacilitiesRequest_t *fre
pthread_mutex_unlock(&facilities.infrastructure.lock);
frep_oer = malloc(32768);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesReply, NULL, frep, frep_oer, 32768);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesReply, NULL, frep, frep_oer, 32768);
if (enc.encoded == -1) {
log_error("failed encoding FReply (%s)", enc.failed_type->name);
@ -501,26 +500,26 @@ int facilities_request_active_episodes(void *responder, FacilitiesRequest_t *fre
cleanup:
free(frep_oer);
ASN_STRUCT_FREE(asn_DEF_FacilitiesReply, frep);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesReply, frep);
return rv;
}
int facilities_request_attribute_types(void *responder, FacilitiesRequest_t *freq) {
int facilities_request_attribute_types(void *responder, EIS_FacilitiesRequest_t *freq) {
int rv = 0;
FacilitiesReply_t *frep = calloc(1, sizeof(FacilitiesReply_t));
frep->present = FacilitiesReply_PR_data;
EIS_FacilitiesReply_t *frep = calloc(1, sizeof(EIS_FacilitiesReply_t));
frep->present = EIS_FacilitiesReply_PR_data;
int nra = freq->choice.data.choice.attributeTypes.list.count;
frep->choice.data.present = FacilitiesDataReply_PR_attributes;
frep->choice.data.present = EIS_FacilitiesDataReply_PR_attributes;
frep->choice.data.choice.attributes.list.count = nra;
frep->choice.data.choice.attributes.list.size = sizeof(void *) * nra;
frep->choice.data.choice.attributes.list.array = malloc(sizeof(void *) * nra);
for (int j = 0; j < nra; ++j) {
switch (*freq->choice.data.choice.attributeTypes.list.array[j]) {
case FacilitiesAttributeType_stationId:
frep->choice.data.choice.attributes.list.array[j] = calloc(1, sizeof(FacilitiesAttribute_t));
case EIS_FacilitiesAttributeType_stationId:
frep->choice.data.choice.attributes.list.array[j] = calloc(1, sizeof(EIS_FacilitiesAttribute_t));
frep->choice.data.choice.attributes.list.array[j]->data.size = 8;
frep->choice.data.choice.attributes.list.array[j]->data.buf = malloc(8);
pthread_mutex_lock(&facilities.id.lock);
@ -536,7 +535,7 @@ int facilities_request_attribute_types(void *responder, FacilitiesRequest_t *fre
}
}
uint8_t frep_oer[256];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesReply, NULL, frep, frep_oer, 256);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesReply, NULL, frep, frep_oer, 256);
if (enc.encoded == -1) {
log_error("failed encoding FReply (%s)", enc.failed_type->name);
facilities_request_result_rejected(responder);
@ -547,18 +546,18 @@ int facilities_request_attribute_types(void *responder, FacilitiesRequest_t *fre
itss_0send(responder, frep_oer, enc.encoded);
cleanup:
ASN_STRUCT_FREE(asn_DEF_FacilitiesReply, frep);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesReply, frep);
return rv;
}
int facilities_request_loaded_protected_zones(void *responder, FacilitiesRequest_t *freq) {
int facilities_request_loaded_protected_zones(void *responder, EIS_FacilitiesRequest_t *freq) {
int rv = 0;
FacilitiesReply_t *frep = calloc(1, sizeof(FacilitiesReply_t));
EIS_FacilitiesReply_t *frep = calloc(1, sizeof(EIS_FacilitiesReply_t));
frep->present = FacilitiesReply_PR_data;
frep->choice.data.present = FacilitiesDataReply_PR_protectedCommunicationZones;
frep->present = EIS_FacilitiesReply_PR_data;
frep->choice.data.present = EIS_FacilitiesDataReply_PR_protectedCommunicationZones;
pthread_mutex_lock(&facilities.lightship.lock);
@ -568,15 +567,15 @@ int facilities_request_loaded_protected_zones(void *responder, FacilitiesRequest
uint8_t buf[256];
for (int z = 0; z < facilities.lightship.protected_zones.pz_len; ++z) {
frep->choice.data.choice.protectedCommunicationZones.list.array[z] = calloc(1, sizeof(ProtectedCommunicationZone_t));
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_ProtectedCommunicationZone, NULL, facilities.lightship.protected_zones.pz[z], buf, 256);
uper_decode_complete(NULL, &asn_DEF_ProtectedCommunicationZone, (void **)&frep->choice.data.choice.protectedCommunicationZones.list.array[z], buf, (enc.encoded + 7) / 8);
frep->choice.data.choice.protectedCommunicationZones.list.array[z] = calloc(1, sizeof(EIS_ProtectedCommunicationZone_t));
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EIS_ProtectedCommunicationZone, NULL, facilities.lightship.protected_zones.pz[z], buf, 256);
uper_decode_complete(NULL, &asn_DEF_EIS_ProtectedCommunicationZone, (void **)&frep->choice.data.choice.protectedCommunicationZones.list.array[z], buf, (enc.encoded + 7) / 8);
}
pthread_mutex_unlock(&facilities.lightship.lock);
uint8_t frep_oer[1024];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesReply, NULL, frep, frep_oer, 1024);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesReply, NULL, frep, frep_oer, 1024);
if (enc.encoded == -1) {
log_error("failed encoding FDResult (%s)", enc.failed_type->name);
facilities_request_result_rejected(responder);
@ -587,12 +586,12 @@ int facilities_request_loaded_protected_zones(void *responder, FacilitiesRequest
itss_0send(responder, frep_oer, enc.encoded);
cleanup:
ASN_STRUCT_FREE(asn_DEF_FacilitiesReply, frep);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesReply, frep);
return rv;
}
int facilities_request_chaininfo_set(void *responder, ChainInformationSet_t *cis) {
int facilities_request_chaininfo_set(void *responder, EIS_ChainInformationSet_t *cis) {
int rv = 0;
pthread_mutex_lock(&facilities.coordination.lock);
@ -607,13 +606,13 @@ int facilities_request_chaininfo_set(void *responder, ChainInformationSet_t *cis
// TODO region
pthread_mutex_unlock(&facilities.coordination.lock);
FacilitiesReply_t *frep = calloc(1, sizeof(FacilitiesReply_t));
frep->present = FacilitiesReply_PR_data;
frep->choice.data.present = FacilitiesDataReply_PR_chainInfoSet;
frep->choice.data.choice.chainInfoSet = FacilitiesResultCode_accepted;
EIS_FacilitiesReply_t *frep = calloc(1, sizeof(EIS_FacilitiesReply_t));
frep->present = EIS_FacilitiesReply_PR_data;
frep->choice.data.present = EIS_FacilitiesDataReply_PR_chainInfoSet;
frep->choice.data.choice.chainInfoSet = EIS_FacilitiesResultCode_accepted;
uint8_t frep_oer[1024];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesReply, NULL, frep, frep_oer, 1024);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesReply, NULL, frep, frep_oer, 1024);
if (enc.encoded == -1) {
log_error("failed encoding FDResult (%s)", enc.failed_type->name);
facilities_request_result_rejected(responder);
@ -624,17 +623,17 @@ int facilities_request_chaininfo_set(void *responder, ChainInformationSet_t *cis
itss_0send(responder, frep_oer, enc.encoded);
cleanup:
ASN_STRUCT_FREE(asn_DEF_FacilitiesReply, frep);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesReply, frep);
return rv;
}
static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, void** security_socket) {
static int networking_packet_indication_btp(EIS_NetworkingPacketIndication_t* npi, void** security_socket) {
int rv = 0;
BTPPacketIndication_t* bpi = &npi->transport.choice.btp;
EIS_BTPPacketIndication_t* bpi = &npi->transport.choice.btp;
FacilitiesIndication_t *fi = NULL;
EIS_FacilitiesIndication_t *fi = NULL;
asn_TYPE_descriptor_t *its_msg_descriptor = NULL;
void *its_msg = NULL;
@ -650,58 +649,58 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
// Parse message
switch (bpi->destinationPort) {
case Port_cam:
its_msg_descriptor = &asn_DEF_CAM;
its_msg = calloc(1, sizeof(CAM_t));
its_msg_type = messageID_cam;
case EIS_Port_cam:
its_msg_descriptor = &asn_DEF_EI1_CAM;
its_msg = calloc(1, sizeof(EI1_CAM_t));
its_msg_type = EI1_messageID_cam;
break;
case Port_denm:
its_msg_descriptor = &asn_DEF_DENM;
its_msg = calloc(1, sizeof(DENM_t));
its_msg_type = messageID_denm;
case EIS_Port_denm:
its_msg_descriptor = &asn_DEF_EI1_DENM;
its_msg = calloc(1, sizeof(EI1_DENM_t));
its_msg_type = EI1_messageID_denm;
break;
case Port_ivim:
its_msg_descriptor = &asn_DEF_IVIM;
its_msg = calloc(1, sizeof(IVIM_t));
its_msg_type = messageID_ivim;
case EIS_Port_ivim:
its_msg_descriptor = &asn_DEF_EI1_IVIM;
its_msg = calloc(1, sizeof(EI1_IVIM_t));
its_msg_type = EI1_messageID_ivim;
break;
case Port_cpm:
its_msg_descriptor = &asn_DEF_CPM;
its_msg = calloc(1, sizeof(CPM_t));
case EIS_Port_cpm:
its_msg_descriptor = &asn_DEF_EI1_CPM;
its_msg = calloc(1, sizeof(EI1_CPM_t));
its_msg_type = 14;
break;
case Port_saem:
its_msg_descriptor = &asn_DEF_SAEM;
its_msg = calloc(1, sizeof(SAEM_t));
its_msg_type = messageID_saem;
case EIS_Port_saem:
its_msg_descriptor = &asn_DEF_EI1_SAEM;
its_msg = calloc(1, sizeof(EI1_SAEM_t));
its_msg_type = EI1_messageID_saem;
break;
case 7011: /* tolling */
its_msg_descriptor = &asn_DEF_TPM;
its_msg = calloc(1, sizeof(TPM_t));
its_msg_descriptor = &asn_DEF_EI1_TPM;
its_msg = calloc(1, sizeof(EI1_TPM_t));
its_msg_type = 117;
break;
case 2043: /* maneuvers */
its_msg_descriptor = &asn_DEF_VCM;
its_msg = calloc(1, sizeof(VCM_t));
its_msg_descriptor = &asn_DEF_EI1_VCM;
its_msg = calloc(1, sizeof(EI1_VCM_t));
its_msg_type = 43;
break;
case Port_poi: /* EVCSNM */
its_msg_descriptor = &asn_DEF_EvcsnPdu;
its_msg = calloc(1, sizeof(EvcsnPdu_t));
its_msg_type = messageID_evcsn;
case EIS_Port_poi: /* EVCSNM */
its_msg_descriptor = &asn_DEF_EI1_EvcsnPdu;
its_msg = calloc(1, sizeof(EI1_EvcsnPdu_t));
its_msg_type = EI1_messageID_evcsn;
break;
case Port_evrsr: /* EVRSRM */
its_msg_descriptor = &asn_DEF_EV_RSR;
its_msg = calloc(1, sizeof(EV_RSR_t));
its_msg_type = messageID_evcsn;
case EIS_Port_evrsr: /* EVRSRM */
its_msg_descriptor = &asn_DEF_EI1_EV_RSR;
its_msg = calloc(1, sizeof(EI1_EV_RSR_t));
its_msg_type = EI1_messageID_evcsn;
break;
default:
@ -722,7 +721,7 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
uint8_t* neighbour_cert = NULL;
switch (npi->network.present) {
case NetworkingPacketRequestNW_PR_gn:
case EIS_NetworkingPacketRequestNW_PR_gn:
if (npi->network.choice.gn.securityPermissions) {
ssp = npi->network.choice.gn.securityPermissions->ssp.buf;
ssp_len = npi->network.choice.gn.securityPermissions->ssp.size;
@ -731,7 +730,7 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
neighbour_cert = npi->network.choice.gn.securityNeighbour->buf;
}
break;
case NetworkingPacketRequestNW_PR_gn6a:
case EIS_NetworkingPacketRequestNW_PR_gn6a:
if (npi->network.choice.gn6a.gn.securityPermissions) {
ssp = npi->network.choice.gn6a.gn.securityPermissions->ssp.buf;
ssp_len = npi->network.choice.gn6a.gn.securityPermissions->ssp.size;
@ -746,7 +745,7 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
// Manage message
switch (bpi->destinationPort) {
case Port_cam:
case EIS_Port_cam:
switch (check_cam(bpi, its_msg, ssp, ssp_len)) {
case CAM_OK:
fwd = true;
@ -758,7 +757,7 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
}
break;
case Port_denm:
case EIS_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);
@ -782,7 +781,7 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
}
break;
case Port_ivim:
case EIS_Port_ivim:
stored = true;
switch (service_eval(SERVICE_IVI, its_msg, &id, ssp, ssp_len)) {
case SERVICE_NEW:
@ -801,7 +800,7 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
}
break;
case Port_saem:
case EIS_Port_saem:
switch (saem_check(its_msg, neighbour_cert)) {
case SAEM_NEW:
fwd = true;
@ -831,18 +830,18 @@ static int networking_packet_indication_btp(NetworkingPacketIndication_t* npi, v
}
break;
case Port_poi:
case EIS_Port_poi:
if (facilities.evm_args.activate) {
evcsnm_check(its_msg);
fwd = true;
}
break;
case Port_evrsr:
case EIS_Port_evrsr:
if (facilities.evm_args.activate) {
evrsrm_check(its_msg);
fwd = true;
EV_RSR_t *evrsr_request = (EV_RSR_t *)its_msg;
EI1_EV_RSR_t *evrsr_request = (EI1_EV_RSR_t *)its_msg;
evrsrm_recv(evrsr_request);
}
break;
@ -882,29 +881,29 @@ cleanup:
if (its_msg && !stored) {
ASN_STRUCT_FREE(*its_msg_descriptor, its_msg);
}
ASN_STRUCT_FREE(asn_DEF_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesIndication, fi);
return rv;
}
static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, void** security_socket) {
static int networking_packet_indication_tcp(EIS_NetworkingPacketIndication_t* npi, void** security_socket) {
int rv = 0;
TCPPacketIndication_t* tpi = &npi->transport.choice.tcp;
EIS_TCPPacketIndication_t* tpi = &npi->transport.choice.tcp;
uint16_t buf_len = 2048;
uint8_t buf[buf_len];
SecurityRequest_t* sreq = NULL;
SecurityReply_t* srep = NULL;
NetworkingRequest_t* nr = NULL;
FacilitiesIndication_t* fi = NULL;
EIS_SecurityRequest_t* sreq = NULL;
EIS_SecurityReply_t* srep = NULL;
EIS_NetworkingRequest_t* nr = NULL;
EIS_FacilitiesIndication_t* fi = NULL;
void* its_msg = NULL;
sreq = calloc(1, sizeof(SecurityRequest_t));
sreq->present = SecurityRequest_PR_tlsRecv;
sreq = calloc(1, sizeof(EIS_SecurityRequest_t));
sreq->present = EIS_SecurityRequest_PR_tlsRecv;
sreq->choice.tlsRecv.data.size = npi->data.size;
sreq->choice.tlsRecv.data.buf = malloc(npi->data.size);
memcpy(sreq->choice.tlsRecv.data.buf, npi->data.buf, npi->data.size);
@ -924,27 +923,27 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
uint8_t b_tx[2048], b_rx[2048];
b_tx[0] = 4;
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_SecurityRequest, NULL, sreq, b_tx + 1, 2047);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_SecurityRequest, NULL, sreq, b_tx + 1, 2047);
log_debug("->[security] SecurityRequest.tlsRecv (%ldB)", enc.encoded + 1);
itss_0send(*security_socket, b_tx, enc.encoded + 1);
int32_t rl = itss_0recv_rt(security_socket, b_rx, 2048, b_tx, enc.encoded + 1, 1000);
log_debug("<-[security] SecurityReply.tlsRecv (%dB)", rl);
if (oer_decode(NULL, &asn_DEF_SecurityReply, (void **)&srep, b_rx, rl).code) {
if (oer_decode(NULL, &asn_DEF_EIS_SecurityReply, (void **)&srep, b_rx, rl).code) {
log_error("SecurityReply.tlsRecv decode failure");
rv = 1;
goto cleanup;
}
if (srep->returnCode == SecurityReplyReturnCode_rejected) {
if (srep->returnCode == EIS_SecurityReplyReturnCode_rejected) {
log_error("SecurityReply.tlsRecv rejected");
SecurityRequest_t *sREQ = calloc(1, sizeof(SecurityRequest_t));
sREQ->present = SecurityRequest_PR_tlsShutdown;
EIS_SecurityRequest_t *sREQ = calloc(1, sizeof(EIS_SecurityRequest_t));
sREQ->present = EIS_SecurityRequest_PR_tlsShutdown;
sREQ->choice.tlsShutdown.connId = id;
b_tx[0] = 4;
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_SecurityRequest, NULL, sREQ, b_tx + 1, 2047);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_SecurityRequest, NULL, sREQ, b_tx + 1, 2047);
log_debug("->[security] SecurityRequest.tlsShutdown (%ldB)", enc.encoded + 1);
itss_0send(*security_socket, b_tx, enc.encoded + 1);
int32_t rl = itss_0recv_rt(security_socket, b_rx, 2048, b_tx, enc.encoded + 1, 1000);
@ -958,17 +957,17 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
// Forward to [networking]
if (srep->data->choice.tlsRecv.state != 1) {
nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->transport.present = NetworkingPacketRequestTP_PR_tcp;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_tcp;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->data.size = srep->data->choice.tlsRecv.data.size;
npr->data.buf = malloc(srep->data->choice.tlsRecv.data.size);
memcpy(npr->data.buf, srep->data->choice.tlsRecv.data.buf, srep->data->choice.tlsRecv.data.size);
npr->transport.present = NetworkingPacketRequestTP_PR_tcp;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_tcp;
npr->transport.choice.tcp.sourcePort = tpi->destinationPort;
npr->transport.choice.tcp.destinationPort = tpi->sourcePort;
@ -981,8 +980,8 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
if (facilities.tolling.protocol.p == TOLLING_PROTOCOL_TLS_GN ||
(facilities.tolling.protocol.p == TOLLING_PROTOCOL_TLS_SHS && tlsc->nmsg < 2)) {
npr->network.present = NetworkingPacketRequestNW_PR_gn6a;
npr->network.choice.gn6a.gn.packetTransportType = PacketTransportType_shb;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn6a;
npr->network.choice.gn6a.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn6a.gn.destinationAddress.buf = calloc(1, 6);
npr->network.choice.gn6a.gn.destinationAddress.size = 6;
npr->network.choice.gn6a.gn.securityProfile.encrypt = false;
@ -992,7 +991,7 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
npr->network.choice.gn6a.ip.destinationAddress.size = 16;
memcpy(npr->network.choice.gn6a.ip.destinationAddress.buf, tpi->sourceAddress->buf, 16);
} else {
npr->network.present = NetworkingPacketRequestNW_PR_ip;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_ip;
npr->network.choice.ip.destinationAddress.buf = malloc(16);
npr->network.choice.ip.destinationAddress.size = 16;
memcpy(npr->network.choice.ip.destinationAddress.buf, tpi->sourceAddress->buf, 16);
@ -1001,7 +1000,7 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
npr->id = itss_id(npr->data.buf, npr->data.size);
buf[0] = 4;
enc = oer_encode_to_buffer(&asn_DEF_NetworkingRequest, NULL, nr, buf + 1, buf_len - 1);
enc = oer_encode_to_buffer(&asn_DEF_EIS_NetworkingRequest, NULL, nr, buf + 1, buf_len - 1);
if (enc.encoded == -1) {
log_error("NR encoding error (%s)", enc.failed_type->name);
rv = 1;
@ -1011,7 +1010,7 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
itss_queue_send(facilities.tx_queue, buf, enc.encoded + 1, ITSS_NETWORKING, npr->id, "NR.packet.tcp");
} else {
if (facilities.tolling.enabled && srep->data->choice.tlsRecv.data.size) {
asn_dec_rval_t dec = uper_decode_complete(NULL, &asn_DEF_TPM, (void **)&its_msg, srep->data->choice.tlsRecv.data.buf, srep->data->choice.tlsRecv.data.size);
asn_dec_rval_t dec = uper_decode_complete(NULL, &asn_DEF_EI1_TPM, (void **)&its_msg, srep->data->choice.tlsRecv.data.buf, srep->data->choice.tlsRecv.data.size);
if (dec.code) {
log_debug("<- invalid TPM received");
rv = 1;
@ -1021,9 +1020,9 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
tpm_recv(its_msg, security_socket, NULL, tpi->sourceAddress->buf);
// Fwd to [applications]
fi = calloc(1, sizeof(FacilitiesIndication_t));
fi->present = FacilitiesIndication_PR_message;
FacilitiesMessageIndication_t *fmi = &fi->choice.message;
fi = calloc(1, sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_message;
EIS_FacilitiesMessageIndication_t *fmi = &fi->choice.message;
fmi->id = id;
@ -1035,7 +1034,7 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
uint8_t buffer[ITSS_SDU_MAX_LEN];
buffer[0] = 4; // Facilities
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesIndication, NULL, fi, buffer + 1, ITSS_SDU_MAX_LEN - 1);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_FacilitiesIndication, NULL, fi, buffer + 1, ITSS_SDU_MAX_LEN - 1);
itss_queue_send(facilities.tx_queue, buffer, enc.encoded + 1, ITSS_APPLICATIONS, id, "FI.message");
@ -1065,23 +1064,23 @@ static int networking_packet_indication_tcp(NetworkingPacketIndication_t* npi, v
}
cleanup:
ASN_STRUCT_FREE(asn_DEF_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_SecurityRequest, sreq);
ASN_STRUCT_FREE(asn_DEF_SecurityReply, srep);
ASN_STRUCT_FREE(asn_DEF_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_EIS_SecurityRequest, sreq);
ASN_STRUCT_FREE(asn_DEF_EIS_SecurityReply, srep);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingRequest, nr);
return rv;
}
int networking_packet_indication(NetworkingPacketIndication_t* npi, void** security_socket) {
int networking_packet_indication(EIS_NetworkingPacketIndication_t* npi, void** security_socket) {
int rv = 0;
switch (npi->transport.present) {
case NetworkingPacketIndicationTP_PR_btp:
case EIS_NetworkingPacketIndicationTP_PR_btp:
networking_packet_indication_btp(npi, security_socket);
break;
case NetworkingPacketIndicationTP_PR_tcp:
case EIS_NetworkingPacketIndicationTP_PR_tcp:
networking_packet_indication_tcp(npi, security_socket);
break;
default:

View File

@ -2,18 +2,18 @@
#define FACILITIES_REQUESTS
#include "facilities.h"
#include <it2s-asn/itss-facilities/FacilitiesRequest.h>
#include <it2s-asn/itss-networking/NetworkingIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingIndication.h>
int facilities_request_result_accepted(void* responder);
int facilities_request_result_rejected(void* responder);
int facilities_request_single_message(void* responder, FacilitiesMessageRequest_t* frm);
int facilities_request_active_episodes(void* responder, FacilitiesRequest_t* fr);
int facilities_request_attribute_types(void* responder, FacilitiesRequest_t* fr);
int facilities_request_loaded_protected_zones(void* responder, FacilitiesRequest_t* fr);
int facilities_request_chaininfo_set(void* responder, ChainInformationSet_t* cis);
int facilities_request_single_message(void* responder, EIS_FacilitiesMessageRequest_t* frm);
int facilities_request_active_episodes(void* responder, EIS_FacilitiesRequest_t* fr);
int facilities_request_attribute_types(void* responder, EIS_FacilitiesRequest_t* fr);
int facilities_request_loaded_protected_zones(void* responder, EIS_FacilitiesRequest_t* fr);
int facilities_request_chaininfo_set(void* responder, EIS_ChainInformationSet_t* cis);
int networking_packet_indication(NetworkingPacketIndication_t* npi, void** security_socket);
int networking_packet_indication(EIS_NetworkingPacketIndication_t* npi, void** security_socket);
#endif

View File

@ -8,21 +8,21 @@
#include <it2s-tender/space.h>
#include <it2s-tender/recorder.h>
#include <it2s-tender/packet.h>
#include <it2s-asn/itss-networking/NetworkingRequest.h>
#include <it2s-asn/itss-security/SecurityRequest.h>
#include <it2s-asn/itss-security/SecurityReply.h>
#include <it2s-asn/tpm/TollingPaymentInfo.h>
#include <it2s-asn/saem/SAEM.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-security/EIS_SecurityReply.h>
#include <it2s-asn/etsi-its-v1/tpm/EI1_TollingPaymentInfo.h>
#include <it2s-asn/etsi-its-v1/saem/EI1_SAEM.h>
#include <zmq.h>
SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour) {
SAEM_CODE_R saem_check(EI1_SAEM_t* saem, uint8_t* neighbour) {
int rv = 0;
bulletin_t* bulletin = &facilities.bulletin;
if (saem->header.messageID != messageID_saem) {
if (saem->header.messageID != EI1_messageID_saem) {
return SAEM_INVALID_HEADER_MESSAGE_ID;
}
@ -38,7 +38,7 @@ SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour) {
if (saem->sam.body.serviceInfos) {
for (int i = 0; i < saem->sam.body.serviceInfos->list.count; ++i) {
ServiceInfo_t* si = saem->sam.body.serviceInfos->list.array[i];
EI1_ServiceInfo_t* si = saem->sam.body.serviceInfos->list.array[i];
uint16_t its_aid = si->serviceID;
@ -48,7 +48,7 @@ SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour) {
for (int e = 0; e < si->chOptions.extensions->list.count; ++e) {
switch (si->chOptions.extensions->list.array[e]->present) {
case ServiceInfoExt_PR_providerServiceContext:
case EI1_ServiceInfoExt_PR_providerServiceContext:
bulletin->to_consume[bulletin->to_consume_len]->info.context_len = si->chOptions.extensions->list.array[e]->choice.providerServiceContext.size;
bulletin->to_consume[bulletin->to_consume_len]->info.context = malloc(si->chOptions.extensions->list.array[e]->choice.providerServiceContext.size);
memcpy(bulletin->to_consume[bulletin->to_consume_len]->info.context,
@ -57,7 +57,7 @@ SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour) {
);
break;
case ServiceInfoExt_PR_applicationDataSAM:
case EI1_ServiceInfoExt_PR_applicationDataSAM:
bulletin->to_consume[bulletin->to_consume_len]->info.data_len = si->chOptions.extensions->list.array[e]->choice.applicationDataSAM.size;
bulletin->to_consume[bulletin->to_consume_len]->info.data = malloc(si->chOptions.extensions->list.array[e]->choice.applicationDataSAM.size);
memcpy(bulletin->to_consume[bulletin->to_consume_len]->info.data,
@ -68,10 +68,10 @@ SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour) {
switch (its_aid) {
case SAID_ETC:
if (facilities.station_type != 15 && facilities.tolling.infos.length < TOLLING_INFOS_MAX_LENGTH) {
TollingPaymentInfo_t* tpi = NULL;
EI1_TollingPaymentInfo_t* tpi = NULL;
asn_dec_rval_t dec = uper_decode_complete(
NULL,
&asn_DEF_TollingPaymentInfo,
&asn_DEF_EI1_TollingPaymentInfo,
(void**) &tpi,
si->chOptions.extensions->list.array[e]->choice.applicationDataSAM.buf,
si->chOptions.extensions->list.array[e]->choice.applicationDataSAM.size
@ -93,7 +93,7 @@ SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour) {
new_announcement = true;
}
} else {
ASN_STRUCT_FREE(asn_DEF_TollingPaymentInfo, tpi);
ASN_STRUCT_FREE(asn_DEF_EI1_TollingPaymentInfo, tpi);
}
}
break;
@ -104,11 +104,11 @@ SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour) {
}
break;
case ServiceInfoExt_PR_addressIPv6:
case EI1_ServiceInfoExt_PR_addressIPv6:
memcpy(bulletin->to_consume[bulletin->to_consume_len]->endpoint.ipv6_addr, si->chOptions.extensions->list.array[e]->choice.addressIPv6.buf, 16);
break;
case ServiceInfoExt_PR_servicePort:
case EI1_ServiceInfoExt_PR_servicePort:
bulletin->to_consume[bulletin->to_consume_len]->endpoint.port = si->chOptions.extensions->list.array[e]->choice.servicePort;
break;
@ -175,11 +175,11 @@ static int mk_saem(uint8_t* b_saem, uint32_t* b_saem_len) {
asn_enc_rval_t enc;
SAEM_t* saem = calloc(1, sizeof(SAEM_t));
EI1_SAEM_t* saem = calloc(1, sizeof(EI1_SAEM_t));
/* header */
saem->header.protocolVersion = 1;
saem->header.messageID = messageID_saem;
saem->header.messageID = EI1_messageID_saem;
pthread_mutex_lock(&facilities.id.lock);
saem->header.stationID = facilities.id.station_id;
@ -187,7 +187,7 @@ static int mk_saem(uint8_t* b_saem, uint32_t* b_saem_len) {
/* sam */
saem->sam.version = 0;
saem->sam.body.serviceInfos = calloc(1, sizeof(ServiceInfos_t));
saem->sam.body.serviceInfos = calloc(1, sizeof(EI1_ServiceInfos_t));
saem->sam.body.serviceInfos->list.count = facilities.tolling.infos.length; // + facilities.evcsn.infos.length;
saem->sam.body.serviceInfos->list.size = facilities.tolling.infos.length * sizeof(void*); // + facilities.evcsn.infos.length * sizeof(void*);
saem->sam.body.serviceInfos->list.array = malloc(facilities.tolling.infos.length * sizeof(void*)); // + facilities.evcsn.infos.length * sizeof(void*);
@ -195,12 +195,12 @@ static int mk_saem(uint8_t* b_saem, uint32_t* b_saem_len) {
uint8_t buf[1024];
int i;
for (i = 0; i < facilities.tolling.infos.length; ++i) {
saem->sam.body.serviceInfos->list.array[i] = calloc(1, sizeof(ServiceInfo_t));
saem->sam.body.serviceInfos->list.array[i] = calloc(1, sizeof(EI1_ServiceInfo_t));
saem->sam.body.serviceInfos->list.array[i]->serviceID = SAID_ETC;
saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions = calloc(1, sizeof(ServiceInfoExts_t));
saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions = calloc(1, sizeof(EI1_ServiceInfoExts_t));
ServiceInfoExts_t* exts = saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions;
EI1_ServiceInfoExts_t* exts = saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions;
switch (facilities.tolling.protocol.p) {
case TOLLING_PROTOCOL_GN_SPKI:
@ -209,23 +209,23 @@ static int mk_saem(uint8_t* b_saem, uint32_t* b_saem_len) {
exts->list.size = 3 * sizeof(void*);
exts->list.array = malloc(3 * sizeof(void*));
exts->list.array[0] = calloc(1, sizeof(ServiceInfoExt_t));
exts->list.array[0]->present = ServiceInfoExt_PR_providerServiceContext;
exts->list.array[0] = calloc(1, sizeof(EI1_ServiceInfoExt_t));
exts->list.array[0]->present = EI1_ServiceInfoExt_PR_providerServiceContext;
char ctx_s[] = "tolling:gn";
exts->list.array[0]->choice.providerServiceContext.size = strlen(ctx_s);
exts->list.array[0]->choice.providerServiceContext.buf = malloc(strlen(ctx_s));
memcpy(exts->list.array[0]->choice.providerServiceContext.buf, ctx_s, strlen(ctx_s));
exts->list.array[1] = calloc(1, sizeof(ServiceInfoExt_t));
exts->list.array[1]->present = ServiceInfoExt_PR_servicePort;
exts->list.array[1] = calloc(1, sizeof(EI1_ServiceInfoExt_t));
exts->list.array[1]->present = EI1_ServiceInfoExt_PR_servicePort;
exts->list.array[1]->choice.servicePort = 7011;
exts->list.array[2] = calloc(1, sizeof(ServiceInfoExt_t));
exts->list.array[2]->present = ServiceInfoExt_PR_applicationDataSAM;
exts->list.array[2] = calloc(1, sizeof(EI1_ServiceInfoExt_t));
exts->list.array[2]->present = EI1_ServiceInfoExt_PR_applicationDataSAM;
exts->list.array[2]->choice.applicationDataSAM.buf = malloc(1024);
enc = uper_encode_to_buffer(&asn_DEF_TollingPaymentInfo, NULL, facilities.tolling.infos.z[i]->asn, exts->list.array[2]->choice.applicationDataSAM.buf, 1024);
enc = uper_encode_to_buffer(&asn_DEF_EI1_TollingPaymentInfo, NULL, facilities.tolling.infos.z[i]->asn, exts->list.array[2]->choice.applicationDataSAM.buf, 1024);
if (enc.encoded == -1) {
log_error("[sa] failure to encode TollingPaymentInfo (%s)", enc.failed_type->name);
rv = 1;
@ -242,28 +242,28 @@ static int mk_saem(uint8_t* b_saem, uint32_t* b_saem_len) {
exts->list.size = 4 * sizeof(void*);
exts->list.array = malloc(4 * sizeof(void*));
exts->list.array[0] = calloc(1, sizeof(ServiceInfoExt_t));
exts->list.array[0]->present = ServiceInfoExt_PR_providerServiceContext;
exts->list.array[0] = calloc(1, sizeof(EI1_ServiceInfoExt_t));
exts->list.array[0]->present = EI1_ServiceInfoExt_PR_providerServiceContext;
char ctx_t[] = "tolling:tls";
exts->list.array[0]->choice.providerServiceContext.size = strlen(ctx_t);
exts->list.array[0]->choice.providerServiceContext.buf = malloc(strlen(ctx_t));
memcpy(exts->list.array[0]->choice.providerServiceContext.buf, ctx_t, strlen(ctx_t));
exts->list.array[1] = calloc(1, sizeof(ServiceInfoExt_t));
exts->list.array[1]->present = ServiceInfoExt_PR_addressIPv6;
exts->list.array[1] = calloc(1, sizeof(EI1_ServiceInfoExt_t));
exts->list.array[1]->present = EI1_ServiceInfoExt_PR_addressIPv6;
exts->list.array[1]->choice.addressIPv6.size = 16;
exts->list.array[1]->choice.addressIPv6.buf = malloc(16);
memcpy(exts->list.array[1]->choice.addressIPv6.buf, facilities.id.ipv6_addr, 16);
exts->list.array[2] = calloc(1, sizeof(ServiceInfoExt_t));
exts->list.array[2]->present = ServiceInfoExt_PR_servicePort;
exts->list.array[2] = calloc(1, sizeof(EI1_ServiceInfoExt_t));
exts->list.array[2]->present = EI1_ServiceInfoExt_PR_servicePort;
exts->list.array[2]->choice.servicePort = 7011;
exts->list.array[3] = calloc(1, sizeof(ServiceInfoExt_t));
exts->list.array[3]->present = ServiceInfoExt_PR_applicationDataSAM;
exts->list.array[3] = calloc(1, sizeof(EI1_ServiceInfoExt_t));
exts->list.array[3]->present = EI1_ServiceInfoExt_PR_applicationDataSAM;
exts->list.array[3]->choice.applicationDataSAM.buf = malloc(1024);
enc = uper_encode_to_buffer(&asn_DEF_TollingPaymentInfo, NULL, facilities.tolling.infos.z[i]->asn, exts->list.array[3]->choice.applicationDataSAM.buf, 1024);
enc = uper_encode_to_buffer(&asn_DEF_EI1_TollingPaymentInfo, NULL, facilities.tolling.infos.z[i]->asn, exts->list.array[3]->choice.applicationDataSAM.buf, 1024);
if (enc.encoded == -1) {
log_error("[sa] failure to encode TollingPaymentInfo (%s)", enc.failed_type->name);
rv = 1;
@ -276,14 +276,14 @@ static int mk_saem(uint8_t* b_saem, uint32_t* b_saem_len) {
}
for (int j = 0; j < 0/* + facilities.evcsn.infos.length */; ++j) {
saem->sam.body.serviceInfos->list.array[i+j] = calloc(1, sizeof(ServiceInfo_t));
saem->sam.body.serviceInfos->list.array[i+j] = calloc(1, sizeof(EI1_ServiceInfo_t));
saem->sam.body.serviceInfos->list.array[i+j]->serviceID = SAID_EVCSN;
// TODO
}
pthread_mutex_unlock(&facilities.id.lock);
enc = asn_encode_to_buffer(NULL, ATS_UNALIGNED_CANONICAL_PER, &asn_DEF_SAEM, saem, b_saem, *b_saem_len);
enc = asn_encode_to_buffer(NULL, ATS_UNALIGNED_CANONICAL_PER, &asn_DEF_EI1_SAEM, saem, b_saem, *b_saem_len);
if (enc.encoded == -1) {
log_error("[sa] failure to encode SAEM (%s)", enc.failed_type->name);
rv = 1;
@ -292,7 +292,7 @@ static int mk_saem(uint8_t* b_saem, uint32_t* b_saem_len) {
*b_saem_len = enc.encoded;
cleanup:
ASN_STRUCT_FREE(asn_DEF_SAEM, saem);
ASN_STRUCT_FREE(asn_DEF_EI1_SAEM, saem);
return rv;
}
@ -301,23 +301,23 @@ void *sa_service() {
pthread_mutex_init(&facilities.bulletin.lock, NULL);
NetworkingRequest_t* nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
EIS_NetworkingRequest_t* nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->network.choice.gn.trafficClass = 2;
npr->network.choice.gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) {
npr->network.choice.gn.destinationAddress.buf[i] = 0xff;
}
npr->network.choice.gn.destinationAddress.size = 6;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.securityProfile.sign = true;
npr->transport.present = NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = BTPType_btpB;
npr->transport.choice.btp.destinationPort = Port_saem;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = EIS_BTPType_btpB;
npr->transport.choice.btp.destinationPort = EIS_Port_saem;
bulletin_t* bulletin = &facilities.bulletin;
@ -343,7 +343,7 @@ void *sa_service() {
npr->id = itss_id(npr->data.buf, npr->data.size);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_NetworkingRequest, NULL, nr, tr_oer+1, 1023);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_EIS_NetworkingRequest, NULL, nr, tr_oer+1, 1023);
if (enc.encoded == -1) {
log_error("encoding TR for SAEM failed");
continue;
@ -354,7 +354,7 @@ void *sa_service() {
pthread_mutex_lock(&facilities.id.lock);
uint32_t station_id = facilities.id.station_id;
pthread_mutex_unlock(&facilities.id.lock);
itss_db_add(facilities.logging.dbms, station_id, npr->id, true, messageID_saem, NULL, npr->data.buf, npr->data.size);
itss_db_add(facilities.logging.dbms, station_id, npr->id, true, EI1_messageID_saem, NULL, npr->data.buf, npr->data.size);
}
if (facilities.logging.recorder) {
uint16_t buffer_len = 2048;
@ -438,7 +438,7 @@ void *sa_service() {
usleep(sleep_ms*1000);
}
ASN_STRUCT_FREE(asn_DEF_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingRequest, nr);
itss_0close(security_socket);

View File

@ -1,6 +1,6 @@
#pragma once
#include <it2s-asn/saem/SAEM.h>
#include <it2s-asn/etsi-its-v1/saem/EI1_SAEM.h>
#include <stdint.h>
#define MAX_ANNOUNCEMENTS_LEN 32
@ -69,7 +69,7 @@ void bulletin_init();
* @param neighbour The certificate used by the neighbour, for encryption
* @return SAEM_CODE
*/
SAEM_CODE_R saem_check(SAEM_t* saem, uint8_t* neighbour);
SAEM_CODE_R saem_check(EI1_SAEM_t* saem, uint8_t* neighbour);
/**
* The main SA function, run as a thread

422
src/tpm.c

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
#pragma once
#include <it2s-asn/tpm/TPM.h>
#include <it2s-asn/tpm/TollingPaymentInfo.h>
#include <it2s-asn/etsi-its-v1/tpm/EI1_TPM.h>
#include <it2s-asn/etsi-its-v1/tpm/EI1_TollingPaymentInfo.h>
#include <it2s-tender/time.h>
#include <it2s-tender/queue.h>
#include <stdbool.h>
@ -29,7 +29,7 @@ typedef struct tolling_info {
double (*polygon)[2]; /* (latitude, longitude) */
size_t polygon_len;
} zone;
TollingPaymentInfo_t* asn;
EI1_TollingPaymentInfo_t* asn;
} tolling_info_t;
/**
@ -84,7 +84,7 @@ typedef struct tolling {
uint64_t nonce;
uint64_t client_id;
uint64_t tls_conn_id;
TPM_t* entry_proof;
EI1_TPM_t* entry_proof;
uint64_t t_init;
@ -108,11 +108,11 @@ typedef struct tolling {
int tolling_init(uint8_t station_type);
int tpm_pay(tolling_info_t* info, void** security_socket, uint8_t* neighbour, uint8_t* dst_addr);
int tpm_recv(TPM_t* tpm_rx, void** security_socket, uint8_t* neighbour, uint8_t* src_addr);
int tpm_recv(EI1_TPM_t* tpm_rx, void** security_socket, uint8_t* neighbour, uint8_t* src_addr);
int tpm_should_retransmit();
int tpm_is_inside_zone(tolling_info_t* ti);
tolling_info_t* tolling_info_new(TollingPaymentInfo_t* tpi);
tolling_info_t* tolling_info_new(EI1_TollingPaymentInfo_t* tpi);
void tolling_info_free(tolling_info_t* ti);
tlsc_t* tolling_tlsc_new(uint8_t ipv6[16], uint16_t port);

200
src/vcm.c
View File

@ -7,10 +7,10 @@
#include <it2s-tender/geodesy.h>
#include <it2s-tender/recorder.h>
#include <it2s-tender/packet.h>
#include <it2s-asn/itss-networking/NetworkingRequest.h>
#include <it2s-asn/itss-facilities/FacilitiesIndication.h>
#include <it2s-asn/itss-management/ManagementRequest.h>
#include <it2s-asn/vcm/VCM.h>
#include <it2s-asn/etsi-its-sdu/itss-networking/EIS_NetworkingRequest.h>
#include <it2s-asn/etsi-its-sdu/itss-facilities/EIS_FacilitiesIndication.h>
#include <it2s-asn/etsi-its-sdu/itss-management/EIS_ManagementRequest.h>
#include <it2s-asn/etsi-its-v1/vcm/EI1_VCM.h>
#include <tgmath.h>
@ -73,38 +73,38 @@ static mc_neighbour_s* get_neighbour(uint32_t station_id) {
}
static void tx_vcm(VCM_t* vcm) {
static void tx_vcm(EI1_VCM_t* vcm) {
const uint16_t buf_len = 2048;
uint8_t buf[buf_len];
NetworkingRequest_t* nr = NULL;
FacilitiesIndication_t* fi = NULL;
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_VCM, NULL, vcm, buf, buf_len);
EIS_NetworkingRequest_t* nr = NULL;
EIS_FacilitiesIndication_t* fi = NULL;
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EI1_VCM, NULL, vcm, buf, buf_len);
if (enc.encoded == -1) {
log_error("[vc] VCM encode failure (%s)", enc.failed_type->name);
goto cleanup;
}
uint16_t vcm_len = (enc.encoded + 7) / 8;
nr = calloc(1, sizeof(NetworkingRequest_t));
nr->present = NetworkingRequest_PR_packet;
NetworkingPacketRequest_t* npr = &nr->choice.packet;
nr = calloc(1, sizeof(EIS_NetworkingRequest_t));
nr->present = EIS_NetworkingRequest_PR_packet;
EIS_NetworkingPacketRequest_t* npr = &nr->choice.packet;
npr->network.present = NetworkingPacketRequestNW_PR_gn;
npr->network.present = EIS_NetworkingPacketRequestNW_PR_gn;
npr->network.choice.gn.trafficClass = 2;
npr->network.choice.gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) {
npr->network.choice.gn.destinationAddress.buf[i] = 0xff;
}
npr->network.choice.gn.destinationAddress.size = 6;
npr->network.choice.gn.packetTransportType = PacketTransportType_shb;
npr->network.choice.gn.packetTransportType = EIS_PacketTransportType_shb;
npr->network.choice.gn.securityProfile.sign = true;
npr->transport.present = NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = BTPType_btpB;
npr->transport.present = EIS_NetworkingPacketRequestTP_PR_btp;
npr->transport.choice.btp.btpType = EIS_BTPType_btpB;
npr->transport.choice.btp.destinationPort = 2043;
if (facilities.edm.enabled &&
vcm->vcm.maneuverContainer.present == ManeuverContainer_PR_vehicle &&
vcm->vcm.maneuverContainer.present == EI1_ManeuverContainer_PR_vehicle &&
vcm->vcm.maneuverContainer.choice.vehicle.negotiation
) {
edm_encap(buf, &vcm_len, buf_len, 2043);
@ -119,7 +119,7 @@ static void tx_vcm(VCM_t* vcm) {
memcpy(npr->data.buf, buf, vcm_len);
npr->data.size = vcm_len;
buf[0] = 4;
enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_NetworkingRequest, nr, buf+1, buf_len-1);
enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_EIS_NetworkingRequest, nr, buf+1, buf_len-1);
if (enc.encoded == -1) {
log_error("[vc] NR VCM.reply encode failure (%s)", enc.failed_type->name);
goto cleanup;
@ -127,15 +127,15 @@ static void tx_vcm(VCM_t* vcm) {
itss_queue_send(facilities.tx_queue, buf, enc.encoded+1, ITSS_NETWORKING, npr->id, "NR.packet.btp");
fi = calloc(1, sizeof(FacilitiesIndication_t));
fi->present = FacilitiesIndication_PR_message;
fi = calloc(1, sizeof(EIS_FacilitiesIndication_t));
fi->present = EIS_FacilitiesIndication_PR_message;
fi->choice.message.id = npr->id;
fi->choice.message.itsMessageType = 2043;
fi->choice.message.data.size = npr->data.size;
fi->choice.message.data.buf = malloc(npr->data.size);
memcpy(fi->choice.message.data.buf, npr->data.buf, npr->data.size);
buf[0] = 4;
enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_FacilitiesIndication, fi, buf+1, buf_len-1);
enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_EIS_FacilitiesIndication, fi, buf+1, buf_len-1);
if (enc.encoded == -1) {
log_error("[vc] TR VCM.reply encode failure (%s)", enc.failed_type->name);
goto cleanup;
@ -163,11 +163,11 @@ static void tx_vcm(VCM_t* vcm) {
}
cleanup:
ASN_STRUCT_FREE(asn_DEF_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_FacilitiesIndication, fi);
ASN_STRUCT_FREE(asn_DEF_EIS_NetworkingRequest, nr);
ASN_STRUCT_FREE(asn_DEF_EIS_FacilitiesIndication, fi);
}
static void vcm_reject(VCM_t* vcm, mc_neighbour_s* neighbour) {
static void vcm_reject(EI1_VCM_t* vcm, mc_neighbour_s* neighbour) {
coordination_t* coordination = &facilities.coordination;
@ -191,9 +191,9 @@ static void vcm_reject(VCM_t* vcm, mc_neighbour_s* neighbour) {
itss_st_t trajectoryA[TRAJECTORY_MAX_LEN+1]; /* ego trajectory */
ssize_t trajectoryA_len = 0;
NetworkingRequest_t* tr = NULL;
FacilitiesIndication_t* fi = NULL;
VCM_t* vcm_rep = calloc(1, sizeof(VCM_t));
EIS_NetworkingRequest_t* tr = NULL;
EIS_FacilitiesIndication_t* fi = NULL;
EI1_VCM_t* vcm_rep = calloc(1, sizeof(EI1_VCM_t));
int rv = 0;
const uint16_t buf_len = 2048;
@ -226,8 +226,8 @@ static void vcm_reject(VCM_t* vcm, mc_neighbour_s* neighbour) {
}
*/
vcm_rep->vcm.maneuverContainer.present = ManeuverContainer_PR_vehicle;
ManeuverVehicleContainer_t* mvc_rep = &vcm_rep->vcm.maneuverContainer.choice.vehicle;
vcm_rep->vcm.maneuverContainer.present = EI1_ManeuverContainer_PR_vehicle;
EI1_ManeuverVehicleContainer_t* mvc_rep = &vcm_rep->vcm.maneuverContainer.choice.vehicle;
mvc_rep->heading.headingValue = heading;
mvc_rep->heading.headingConfidence = heading_conf;
@ -251,14 +251,14 @@ static void vcm_reject(VCM_t* vcm, mc_neighbour_s* neighbour) {
mvc_rep->plannedTrajectory.list.size = (trajectoryA_len - 1) * sizeof(void*);
mvc_rep->plannedTrajectory.list.array = malloc((trajectoryA_len - 1) * sizeof(void*));
for (int i = 0; i < trajectoryA_len - 1; ++i) {
mvc_rep->plannedTrajectory.list.array[i] = calloc(1, sizeof(STPoint_t));
mvc_rep->plannedTrajectory.list.array[i] = calloc(1, sizeof(EI1_STPoint_t));
mvc_rep->plannedTrajectory.list.array[i]->deltaLatitude = trajectoryA[i+1].latitude - trajectoryA[i].latitude;
mvc_rep->plannedTrajectory.list.array[i]->deltaLongitude = trajectoryA[i+1].longitude - trajectoryA[i].longitude;
mvc_rep->plannedTrajectory.list.array[i]->deltaTime = trajectoryA[i+1].timestamp - trajectoryA[i].timestamp;
}
mvc_rep->negotiation = calloc(1, sizeof(CoordinationNegotiation_t));
mvc_rep->negotiation->present = CoordinationNegotiation_PR_reply;
mvc_rep->negotiation = calloc(1, sizeof(EI1_CoordinationNegotiation_t));
mvc_rep->negotiation->present = EI1_CoordinationNegotiation_PR_reply;
mvc_rep->negotiation->choice.reply.acceptedTrajectoriesIds.list.count = 0;
mvc_rep->negotiation->choice.reply.acceptedTrajectoriesIds.list.size = 0;
mvc_rep->negotiation->choice.reply.acceptedTrajectoriesIds.list.array = NULL;
@ -268,7 +268,7 @@ static void vcm_reject(VCM_t* vcm, mc_neighbour_s* neighbour) {
tx_vcm(vcm_rep);
cleanup:
ASN_STRUCT_FREE(asn_DEF_VCM, vcm_rep);
ASN_STRUCT_FREE(asn_DEF_EI1_VCM, vcm_rep);
}
static bool is_maneuver_approved() {
@ -288,7 +288,7 @@ static bool is_maneuver_approved() {
static void session_cleanup() {
coordination_t* coordination = &facilities.coordination;
ASN_STRUCT_FREE(asn_DEF_VCM, coordination->session.own_req);
ASN_STRUCT_FREE(asn_DEF_EI1_VCM, coordination->session.own_req);
coordination->session.own_req = NULL;
coordination->session.ts = itss_time_get();
coordination->session.nonce = 0;
@ -315,7 +315,7 @@ static bool commit() {
log_debug("[vc] issuing COMMIT - session %d", coordination->session.nonce);
VCM_t* vcm_com = calloc(1, sizeof(VCM_t));
EI1_VCM_t* vcm_com = calloc(1, sizeof(EI1_VCM_t));
vcm_com->header.messageID = 43;
vcm_com->header.protocolVersion = 1;
pthread_mutex_lock(&facilities.id.lock);
@ -338,8 +338,8 @@ static bool commit() {
uint64_t now = itss_time_get();
asn_ulong2INTEGER(&vcm_com->vcm.currentPosition.timestamp, now);
vcm_com->vcm.maneuverContainer.present = ManeuverContainer_PR_vehicle;
ManeuverVehicleContainer_t* mvc = &vcm_com->vcm.maneuverContainer.choice.vehicle;
vcm_com->vcm.maneuverContainer.present = EI1_ManeuverContainer_PR_vehicle;
EI1_ManeuverVehicleContainer_t* mvc = &vcm_com->vcm.maneuverContainer.choice.vehicle;
mvc->heading.headingValue = heading;
mvc->heading.headingConfidence = heading_conf;
@ -365,20 +365,20 @@ static bool commit() {
mvc->plannedTrajectory.list.size = (trajectoryA_len - 1) * sizeof(void*);
mvc->plannedTrajectory.list.array = malloc((trajectoryA_len - 1) * sizeof(void*));
for (int i = 0; i < trajectoryA_len - 1; ++i) {
mvc->plannedTrajectory.list.array[i] = calloc(1, sizeof(STPoint_t));
mvc->plannedTrajectory.list.array[i] = calloc(1, sizeof(EI1_STPoint_t));
mvc->plannedTrajectory.list.array[i]->deltaLatitude = trajectoryA[i+1].latitude - trajectoryA[i].latitude;
mvc->plannedTrajectory.list.array[i]->deltaLongitude = trajectoryA[i+1].longitude - trajectoryA[i].longitude;
mvc->plannedTrajectory.list.array[i]->deltaTime = trajectoryA[i+1].timestamp - trajectoryA[i].timestamp;
}
mvc->negotiation = calloc(1, sizeof(CoordinationNegotiation_t));
mvc->negotiation->present = CoordinationNegotiation_PR_commit;
mvc->negotiation = calloc(1, sizeof(EI1_CoordinationNegotiation_t));
mvc->negotiation->present = EI1_CoordinationNegotiation_PR_commit;
mvc->negotiation->choice.commit.nonce = coordination->session.nonce;
if (coordination->session.own_req) {
mvc->negotiation->choice.commit.qp.present = CoordinationCommitQP_PR_acceptedTrajectoryId;
mvc->negotiation->choice.commit.qp.present = EI1_CoordinationCommitQP_PR_acceptedTrajectoryId;
mvc->negotiation->choice.commit.qp.choice.acceptedTrajectoryId = 0;
} else {
mvc->negotiation->choice.commit.qp.present = CoordinationCommitQP_PR_requesterId;
mvc->negotiation->choice.commit.qp.present = EI1_CoordinationCommitQP_PR_requesterId;
mvc->negotiation->choice.commit.qp.choice.requesterId = coordination->session.requester->station_id;
}
@ -402,7 +402,7 @@ static bool commit() {
*/
tx_vcm(vcm_com);
ASN_STRUCT_FREE(asn_DEF_VCM, vcm_com);
ASN_STRUCT_FREE(asn_DEF_EI1_VCM, vcm_com);
session_cleanup();
@ -410,7 +410,7 @@ static bool commit() {
};
static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
static int vcm_check_handle_request(EI1_VCM_t* vcm, mc_neighbour_s* neighbour) {
int rv = 0;
coordination_t* coordination = &facilities.coordination;
@ -423,7 +423,7 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
// Is request for me?
CoordinationRequest_t* request = &vcm->vcm.maneuverContainer.choice.vehicle.negotiation->choice.request;
EI1_CoordinationRequest_t* request = &vcm->vcm.maneuverContainer.choice.vehicle.negotiation->choice.request;
bool is_req4me = false;
for (int i = 0; i < request->desiredTrajectories.list.count && !is_req4me; ++i) {
for (int j = 0; j < request->desiredTrajectories.list.array[i]->affectingStations.list.count; ++j) {
@ -455,7 +455,7 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
// Change speed
// Just check who is closer to mid trajectory point, if ego is closer, accelerate
// TODO a real trajectory analysis
STDeltaTrajectory_t* stdt = &request->desiredTrajectories.list.array[0]->trajectory;
EI1_STDeltaTrajectory_t* stdt = &request->desiredTrajectories.list.array[0]->trajectory;
itss_st_t* trj = calloc(stdt->list.count/2 + 1, sizeof(itss_st_t));
trj[0].latitude = vcm->vcm.currentPosition.latitude;
trj[0].longitude = vcm->vcm.currentPosition.longitude;
@ -489,16 +489,16 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
);
free(trj);
ManagementRequest_t* mreq = calloc(1, sizeof(ManagementRequest_t));
mreq->present = ManagementRequest_PR_attributes;
mreq->choice.attributes.present = ManagementRequestAttributes_PR_set;
mreq->choice.attributes.choice.set.speed = calloc(1, sizeof(ManagementSpeedSet_t));
ManagementSpeedSet_t* mgss = mreq->choice.attributes.choice.set.speed;
EIS_ManagementRequest_t* mreq = calloc(1, sizeof(EIS_ManagementRequest_t));
mreq->present = EIS_ManagementRequest_PR_attributes;
mreq->choice.attributes.present = EIS_ManagementRequestAttributes_PR_set;
mreq->choice.attributes.choice.set.speed = calloc(1, sizeof(EIS_ManagementSpeedSet_t));
EIS_ManagementSpeedSet_t* mgss = mreq->choice.attributes.choice.set.speed;
mgss->rate = 5; /* km/h/s */
mgss->temporary = true; /* go back to original speed after a while */
mgss->type.present = ManagementSpeedSetType_PR_diff; /* differential change set */
mgss->type.present = EIS_ManagementSpeedSetType_PR_diff; /* differential change set */
mgss->type.choice.diff = (dreq > dego) ? 10 : -10; /* % */
asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_ManagementRequest, mreq, buf1, buf_len);
asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_EIS_ManagementRequest, mreq, buf1, buf_len);
if (enc.encoded == -1) {
log_error("[vc] failed to encode MReq.speedSet (%s)", enc.failed_type->name);
}
@ -506,12 +506,12 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
if (itss_0recv_rt(&coordination->mgmt_socket, buf2, buf_len, buf1, enc.encoded, 500) == -1) {
log_error("[vc]-> MReq.speedSet ->[management] <TIMEOUT>");
}
ASN_STRUCT_FREE(asn_DEF_ManagementRequest, mreq);
ASN_STRUCT_FREE(asn_DEF_EIS_ManagementRequest, mreq);
// Respond
VCM_t* vcm_rep = NULL;
NetworkingRequest_t* tr = NULL;
FacilitiesIndication_t* fi = NULL;
EI1_VCM_t* vcm_rep = NULL;
EIS_NetworkingRequest_t* tr = NULL;
EIS_FacilitiesIndication_t* fi = NULL;
itss_st_t trajectoryA[TRAJECTORY_MAX_LEN+1]; /* ego trajectory */
@ -525,7 +525,7 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
coordination->session.requester = neighbour;
coordination->session.t_init = now;
vcm_rep = calloc(1, sizeof(VCM_t));
vcm_rep = calloc(1, sizeof(EI1_VCM_t));
vcm_rep->header.messageID = 43;
vcm_rep->header.protocolVersion = 1;
@ -563,8 +563,8 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
}
*/
vcm_rep->vcm.maneuverContainer.present = ManeuverContainer_PR_vehicle;
ManeuverVehicleContainer_t* mvc_rep = &vcm_rep->vcm.maneuverContainer.choice.vehicle;
vcm_rep->vcm.maneuverContainer.present = EI1_ManeuverContainer_PR_vehicle;
EI1_ManeuverVehicleContainer_t* mvc_rep = &vcm_rep->vcm.maneuverContainer.choice.vehicle;
mvc_rep->heading.headingValue = heading;
mvc_rep->heading.headingConfidence = heading_conf;
@ -588,7 +588,7 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
mvc_rep->plannedTrajectory.list.size = (trajectoryA_len - 1) * sizeof(void*);
mvc_rep->plannedTrajectory.list.array = malloc((trajectoryA_len - 1) * sizeof(void*));
for (int i = 0; i < trajectoryA_len - 1; ++i) {
mvc_rep->plannedTrajectory.list.array[i] = calloc(1, sizeof(STPoint_t));
mvc_rep->plannedTrajectory.list.array[i] = calloc(1, sizeof(EI1_STPoint_t));
mvc_rep->plannedTrajectory.list.array[i]->deltaLatitude = trajectoryA[i+1].latitude - trajectoryA[i].latitude;
mvc_rep->plannedTrajectory.list.array[i]->deltaLongitude = trajectoryA[i+1].longitude - trajectoryA[i].longitude;
mvc_rep->plannedTrajectory.list.array[i]->deltaTime = trajectoryA[i+1].timestamp - trajectoryA[i].timestamp;
@ -600,12 +600,12 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
rv = 1;
goto cleanup;
}
ProposedTrajectory_t* pt = request->desiredTrajectories.list.array[0];
EI1_ProposedTrajectory_t* pt = request->desiredTrajectories.list.array[0];
// TODO check if vehicles are really going to intersect
mvc_rep->negotiation = calloc(1, sizeof(CoordinationNegotiation_t));
mvc_rep->negotiation->present = CoordinationNegotiation_PR_reply;
mvc_rep->negotiation = calloc(1, sizeof(EI1_CoordinationNegotiation_t));
mvc_rep->negotiation->present = EI1_CoordinationNegotiation_PR_reply;
mvc_rep->negotiation->choice.reply.acceptedTrajectoriesIds.list.count = 1;
mvc_rep->negotiation->choice.reply.acceptedTrajectoriesIds.list.size = sizeof(void*);
mvc_rep->negotiation->choice.reply.acceptedTrajectoriesIds.list.array = malloc(1*sizeof(void*));
@ -634,16 +634,16 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) {
}
cleanup:
ASN_STRUCT_FREE(asn_DEF_VCM, vcm_rep);
ASN_STRUCT_FREE(asn_DEF_EI1_VCM, vcm_rep);
return rv;
}
static int vcm_check_handle_reply(VCM_t* vcm, mc_neighbour_s* neighbour) {
static int vcm_check_handle_reply(EI1_VCM_t* vcm, mc_neighbour_s* neighbour) {
int rv = 0;
coordination_t* coordination = &facilities.coordination;
CoordinationReply_t* reply = &vcm->vcm.maneuverContainer.choice.vehicle.negotiation->choice.reply;
EI1_CoordinationReply_t* reply = &vcm->vcm.maneuverContainer.choice.vehicle.negotiation->choice.reply;
if (reply->nonce != coordination->session.nonce) {
return 1;
@ -738,15 +738,15 @@ static int vcm_check_handle_reply(VCM_t* vcm, mc_neighbour_s* neighbour) {
return rv;
}
static int intersection_detected(VCM_t* vcm, mc_neighbour_s* neighbour) {
static int intersection_detected(EI1_VCM_t* vcm, mc_neighbour_s* neighbour) {
int rv = 0;
coordination_t* coordination = &facilities.coordination;
VCM_t* vcm_req = NULL;
NetworkingRequest_t* tr = NULL;
FacilitiesIndication_t* fi = NULL;
EI1_VCM_t* vcm_req = NULL;
EIS_NetworkingRequest_t* tr = NULL;
EIS_FacilitiesIndication_t* fi = NULL;
const ssize_t buf_len = 1024;
uint8_t buf[buf_len];
@ -779,7 +779,7 @@ static int intersection_detected(VCM_t* vcm, mc_neighbour_s* neighbour) {
++trajectoryA_len;
// Initiate conflict resolution
vcm_req = calloc(1, sizeof(VCM_t));
vcm_req = calloc(1, sizeof(EI1_VCM_t));
vcm_req->header.messageID = 43;
vcm_req->header.protocolVersion = 1;
@ -810,8 +810,8 @@ static int intersection_detected(VCM_t* vcm, mc_neighbour_s* neighbour) {
}
*/
vcm_req->vcm.maneuverContainer.present = ManeuverContainer_PR_vehicle;
ManeuverVehicleContainer_t* mvc = &vcm_req->vcm.maneuverContainer.choice.vehicle;
vcm_req->vcm.maneuverContainer.present = EI1_ManeuverContainer_PR_vehicle;
EI1_ManeuverVehicleContainer_t* mvc = &vcm_req->vcm.maneuverContainer.choice.vehicle;
mvc->heading.headingValue = heading;
mvc->heading.headingConfidence = heading_conf;
@ -825,20 +825,20 @@ static int intersection_detected(VCM_t* vcm, mc_neighbour_s* neighbour) {
mvc->plannedTrajectory.list.size = (trajectoryA_len - 1) * sizeof(void*);
mvc->plannedTrajectory.list.array = malloc((trajectoryA_len - 1) * sizeof(void*));
for (int i = 0; i < trajectoryA_len - 1; ++i) {
mvc->plannedTrajectory.list.array[i] = calloc(1, sizeof(STPoint_t));
mvc->plannedTrajectory.list.array[i] = calloc(1, sizeof(EI1_STPoint_t));
mvc->plannedTrajectory.list.array[i]->deltaLatitude = trajectoryA[i+1].latitude - trajectoryA[i].latitude;
mvc->plannedTrajectory.list.array[i]->deltaLongitude = trajectoryA[i+1].longitude - trajectoryA[i].longitude;
mvc->plannedTrajectory.list.array[i]->deltaTime = trajectoryA[i+1].timestamp - trajectoryA[i].timestamp;
}
// Desired trajectory
mvc->negotiation = calloc(1, sizeof(CoordinationNegotiation_t));
mvc->negotiation->present = CoordinationNegotiation_PR_request;
mvc->negotiation = calloc(1, sizeof(EI1_CoordinationNegotiation_t));
mvc->negotiation->present = EI1_CoordinationNegotiation_PR_request;
mvc->negotiation->choice.request.desiredTrajectories.list.count = 1;
mvc->negotiation->choice.request.desiredTrajectories.list.size = sizeof(void*);
mvc->negotiation->choice.request.desiredTrajectories.list.array = malloc(1*sizeof(void*));
mvc->negotiation->choice.request.desiredTrajectories.list.array[0] = calloc(1,sizeof(ProposedTrajectory_t));
ProposedTrajectory_t* pt = mvc->negotiation->choice.request.desiredTrajectories.list.array[0];
mvc->negotiation->choice.request.desiredTrajectories.list.array[0] = calloc(1,sizeof(EI1_ProposedTrajectory_t));
EI1_ProposedTrajectory_t* pt = mvc->negotiation->choice.request.desiredTrajectories.list.array[0];
mvc->negotiation->choice.request.requesterId = vcm->header.stationID;
mvc->negotiation->choice.request.nonce = rand();
coordination->session.nonce = mvc->negotiation->choice.request.nonce;
@ -847,7 +847,7 @@ static int intersection_detected(VCM_t* vcm, mc_neighbour_s* neighbour) {
pt->trajectory.list.size = sizeof(void*) * (trajectoryA_len - 1);
pt->trajectory.list.array = malloc(sizeof(void*) * (trajectoryA_len - 1));
for (int i = 0; i < trajectoryA_len - 1; ++i) {
pt->trajectory.list.array[i] = calloc(1, sizeof(STPoint_t));
pt->trajectory.list.array[i] = calloc(1, sizeof(EI1_STPoint_t));
pt->trajectory.list.array[i]->deltaLatitude = trajectoryA[i+1].latitude - trajectoryA[i].latitude;
pt->trajectory.list.array[i]->deltaLongitude = trajectoryA[i+1].longitude - trajectoryA[i].longitude;
pt->trajectory.list.array[i]->deltaTime = trajectoryA[i+1].timestamp - trajectoryA[i].timestamp;
@ -915,9 +915,9 @@ static int intersection_detected(VCM_t* vcm, mc_neighbour_s* neighbour) {
return rv;
}
static void intersection_check(VCM_t* vcm, mc_neighbour_s* neighbour) {
static void intersection_check(EI1_VCM_t* vcm, mc_neighbour_s* neighbour) {
ManeuverVehicleContainer_t* mvc = &vcm->vcm.maneuverContainer.choice.vehicle;
EI1_ManeuverVehicleContainer_t* mvc = &vcm->vcm.maneuverContainer.choice.vehicle;
itss_st_t trajectoryA[TRAJECTORY_MAX_LEN+1]; /* ego trajectory */
itss_st_t trajectoryB[TRAJECTORY_MAX_LEN+1]; /* neighbour trajectory */
@ -979,7 +979,7 @@ static void intersection_check(VCM_t* vcm, mc_neighbour_s* neighbour) {
}
}
static int vcm_check_handle_commit(VCM_t* vcm, mc_neighbour_s* neighbour) {
static int vcm_check_handle_commit(EI1_VCM_t* vcm, mc_neighbour_s* neighbour) {
coordination_t* coordination = &facilities.coordination;
if (vcm->vcm.maneuverContainer.choice.vehicle.negotiation->choice.commit.nonce != coordination->session.nonce) {
@ -1007,7 +1007,7 @@ static bool in_maneuver() {
return true;
}
int vcm_check(VCM_t* vcm) {
int vcm_check(EI1_VCM_t* vcm) {
coordination_t* coordination = &facilities.coordination;
int rv = 0;
@ -1019,20 +1019,20 @@ int vcm_check(VCM_t* vcm) {
mc_neighbour_s* neighbour = get_neighbour(vcm->header.stationID);
switch (vcm->vcm.maneuverContainer.present) {
case ManeuverContainer_PR_vehicle:
case EI1_ManeuverContainer_PR_vehicle:
;
ManeuverVehicleContainer_t* mvc = &vcm->vcm.maneuverContainer.choice.vehicle;
EI1_ManeuverVehicleContainer_t* mvc = &vcm->vcm.maneuverContainer.choice.vehicle;
if (mvc->negotiation) {
switch (mvc->negotiation->present) {
case CoordinationNegotiation_PR_request:
case EI1_CoordinationNegotiation_PR_request:
vcm_check_handle_request(vcm, neighbour);
break;
case CoordinationNegotiation_PR_reply:
case EI1_CoordinationNegotiation_PR_reply:
vcm_check_handle_reply(vcm, neighbour);
break;
case CoordinationNegotiation_PR_commit:
case EI1_CoordinationNegotiation_PR_commit:
vcm_check_handle_commit(vcm, neighbour);
break;
@ -1044,7 +1044,7 @@ int vcm_check(VCM_t* vcm) {
log_debug("[vc] ignoring VCM from %d - currently in maneuver", vcm->header.stationID);
} else {
if (coordination->session.own_req) { /* clear previous request if exists */
ASN_STRUCT_FREE(asn_DEF_VCM, coordination->session.own_req);
ASN_STRUCT_FREE(asn_DEF_EI1_VCM, coordination->session.own_req);
coordination->session.own_req = NULL;
coordination->session.ts = now;
memset(coordination->session.affs, 0, sizeof(coordination->session.affs));
@ -1058,7 +1058,7 @@ int vcm_check(VCM_t* vcm) {
}
}
break;
case ManeuverContainer_PR_rsu:
case EI1_ManeuverContainer_PR_rsu:
break;
default:
log_debug("[vc] received VCM contains unrecognized ManeuverContainer type");
@ -1078,7 +1078,7 @@ static int mk_vcm() {
itss_st_t trajectory[TRAJECTORY_MAX_LEN];
VCM_t* vcm = calloc(1, sizeof(VCM_t));
EI1_VCM_t* vcm = calloc(1, sizeof(EI1_VCM_t));
vcm->header.messageID = 43;
vcm->header.protocolVersion = 1;
@ -1127,13 +1127,13 @@ static int mk_vcm() {
}
*/
if (facilities.station_type == StationType_roadSideUnit) {
vcm->vcm.maneuverContainer.present = ManeuverContainer_PR_rsu;
ManeuverRSUContainer_t* mrc = &vcm->vcm.maneuverContainer.choice.rsu;
if (facilities.station_type == EI1_StationType_roadSideUnit) {
vcm->vcm.maneuverContainer.present = EI1_ManeuverContainer_PR_rsu;
EI1_ManeuverRSUContainer_t* mrc = &vcm->vcm.maneuverContainer.choice.rsu;
mrc->recommendedTrajectories = NULL; // TODO
} else {
vcm->vcm.maneuverContainer.present = ManeuverContainer_PR_vehicle;
ManeuverVehicleContainer_t* mvc = &vcm->vcm.maneuverContainer.choice.vehicle;
vcm->vcm.maneuverContainer.present = EI1_ManeuverContainer_PR_vehicle;
EI1_ManeuverVehicleContainer_t* mvc = &vcm->vcm.maneuverContainer.choice.vehicle;
mvc->heading.headingValue = heading;
mvc->heading.headingConfidence = heading_conf;
// Vehicle Dimensions
@ -1144,12 +1144,12 @@ static int mk_vcm() {
mvc->plannedTrajectory.list.count = trajectory_len;
mvc->plannedTrajectory.list.size = trajectory_len * sizeof(void*);
mvc->plannedTrajectory.list.array = malloc(trajectory_len * sizeof(void*));
mvc->plannedTrajectory.list.array[0] = calloc(1, sizeof(STPoint_t));
mvc->plannedTrajectory.list.array[0] = calloc(1, sizeof(EI1_STPoint_t));
mvc->plannedTrajectory.list.array[0]->deltaLatitude = trajectory[0].latitude - lat;
mvc->plannedTrajectory.list.array[0]->deltaLongitude = trajectory[0].longitude - lon;
mvc->plannedTrajectory.list.array[0]->deltaTime = trajectory[0].timestamp - now;
for (int i = 1; i < trajectory_len; ++i) {
mvc->plannedTrajectory.list.array[i] = calloc(1, sizeof(STPoint_t));
mvc->plannedTrajectory.list.array[i] = calloc(1, sizeof(EI1_STPoint_t));
mvc->plannedTrajectory.list.array[i]->deltaLatitude = trajectory[i].latitude - trajectory[i-1].latitude;
mvc->plannedTrajectory.list.array[i]->deltaLongitude = trajectory[i].longitude - trajectory[i-1].longitude;
mvc->plannedTrajectory.list.array[i]->deltaTime = trajectory[i].timestamp - trajectory[i-1].timestamp;
@ -1159,7 +1159,7 @@ static int mk_vcm() {
tx_vcm(vcm);
cleanup:
ASN_STRUCT_FREE(asn_DEF_VCM, vcm);
ASN_STRUCT_FREE(asn_DEF_EI1_VCM, vcm);
return rv;
}
@ -1176,7 +1176,7 @@ static bool vcm_timer_check(coordination_t* coordination, uint64_t now) {
return false;
}
if (facilities.station_type != StationType_roadSideUnit) { // Vehicle
if (facilities.station_type != EI1_StationType_roadSideUnit) { // Vehicle
itss_trajectory_lock();

View File

@ -1,7 +1,7 @@
#pragma once
#include <stdbool.h>
#include <it2s-asn/vcm/VCM.h>
#include <it2s-asn/etsi-its-v1/vcm/EI1_VCM.h>
#include <it2s-tender/geodesy.h>
#include <it2s-tender/epv.h>
@ -53,7 +53,7 @@ typedef struct coordination {
double previous_c;
struct {
VCM_t* own_req; /* last VCM.request sent */
EI1_VCM_t* own_req; /* last VCM.request sent */
uint64_t ts;
uint32_t nonce;
@ -89,7 +89,7 @@ typedef struct coordination {
* @param vcm The VCM to be analyzed
* @return 0 on success, other value otherwise
*/
int vcm_check(VCM_t* vcm);
int vcm_check(EI1_VCM_t* vcm);
/**
* VC loop, threaded