Initial effort to support [transport] various protocols
This commit is contained in:
parent
268e245679
commit
796fdeab67
35
src/cam.c
35
src/cam.c
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
33
src/cpm.c
33
src/cpm.c
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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,12 +60,20 @@ 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);
|
||||||
|
|
||||||
|
bool fwd = false;
|
||||||
|
|
||||||
|
asn_TYPE_descriptor_t *its_msg_descriptor = NULL;
|
||||||
|
void *its_msg = NULL;
|
||||||
|
|
||||||
|
switch (tdi->present) {
|
||||||
|
case TransportDataIndication_PR_btp:
|
||||||
|
;
|
||||||
|
|
||||||
// Parse message
|
// Parse message
|
||||||
asn_TYPE_descriptor_t *its_msg_descriptor;
|
|
||||||
void *its_msg;
|
switch (tdi->choice.btp.destinationPort) {
|
||||||
switch (bdi->destinationPort) {
|
|
||||||
case Port_cam:
|
case Port_cam:
|
||||||
its_msg_descriptor = &asn_DEF_CAM;
|
its_msg_descriptor = &asn_DEF_CAM;
|
||||||
its_msg = calloc(1, sizeof(CAM_t));
|
its_msg = calloc(1, sizeof(CAM_t));
|
||||||
|
|
@ -101,7 +109,7 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
dec = uper_decode_complete(NULL, its_msg_descriptor, (void**) &its_msg, bdi->data.buf, bdi->data.size);
|
dec = uper_decode_complete(NULL, its_msg_descriptor, (void**) &its_msg, tdi->choice.btp.data.buf, tdi->choice.btp.data.size);
|
||||||
if (dec.code) {
|
if (dec.code) {
|
||||||
syslog_debug("[facilities]<- invalid %s received", its_msg_descriptor->name);
|
syslog_debug("[facilities]<- invalid %s received", its_msg_descriptor->name);
|
||||||
rv = 1;
|
rv = 1;
|
||||||
|
|
@ -111,16 +119,15 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8
|
||||||
// Get permisisons
|
// Get permisisons
|
||||||
uint8_t* ssp = NULL;
|
uint8_t* ssp = NULL;
|
||||||
uint16_t ssp_len;
|
uint16_t ssp_len;
|
||||||
if (bdi->gnPermissions) {
|
if (tdi->choice.btp.gn.permissions) {
|
||||||
ssp = bdi->gnPermissions->ssp.buf;
|
ssp = tdi->choice.btp.gn.permissions->ssp.buf;
|
||||||
ssp_len = bdi->gnPermissions->ssp.size;
|
ssp_len = tdi->choice.btp.gn.permissions->ssp.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fwd = false;
|
|
||||||
// Manage message
|
// Manage message
|
||||||
switch (bdi->destinationPort) {
|
switch (tdi->choice.btp.destinationPort) {
|
||||||
case Port_cam:
|
case Port_cam:
|
||||||
switch (check_cam(facilities, bdi, its_msg, &facilities->epv, ssp, ssp_len)) {
|
switch (check_cam(facilities, &tdi->choice.btp, its_msg, &facilities->epv, ssp, ssp_len)) {
|
||||||
case CAM_OK:
|
case CAM_OK:
|
||||||
fwd = true;
|
fwd = true;
|
||||||
break;
|
break;
|
||||||
|
|
@ -181,16 +188,26 @@ static int transport_indication(facilities_t *facilities, void* responder, uint8
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case TransportDataIndication_PR_tcp:
|
||||||
|
break;
|
||||||
|
case TransportDataIndication_PR_udp:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
30
src/sa.c
30
src/sa.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue