Initial effort to support [transport] various protocols

This commit is contained in:
emanuel 2021-07-13 15:56:44 +01:00
parent 268e245679
commit 796fdeab67
6 changed files with 232 additions and 206 deletions

View File

@ -2,8 +2,7 @@
#include "facilities.h" #include "facilities.h"
#include <camv2/INTEGER.h> #include <camv2/INTEGER.h>
#include <itss-transport/BTPDataRequest.h> #include <itss-transport/TransportDataRequest.h>
#include <itss-transport/BTPDataIndication.h>
#include <itss-management/ManagementRequest.h> #include <itss-management/ManagementRequest.h>
#include <camv2/CAM.h> #include <camv2/CAM.h>
@ -634,31 +633,33 @@ void *ca_service(void *fc) {
uint8_t code = 0; uint8_t code = 0;
facilities_t *facilities = (facilities_t*) fc; facilities_t *facilities = (facilities_t*) fc;
BTPDataRequest_t *bdr = calloc(1, sizeof(BTPDataRequest_t)); TransportDataRequest_t* tdr = calloc(1, sizeof(TransportDataRequest_t));
tdr->present = TransportDataRequest_PR_btp;
BTPDataRequest_t *bdr = &tdr->choice.btp;
bdr->btpType = BTPType_btpB; bdr->btpType = BTPType_btpB;
bdr->gnDestinationAddress.buf = malloc(6); bdr->gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) { for (int i = 0; i < 6; ++i) {
bdr->gnDestinationAddress.buf[i] = 0xff; bdr->gn.destinationAddress.buf[i] = 0xff;
} }
bdr->gnDestinationAddress.size = 6; bdr->gn.destinationAddress.size = 6;
bdr->gnPacketTransportType = PacketTransportType_shb; bdr->gn.packetTransportType = PacketTransportType_shb;
bdr->destinationPort = Port_cam; bdr->destinationPort = Port_cam;
bdr->gnTrafficClass = 2; bdr->gn.trafficClass = 2;
bdr->data.buf = malloc(512); bdr->data.buf = malloc(512);
if (facilities->use_security) { if (facilities->use_security) {
bdr->gnSecurityProfile = malloc(sizeof(long)); bdr->gn.securityProfile = malloc(sizeof(long));
*bdr->gnSecurityProfile = 1; *bdr->gn.securityProfile = 1;
} }
uint8_t bdr_oer[1024]; uint8_t tdr_oer[1024];
bdr_oer[0] = 4; // Facilities tdr_oer[0] = 4; // Facilities
while (!facilities->exit) { while (!facilities->exit) {
usleep(1000*50); usleep(1000*50);
@ -669,16 +670,16 @@ void *ca_service(void *fc) {
} }
// Check if inside PZ // Check if inside PZ
bdr->gnCommunicationProfile = 0; bdr->gn.communicationProfile = 0;
if (facilities->station_type != 15 && check_pz(facilities->lightship, &facilities->epv)) bdr->gnCommunicationProfile = 1; if (facilities->station_type != 15 && check_pz(facilities->lightship, &facilities->epv)) bdr->gn.communicationProfile = 1;
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer+1, 1023); asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer+1, 1023);
if (enc.encoded == -1) { if (enc.encoded == -1) {
syslog_err("[facilities] encoding BTPDataRequest for cam failed"); syslog_err("[facilities] encoding BTPDataRequest for cam failed");
continue; continue;
} }
queue_add(facilities->tx_queue, bdr_oer, enc.encoded+1, 3); queue_add(facilities->tx_queue, tdr_oer, enc.encoded+1, 3);
pthread_cond_signal(&facilities->tx_queue->trigger); pthread_cond_signal(&facilities->tx_queue->trigger);
lightship_reset_timer(facilities->lightship, &facilities->epv); lightship_reset_timer(facilities->lightship, &facilities->epv);
@ -686,7 +687,7 @@ void *ca_service(void *fc) {
} }
ASN_STRUCT_FREE(asn_DEF_BTPDataRequest, bdr); ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr);
return NULL; return NULL;
} }

View File

@ -4,8 +4,7 @@
#include <cpm/CPM.h> #include <cpm/CPM.h>
#include <cpm/INTEGER.h> #include <cpm/INTEGER.h>
#include <cpm/asn_application.h> #include <cpm/asn_application.h>
#include <itss-transport/BTPDataRequest.h> #include <itss-transport/TransportDataRequest.h>
#include <itss-transport/BTPDataIndication.h>
#include <it2s-config.h> #include <it2s-config.h>
#include <math.h> #include <math.h>
#include <signal.h> #include <signal.h>
@ -633,22 +632,24 @@ void *cp_service(void *fc){
facilities_t *facilities = (facilities_t *) fc; facilities_t *facilities = (facilities_t *) fc;
memset(valid_array, 0, sizeof(valid_array)); memset(valid_array, 0, sizeof(valid_array));
uint8_t bdr_oer[2048]; uint8_t tdr_oer[2048];
uint8_t fdi_oer[2048]; uint8_t fdi_oer[2048];
bdr_oer[0] = 4; //Facilities tdr_oer[0] = 4; //Facilities
fdi_oer[0] = 4; fdi_oer[0] = 4;
BTPDataRequest_t *bdr = calloc(1, sizeof(BTPDataRequest_t)); TransportDataRequest_t* tdr = calloc(1, sizeof(TransportDataRequest_t));
tdr->present = TransportDataRequest_PR_btp;
BTPDataRequest_t *bdr = &tdr->choice.btp;
FacilitiesDataIndication_t *fdi = calloc(1, sizeof(FacilitiesDataIndication_t)); FacilitiesDataIndication_t *fdi = calloc(1, sizeof(FacilitiesDataIndication_t));
roadRotationSin = sin(((facilities->dissemination->radar_rotation + 90.0) * PI) / 180); roadRotationSin = sin(((facilities->dissemination->radar_rotation + 90.0) * PI) / 180);
roadRotationCos = cos(((facilities->dissemination->radar_rotation + 90.0) * PI) / 180); roadRotationCos = cos(((facilities->dissemination->radar_rotation + 90.0) * PI) / 180);
/*--- Fill mandatory BTP Data Request parameters ---*/ /*--- Fill mandatory BTP Data Request parameters ---*/
bdr->gnDestinationAddress.buf = malloc(6); bdr->gn.destinationAddress.buf = malloc(6);
bdr->gnDestinationAddress.size = 6; bdr->gn.destinationAddress.size = 6;
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
bdr->gnDestinationAddress.buf[i] = 0xff; //Broadcast addr bdr->gn.destinationAddress.buf[i] = 0xff; //Broadcast addr
@ -656,13 +657,13 @@ void *cp_service(void *fc){
//The former doesn't have a source port and the latter have //The former doesn't have a source port and the latter have
bdr->destinationPort = Port_cpm; //CPM entity port for communication between Facilities and Transport bdr->destinationPort = Port_cpm; //CPM entity port for communication between Facilities and Transport
bdr->gnPacketTransportType = PacketTransportType_shb; //shb = Single Hop Broadcast packet bdr->gn.packetTransportType = PacketTransportType_shb; //shb = Single Hop Broadcast packet
bdr->gnTrafficClass = 2; //Identifier assigned to a GeoNetworking packet that expresses its requirements on data transport bdr->gn.trafficClass = 2; //Identifier assigned to a GeoNetworking packet that expresses its requirements on data transport
bdr->data.buf = malloc(1500); //CPM Data to be sent to the Transport layer bdr->data.buf = malloc(1500); //CPM Data to be sent to the Transport layer
if(facilities->use_security) { if(facilities->use_security) {
bdr->gnSecurityProfile = malloc(sizeof(long)); bdr->gn.securityProfile = malloc(sizeof(long));
*bdr->gnSecurityProfile = 1; *bdr->gn.securityProfile = 1;
} }
/*--- Fill mandatory Facilities Data Indication parameters ---*/ /*--- Fill mandatory Facilities Data Indication parameters ---*/
@ -694,8 +695,8 @@ void *cp_service(void *fc){
continue; continue;
/* Encode BTPDataRequest */ /* Encode BTPDataRequest */
asn_enc_rval_t enc_bdr = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer+1, 2047); asn_enc_rval_t enc_tdr = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer+1, 2047);
if(enc_bdr.encoded == -1){ if(enc_tdr.encoded == -1){
syslog_err("[facilities] encoding BTPDataRequest for cpm failed"); syslog_err("[facilities] encoding BTPDataRequest for cpm failed");
continue; continue;
} }
@ -708,7 +709,7 @@ void *cp_service(void *fc){
} }
/* Create thread to send packet to the Transport Layer (=3) */ /* Create thread to send packet to the Transport Layer (=3) */
queue_add(facilities->tx_queue, bdr_oer, enc_bdr.encoded+1, 3); queue_add(facilities->tx_queue, tdr_oer, enc_tdr.encoded+1, 3);
pthread_cond_signal(&facilities->tx_queue->trigger); pthread_cond_signal(&facilities->tx_queue->trigger);
/* Create thread to send packet to the Applications Layer (=5) */ /* Create thread to send packet to the Applications Layer (=5) */
@ -720,7 +721,7 @@ void *cp_service(void *fc){
} }
} }
ASN_STRUCT_FREE(asn_DEF_BTPDataRequest,bdr); ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr);
ASN_STRUCT_FREE(asn_DEF_FacilitiesDataIndication,fdi); ASN_STRUCT_FREE(asn_DEF_FacilitiesDataIndication,fdi);
/* Close sockets */ /* Close sockets */

View File

@ -7,8 +7,8 @@
#include "cpm.h" #include "cpm.h"
#include "sa.h" #include "sa.h"
#include <itss-transport/BTPDataRequest.h> #include <itss-transport/TransportDataRequest.h>
#include <itss-transport/BTPDataIndication.h> #include <itss-transport/TransportDataIndication.h>
#include <itss-facilities/FacilitiesDataIndication.h> #include <itss-facilities/FacilitiesDataIndication.h>
#include <itss-facilities/FacilitiesDataRequest.h> #include <itss-facilities/FacilitiesDataRequest.h>
#include <itss-facilities/FacilitiesDataResult.h> #include <itss-facilities/FacilitiesDataResult.h>
@ -48,11 +48,11 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8
bool handled_msg = false; bool handled_msg = false;
FacilitiesDataIndication_t *fdi = NULL; FacilitiesDataIndication_t *fdi = NULL;
BTPDataIndication_t *bdi = calloc(1, sizeof(BTPDataIndication_t)); TransportDataIndication_t* tdi = calloc(1, sizeof(TransportDataIndication_t));
asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_BTPDataIndication, (void**) &bdi, msg, msg_len); asn_dec_rval_t dec = oer_decode(NULL, &asn_DEF_TransportDataIndication, (void**) &tdi, msg, msg_len);
if (dec.code) { if (dec.code) {
syslog_err("[facilities]<- invalid bdi received"); syslog_err("[facilities]<- invalid TDI received");
rv = 1; rv = 1;
code = 1; code = 1;
zmq_send(responder, &code, 1, 0); zmq_send(responder, &code, 1, 0);
@ -60,137 +60,154 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8
} }
zmq_send(responder, &code, 1, 0); zmq_send(responder, &code, 1, 0);
syslog_debug("[facilities]<- BDI (%ldB)", bdi->data.size); syslog_debug("[facilities]<- received TDI (%dB)", msg_len);
// Parse message
asn_TYPE_descriptor_t *its_msg_descriptor;
void *its_msg;
switch (bdi->destinationPort) {
case Port_cam:
its_msg_descriptor = &asn_DEF_CAM;
its_msg = calloc(1, sizeof(CAM_t));
handled_msg = true;
break;
case Port_denm:
its_msg_descriptor = &asn_DEF_DENM;
its_msg = calloc(1, sizeof(DENM_t));
handled_msg = true;
break;
case Port_ivim:
its_msg_descriptor = &asn_DEF_IVIM;
its_msg = calloc(1, sizeof(IVIM_t));
handled_msg = true;
break;
case Port_cpm:
its_msg_descriptor = &asn_DEF_CPM;
its_msg = calloc(1, sizeof(CPM_t));
handled_msg = true;
break;
case Port_saem:
its_msg_descriptor = &asn_DEF_SAEM;
its_msg = calloc(1, sizeof(SAEM_t));
handled_msg = true;
break;
default:
syslog_debug("[facilities] messsage with unhandled BTP port received, ignoring");
goto cleanup;
}
dec = uper_decode_complete(NULL, its_msg_descriptor, (void**) &its_msg, bdi->data.buf, bdi->data.size);
if (dec.code) {
syslog_debug("[facilities]<- invalid %s received", its_msg_descriptor->name);
rv = 1;
goto cleanup;
}
// Get permisisons
uint8_t* ssp = NULL;
uint16_t ssp_len;
if (bdi->gnPermissions) {
ssp = bdi->gnPermissions->ssp.buf;
ssp_len = bdi->gnPermissions->ssp.size;
}
bool fwd = false; bool fwd = false;
// Manage message
switch (bdi->destinationPort) {
case Port_cam:
switch (check_cam(facilities, bdi, its_msg, &facilities->epv, ssp, ssp_len)) {
case CAM_OK:
fwd = true;
break;
case CAM_INVALID:
case CAM_BAD_PERMISSIONS:
default:
break;
}
break;
case Port_denm: asn_TYPE_descriptor_t *its_msg_descriptor = NULL;
void *its_msg = NULL;
switch (tdi->present) {
case TransportDataIndication_PR_btp:
; ;
#ifdef DEBUG
uint8_t* xml_denm = malloc(32768);
asn_enc_rval_t rve = xer_encode_to_buffer(xml_denm, 32768, 0x02, &asn_DEF_DENM, its_msg);
syslog_debug("DENM XER %d: %.*s", (int)rve.encoded, (int)rve.encoded , xml_denm);
free(xml_denm);
#endif
int64_t id = -1;
switch (event_manage(facilities->den, its_msg, &facilities->epv, &id, ssp, ssp_len)) {
case EVENT_NEW:
case EVENT_CANCELLATION:
case EVENT_NEGATION:
case EVENT_UPDATE:
case EVENT_NUMBER_EXCEEDED:
fwd = true;
break;
case EVENT_INVALID:
case EVENT_PASSED:
case EVENT_REPEATED:
case EVENT_BAD_PERMISSIONS:
break;
}
break;
case Port_ivim: // Parse message
switch (service_eval(facilities->infrastructure, SERVICE_IVI, its_msg, &facilities->epv, &id, ssp, ssp_len)) {
case SERVICE_NEW: switch (tdi->choice.btp.destinationPort) {
case SERVICE_CANCELLATION: case Port_cam:
case SERVICE_NEGATION: its_msg_descriptor = &asn_DEF_CAM;
case SERVICE_UPDATE: its_msg = calloc(1, sizeof(CAM_t));
case SERVICE_NUMBER_EXCEEDED: handled_msg = true;
fwd = true;
break; break;
case SERVICE_INVALID:
case SERVICE_REPEATED: case Port_denm:
case SERVICE_PASSED: its_msg_descriptor = &asn_DEF_DENM;
case SERVICE_BAD_PERMISSIONS: its_msg = calloc(1, sizeof(DENM_t));
handled_msg = true;
break;
case Port_ivim:
its_msg_descriptor = &asn_DEF_IVIM;
its_msg = calloc(1, sizeof(IVIM_t));
handled_msg = true;
break;
case Port_cpm:
its_msg_descriptor = &asn_DEF_CPM;
its_msg = calloc(1, sizeof(CPM_t));
handled_msg = true;
break;
case Port_saem:
its_msg_descriptor = &asn_DEF_SAEM;
its_msg = calloc(1, sizeof(SAEM_t));
handled_msg = true;
break;
default:
syslog_debug("[facilities] messsage with unhandled BTP port received, ignoring");
goto cleanup;
}
dec = uper_decode_complete(NULL, its_msg_descriptor, (void**) &its_msg, tdi->choice.btp.data.buf, tdi->choice.btp.data.size);
if (dec.code) {
syslog_debug("[facilities]<- invalid %s received", its_msg_descriptor->name);
rv = 1;
goto cleanup;
}
// Get permisisons
uint8_t* ssp = NULL;
uint16_t ssp_len;
if (tdi->choice.btp.gn.permissions) {
ssp = tdi->choice.btp.gn.permissions->ssp.buf;
ssp_len = tdi->choice.btp.gn.permissions->ssp.size;
}
// Manage message
switch (tdi->choice.btp.destinationPort) {
case Port_cam:
switch (check_cam(facilities, &tdi->choice.btp, its_msg, &facilities->epv, ssp, ssp_len)) {
case CAM_OK:
fwd = true;
break;
case CAM_INVALID:
case CAM_BAD_PERMISSIONS:
default:
break;
}
break;
case Port_denm:
;
#ifdef DEBUG
uint8_t* xml_denm = malloc(32768);
asn_enc_rval_t rve = xer_encode_to_buffer(xml_denm, 32768, 0x02, &asn_DEF_DENM, its_msg);
syslog_debug("DENM XER %d: %.*s", (int)rve.encoded, (int)rve.encoded , xml_denm);
free(xml_denm);
#endif
int64_t id = -1;
switch (event_manage(facilities->den, its_msg, &facilities->epv, &id, ssp, ssp_len)) {
case EVENT_NEW:
case EVENT_CANCELLATION:
case EVENT_NEGATION:
case EVENT_UPDATE:
case EVENT_NUMBER_EXCEEDED:
fwd = true;
break;
case EVENT_INVALID:
case EVENT_PASSED:
case EVENT_REPEATED:
case EVENT_BAD_PERMISSIONS:
break;
}
break;
case Port_ivim:
switch (service_eval(facilities->infrastructure, SERVICE_IVI, its_msg, &facilities->epv, &id, ssp, ssp_len)) {
case SERVICE_NEW:
case SERVICE_CANCELLATION:
case SERVICE_NEGATION:
case SERVICE_UPDATE:
case SERVICE_NUMBER_EXCEEDED:
fwd = true;
break;
case SERVICE_INVALID:
case SERVICE_REPEATED:
case SERVICE_PASSED:
case SERVICE_BAD_PERMISSIONS:
default:
break;
}
break;
case Port_saem:
saem_check(facilities, &facilities->press, its_msg);
break;
default: default:
break; break;
} }
break; break;
case TransportDataIndication_PR_tcp:
case Port_saem: break;
saem_check(facilities, &facilities->press, its_msg); case TransportDataIndication_PR_udp:
break; break;
default: default:
break; break;
} }
// Forward to application // Forward to application
if (fwd) { if (fwd) {
fdi = calloc(1, sizeof(FacilitiesDataIndication_t)); fdi = calloc(1, sizeof(FacilitiesDataIndication_t));
fdi->itsMessageType = bdi->destinationPort; fdi->itsMessageType = tdi->choice.btp.destinationPort;
fdi->data.size = bdi->data.size; fdi->data.size = tdi->choice.btp.data.size;
fdi->data.buf = malloc(bdi->data.size); fdi->data.buf = malloc(tdi->choice.btp.data.size);
memcpy(fdi->data.buf, bdi->data.buf, bdi->data.size); memcpy(fdi->data.buf, tdi->choice.btp.data.buf, tdi->choice.btp.data.size);
uint8_t buffer[PACKET_MAX_LEN]; uint8_t buffer[PACKET_MAX_LEN];
buffer[0] = 4; // Facilities buffer[0] = 4; // Facilities
@ -201,10 +218,10 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8
} }
cleanup: cleanup:
if (handled_msg && bdi->destinationPort != Port_denm && bdi->destinationPort != Port_ivim) { if (handled_msg && tdi->choice.btp.destinationPort != Port_denm && tdi->choice.btp.destinationPort != Port_ivim) {
ASN_STRUCT_FREE(*its_msg_descriptor, its_msg); ASN_STRUCT_FREE(*its_msg_descriptor, its_msg);
} }
ASN_STRUCT_FREE(asn_DEF_BTPDataIndication, bdi); ASN_STRUCT_FREE(asn_DEF_TransportDataIndication, tdi);
ASN_STRUCT_FREE(asn_DEF_FacilitiesDataIndication, fdi); ASN_STRUCT_FREE(asn_DEF_FacilitiesDataIndication, fdi);
return rv; return rv;

View File

@ -6,7 +6,7 @@
#include "cpm.h" #include "cpm.h"
#include <itss-facilities/FacilitiesDataResult.h> #include <itss-facilities/FacilitiesDataResult.h>
#include <itss-transport/BTPDataRequest.h> #include <itss-transport/TransportDataRequest.h>
#include <zmq.h> #include <zmq.h>
#include <syslog.h> #include <syslog.h>
@ -53,7 +53,9 @@ int facilities_request_result_rejected(void* responder) {
int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq) { int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq) {
int rv = 0; int rv = 0;
BTPDataRequest_t* bdr = calloc(1, sizeof(BTPDataRequest_t)); TransportDataRequest_t* tdr = calloc(1, sizeof(TransportDataRequest_t));
tdr->present = TransportDataRequest_PR_btp;
BTPDataRequest_t* bdr = &tdr->choice.btp;
void *its_msg = NULL; void *its_msg = NULL;
asn_TYPE_descriptor_t *its_msg_def = NULL; asn_TYPE_descriptor_t *its_msg_def = NULL;
@ -69,24 +71,24 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
its_msg_def = &asn_DEF_CAM; its_msg_def = &asn_DEF_CAM;
its_msg = calloc(1, sizeof(CAM_t)); its_msg = calloc(1, sizeof(CAM_t));
bdr->destinationPort = Port_cam; bdr->destinationPort = Port_cam;
bdr->gnPacketTransportType = PacketTransportType_shb; bdr->gn.packetTransportType = PacketTransportType_shb;
bdr->gnTrafficClass = 1; bdr->gn.trafficClass = 1;
break; break;
case ItsMessageType_denm: case ItsMessageType_denm:
its_msg_def = &asn_DEF_DENM; its_msg_def = &asn_DEF_DENM;
its_msg = calloc(1, sizeof(DENM_t)); its_msg = calloc(1, sizeof(DENM_t));
bdr->destinationPort = Port_denm; bdr->destinationPort = Port_denm;
bdr->gnPacketTransportType = PacketTransportType_gbc; bdr->gn.packetTransportType = PacketTransportType_gbc;
bdr->gnTrafficClass = 2; bdr->gn.trafficClass = 2;
break; break;
case ItsMessageType_ivim: case ItsMessageType_ivim:
its_msg_def = &asn_DEF_IVIM; its_msg_def = &asn_DEF_IVIM;
its_msg = calloc(1, sizeof(IVIM_t)); its_msg = calloc(1, sizeof(IVIM_t));
bdr->destinationPort = Port_ivim; bdr->destinationPort = Port_ivim;
bdr->gnPacketTransportType = PacketTransportType_shb; bdr->gn.packetTransportType = PacketTransportType_shb;
bdr->gnTrafficClass = 1; bdr->gn.trafficClass = 1;
break; break;
@ -94,8 +96,8 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
its_msg_def = &asn_DEF_CPM; its_msg_def = &asn_DEF_CPM;
its_msg = calloc(1, sizeof(CPM_t)); its_msg = calloc(1, sizeof(CPM_t));
bdr->destinationPort = Port_cpm; bdr->destinationPort = Port_cpm;
bdr->gnPacketTransportType = PacketTransportType_shb; bdr->gn.packetTransportType = PacketTransportType_shb;
bdr->gnTrafficClass = 2; bdr->gn.trafficClass = 2;
break; break;
default: default:
@ -273,52 +275,52 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
} }
bdr->data.size = (enc.encoded + 7) / 8; bdr->data.size = (enc.encoded + 7) / 8;
bdr->gnDestinationAddress.buf = malloc(6); bdr->gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) bdr->gnDestinationAddress.buf[i] = 0xff; for (int i = 0; i < 6; ++i) bdr->gn.destinationAddress.buf[i] = 0xff;
bdr->gnDestinationAddress.size = 6; bdr->gn.destinationAddress.size = 6;
if (transmission_start) { if (transmission_start) {
bdr->gnRepetitionStart = malloc(sizeof(long)); bdr->gn.repetitionStart = malloc(sizeof(long));
*bdr->gnRepetitionStart = transmission_start; *bdr->gn.repetitionStart = transmission_start;
} }
if (transmission_interval) { if (transmission_interval) {
bdr->gnRepetitionInterval = malloc(sizeof(long)); bdr->gn.repetitionInterval = malloc(sizeof(long));
*bdr->gnRepetitionInterval = transmission_interval; *bdr->gn.repetitionInterval = transmission_interval;
} }
if (transmission_duration) { if (transmission_duration) {
bdr->gnMaximumRepetitionTime = malloc(sizeof(long)); bdr->gn.maximumRepetitionTime = malloc(sizeof(long));
*bdr->gnMaximumRepetitionTime = transmission_duration; *bdr->gn.maximumRepetitionTime = transmission_duration;
} }
if (is_update) { if (is_update) {
bdr->gnIsUpdate = malloc(sizeof(long)); bdr->gn.isUpdate = malloc(sizeof(long));
*bdr->gnIsUpdate = 1; *bdr->gn.isUpdate = 1;
} }
if (facilities->use_security) { if (facilities->use_security) {
bdr->gnSecurityProfile = malloc(sizeof(long)); bdr->gn.securityProfile = malloc(sizeof(long));
*bdr->gnSecurityProfile = 1; *bdr->gn.securityProfile = 1;
} }
uint8_t bdr_oer[2048]; uint8_t tdr_oer[2048];
bdr_oer[0] = 4; // [facilities] service id tdr_oer[0] = 4; // [facilities] service id
enc = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer + 1, 2047); enc = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer + 1, 2047);
if (enc.encoded == -1) { if (enc.encoded == -1) {
syslog_err("[facilities] failed encoding BDR (%s)", enc.failed_type->name); syslog_err("[facilities] failed encoding TDR (%s)", enc.failed_type->name);
rv = 1; rv = 1;
goto cleanup; goto cleanup;
} }
queue_add(facilities->tx_queue, bdr_oer, enc.encoded+1, 3); queue_add(facilities->tx_queue, tdr_oer, enc.encoded+1, 3);
pthread_cond_signal(&facilities->tx_queue->trigger); pthread_cond_signal(&facilities->tx_queue->trigger);
} }
cleanup: cleanup:
if (its_msg_def && !managed_msg) ASN_STRUCT_FREE(*its_msg_def, its_msg); if (its_msg_def && !managed_msg) ASN_STRUCT_FREE(*its_msg_def, its_msg);
ASN_STRUCT_FREE(asn_DEF_BTPDataRequest, bdr); ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr);
return rv; return rv;
} }

View File

@ -3,7 +3,7 @@
#include "infrastructure.h" #include "infrastructure.h"
#include <it2s-tender/time.h> #include <it2s-tender/time.h>
#include <itss-transport/BTPDataRequest.h> #include <itss-transport/TransportDataRequest.h>
#include <saem/SAEM.h> #include <saem/SAEM.h>
#include <syslog.h> #include <syslog.h>
@ -140,32 +140,34 @@ cleanup:
void *sa_service(void *fc) { void *sa_service(void *fc) {
facilities_t *facilities = (facilities_t*) fc; facilities_t *facilities = (facilities_t*) fc;
BTPDataRequest_t *bdr = calloc(1, sizeof(BTPDataRequest_t)); TransportDataRequest_t *tdr = calloc(1, sizeof(TransportDataRequest_t));
tdr->present = TransportDataRequest_PR_btp;
BTPDataRequest_t *bdr = &tdr->choice.btp;
bdr->btpType = BTPType_btpB; bdr->btpType = BTPType_btpB;
bdr->gnDestinationAddress.buf = malloc(6); bdr->gn.destinationAddress.buf = malloc(6);
for (int i = 0; i < 6; ++i) { for (int i = 0; i < 6; ++i) {
bdr->gnDestinationAddress.buf[i] = 0xff; bdr->gn.destinationAddress.buf[i] = 0xff;
} }
bdr->gnDestinationAddress.size = 6; bdr->gn.destinationAddress.size = 6;
bdr->gnPacketTransportType = PacketTransportType_shb; bdr->gn.packetTransportType = PacketTransportType_shb;
bdr->destinationPort = Port_saem; bdr->destinationPort = Port_saem;
bdr->gnTrafficClass = 2; bdr->gn.trafficClass = 2;
bdr->data.buf = malloc(512); bdr->data.buf = malloc(512);
bdr->data.size = 512; bdr->data.size = 512;
if (facilities->use_security) { if (facilities->use_security) {
bdr->gnSecurityProfile = malloc(sizeof(long)); bdr->gn.securityProfile = malloc(sizeof(long));
*bdr->gnSecurityProfile = 1; *bdr->gn.securityProfile = 1;
} }
uint8_t bdr_oer[1024]; uint8_t tdr_oer[1024];
bdr_oer[0] = 4; // Facilities tdr_oer[0] = 4; // Facilities
int rv = 0; int rv = 0;
@ -177,19 +179,19 @@ void *sa_service(void *fc) {
continue; continue;
} }
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_BTPDataRequest, NULL, bdr, bdr_oer+1, 1023); asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_TransportDataRequest, NULL, tdr, tdr_oer+1, 1023);
if (enc.encoded == -1) { if (enc.encoded == -1) {
syslog_err("[facilities] encoding BTPDataRequest for SAEM failed"); syslog_err("[facilities] encoding BTPDataRequest for SAEM failed");
continue; continue;
} }
queue_add(facilities->tx_queue, bdr_oer, enc.encoded+1, 3); queue_add(facilities->tx_queue, tdr_oer, enc.encoded+1, 3);
pthread_cond_signal(&facilities->tx_queue->trigger); pthread_cond_signal(&facilities->tx_queue->trigger);
lightship_reset_timer(facilities->lightship, &facilities->epv); lightship_reset_timer(facilities->lightship, &facilities->epv);
} }
ASN_STRUCT_FREE(asn_DEF_BTPDataRequest, bdr); ASN_STRUCT_FREE(asn_DEF_TransportDataRequest, tdr);
return NULL; return NULL;

View File

@ -1,5 +1,5 @@
#include <itss-transport/BTPDataRequest.h> #include <itss-transport/TransportDataRequest.h>
#include <itss-transport/BTPDataIndication.h> #include <itss-transport/TransportDataIndication.h>
#include <itss-facilities/FacilitiesDataIndication.h> #include <itss-facilities/FacilitiesDataIndication.h>
#include <itss-facilities/FacilitiesDataRequest.h> #include <itss-facilities/FacilitiesDataRequest.h>
#include <itss-management/ManagementRequest.h> #include <itss-management/ManagementRequest.h>
@ -144,15 +144,15 @@ int cam_gen(void* ctx) {
zmq_close(transport_socket); zmq_close(transport_socket);
BTPDataRequest_t* bdr = NULL; TransportDataRequest_t* tdr = NULL;
asn_dec_rval_t dec = asn_decode(NULL, ATS_CANONICAL_OER, &asn_DEF_BTPDataRequest, (void**) &bdr, buffer+1, 2047); asn_dec_rval_t dec = asn_decode(NULL, ATS_CANONICAL_OER, &asn_DEF_TransportDataRequest, (void**) &tdr, buffer+1, 2047);
if (dec.code) { if (dec.code) {
printf(" FAIL\n"); fflush(stdout); printf(" FAIL\n"); fflush(stdout);
return 1; return 1;
} }
printf(" - Received CAM BDR (%ldB)\n", bdr->data.size); fflush(stdout); printf(" - Received CAM BDR (%ldB)\n", tdr->choice.btp.data.size); fflush(stdout);
if (bdr->destinationPort == Port_cam) { if (tdr->choice.btp.destinationPort == Port_cam) {
printf(" OK\n"); fflush(stdout); printf(" OK\n"); fflush(stdout);
} else { } else {
printf(" FAIL\n"); fflush(stdout); printf(" FAIL\n"); fflush(stdout);
@ -165,7 +165,10 @@ int cam_gen(void* ctx) {
int forward_up(void* ctx) { int forward_up(void* ctx) {
printf("Testing forwarding up:\n"); fflush(stdout); printf("Testing forwarding up:\n"); fflush(stdout);
BTPDataIndication_t* bdi = calloc(1, sizeof(BTPDataIndication_t));
TransportDataIndication_t* tdi = calloc(1, sizeof(TransportDataIndication_t));
tdi->present = TransportDataIndication_PR_btp;
BTPDataIndication_t* bdi = &tdi->choice.btp;
char* cam_hex = "02027dfddf4403ca4059bba5f38cc40dba9ffffffc2230eff200e11fc0078082a88a8337fee3fff600004dffea800618d08018efff14003ac68800c77ff8e002263460063bffd1000fb1a30031dffe2800958d30018efff840048c68800c77ffae002c63480063bffbd001a31a40031dfff28002d8cf0018c0"; char* cam_hex = "02027dfddf4403ca4059bba5f38cc40dba9ffffffc2230eff200e11fc0078082a88a8337fee3fff600004dffea800618d08018efff14003ac68800c77ff8e002263460063bffd1000fb1a30031dffe2800958d30018efff840048c68800c77ffae002c63480063bffbd001a31a40031dfff28002d8cf0018c0";
@ -175,21 +178,21 @@ int forward_up(void* ctx) {
bdi->data.buf = cam; bdi->data.buf = cam;
bdi->data.size = cam_len; bdi->data.size = cam_len;
bdi->gnDestinationAddress.buf = calloc(1, 6); bdi->gn.destinationAddress.buf = calloc(1, 6);
bdi->gnDestinationAddress.size = 6; bdi->gn.destinationAddress.size = 6;
bdi->destinationPort = Port_cam; bdi->destinationPort = Port_cam;
uint8_t b_bdi_cam[512]; uint8_t b_tdi_cam[512];
b_bdi_cam[0] = 3; b_tdi_cam[0] = 3;
asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_BTPDataIndication, bdi, b_bdi_cam+1, 511); asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_TransportDataIndication, tdi, b_tdi_cam+1, 511);
void* facilities_socket = zmq_socket(ctx, ZMQ_REQ); void* facilities_socket = zmq_socket(ctx, ZMQ_REQ);
int code = 0; int code = 0;
zmq_connect(facilities_socket, "ipc:///tmp/itss/facilities"); zmq_connect(facilities_socket, "ipc:///tmp/itss/facilities");
zmq_send(facilities_socket, b_bdi_cam, enc.encoded+1, 0); zmq_send(facilities_socket, b_tdi_cam, enc.encoded+1, 0);
zmq_recv(facilities_socket, &code, 1, 0); zmq_recv(facilities_socket, &code, 1, 0);
if (code) { if (code) {
printf(" FAIL\n"); fflush(stdout); printf(" FAIL\n"); fflush(stdout);