Packet IDs

This commit is contained in:
emanuel 2022-03-01 16:49:44 +00:00
parent 73349e61d7
commit a0e18ae4d8
7 changed files with 34 additions and 31 deletions

View File

@ -165,7 +165,7 @@ static enum EVENT_CHECK_R event_check(den_t *den, DENM_t *denm, it2s_tender_epv_
return EVENT_NEW;
}
static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* id) {
static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, uint64_t* id) {
uint64_t now = it2s_tender_get_clock(epv);
@ -212,8 +212,7 @@ static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t*
}
if (index != -1) {
den->events[index]->id = rand();
*id = den->events[index]->id;
den->events[index]->id = *id;
den->events[index]->enabled = true;
den->events[index]->state = state;
den->events[index]->station_id = denm->denm.management.actionID.originatingStationID;
@ -236,7 +235,7 @@ static int event_add(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t*
else return 0; // Event added to db
}
static int event_update(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* id) {
static int event_update(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, uint64_t* id) {
uint64_t now = it2s_tender_get_clock(epv);
@ -319,7 +318,7 @@ static int event_update(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_
else return 0; // Event updated
}
enum EVENT_CHECK_R event_manage(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint32_t ssp_len) {
enum EVENT_CHECK_R event_manage(den_t *den, DENM_t *denm, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint32_t ssp_len) {
int rv = 0;
switch (rv = event_check(den, denm, epv, ssp, ssp_len)) {
case EVENT_NEW:

View File

@ -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(den_t* den, DENM_t* denm, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint32_t ssp_len);
enum EVENT_CHECK_R event_manage(den_t* den, DENM_t* denm, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint32_t ssp_len);
void* den_service(void* fc);

View File

@ -77,14 +77,15 @@ static int transport_indication(facilities_t *facilities, void* responder, void*
bool fwd = false;
uint64_t id = 0;
asn_TYPE_descriptor_t *its_msg_descriptor = NULL;
void *its_msg = NULL;
int its_msg_type = 0;
switch (tpi->present) {
case TransportPacketIndication_PR_btp:
;
id = tpi->choice.btp.id;
// Parse message
switch (tpi->choice.btp.destinationPort) {
case Port_cam:
@ -185,7 +186,6 @@ static int transport_indication(facilities_t *facilities, void* responder, void*
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:
@ -243,6 +243,7 @@ static int transport_indication(facilities_t *facilities, void* responder, void*
}
break;
case TransportPacketIndication_PR_tcp:
id = tpi->choice.tcp.id;
sreq = calloc(1, sizeof(SecurityRequest_t));
sreq->present = SecurityRequest_PR_tlsRecv;
@ -315,6 +316,7 @@ static int transport_indication(facilities_t *facilities, void* responder, void*
break;
case TransportPacketIndication_PR_udp:
id = tpi->choice.udp.id;
break;
default:
@ -327,6 +329,8 @@ static int transport_indication(facilities_t *facilities, void* responder, void*
fi->present = FacilitiesIndication_PR_message;
FacilitiesMessageIndication_t* fmi = &fi->choice.message;
fmi->id = id;
fmi->itsMessageType = tpi->choice.btp.destinationPort;
fmi->data.size = tpi->choice.btp.data.size;
@ -369,7 +373,7 @@ static int facilities_request(facilities_t *facilities, void* responder, uint8_t
switch (fr->present) {
case FacilitiesRequest_PR_message:
rv = facilities_request_single_message(facilities, responder, fr);
rv = facilities_request_single_message(facilities, responder, &fr->choice.message);
break;
case FacilitiesRequest_PR_data:

View File

@ -83,7 +83,6 @@ static enum SERVICE_EVAL_R service_check(infrastructure_t* infrastructure, enum
IVIM_t* ivim = (IVIM_t*) its_msg;
uint64_t timestamp, valid_to, valid_from;
if (!ivim->ivi.mandatory.timeStamp) {
timestamp = now;
@ -262,7 +261,7 @@ static enum SERVICE_EVAL_R service_check(infrastructure_t* infrastructure, enum
return SERVICE_NEW;
}
static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id) {
static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id) {
switch (type) {
case SERVICE_IVI:
@ -332,8 +331,7 @@ static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type,
if (index != -1) {
infrastructure->services[index]->ivim = ivim;
infrastructure->services[index]->id = rand();
*id = infrastructure->services[index]->id;
infrastructure->services[index]->id = *id;
infrastructure->services[index]->enabled = true;
infrastructure->services[index]->state = state;
infrastructure->services[index]->station_id = ivim->header.stationID;
@ -349,7 +347,7 @@ static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type,
else return 0; // Services added to db
}
static int service_update(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id) {
static int service_update(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id) {
switch (type) {
case SERVICE_IVI:
@ -456,7 +454,7 @@ static int service_update(infrastructure_t* infrastructure, enum SERVICE_TYPE ty
else return 0; // Event updated
}
enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint16_t ssp_len) {
enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint16_t ssp_len) {
int rv = 0;
switch (rv = service_check(infrastructure, type, its_msg, epv, ssp, ssp_len)) {
case SERVICE_NEW:

View File

@ -86,7 +86,7 @@ enum SERVICE_EVAL_R {
SERVICE_BAD_PERMISSIONS
};
enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, int64_t* id, uint8_t* ssp, uint16_t ssp_len);
enum SERVICE_EVAL_R service_eval(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg, it2s_tender_epv_t* epv, uint64_t* id, uint8_t* ssp, uint16_t ssp_len);
void* infrastructure_service(void* fc);

View File

@ -52,9 +52,16 @@ int facilities_request_result_rejected(void* responder) {
return rv;
}
int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr) {
int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesMessageRequest_t* frm) {
int rv = 0;
uint64_t id = 0;
if (!frm->id) {
id = rand();
} else if (*frm->id == 0) {
id = rand();
}
TransportRequest_t* tr = calloc(1, sizeof(TransportRequest_t));
tr->present = TransportRequest_PR_packet;
TransportPacketRequest_t* tpr = &tr->choice.packet;
@ -70,7 +77,7 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
uint32_t transmission_interval = 0;
uint64_t transmission_start = 0;
switch (fr->choice.message.itsMessageType) {
switch (frm->itsMessageType) {
case ItsMessageType_cam:
its_msg_def = &asn_DEF_CAM;
its_msg = calloc(1, sizeof(CAM_t));
@ -105,13 +112,13 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
break;
default:
syslog_err("[facilities] unrecognized FR message type (%ld)", fr->choice.message.itsMessageType);
syslog_err("[facilities] unrecognized FR message type (%ld)", frm->itsMessageType);
facilities_request_result_rejected(responder);
rv = 1;
goto cleanup;
}
asn_dec_rval_t dec = uper_decode_complete(NULL, its_msg_def, (void**) &its_msg, fr->choice.message.data.buf, fr->choice.message.data.size);
asn_dec_rval_t dec = uper_decode_complete(NULL, its_msg_def, (void**) &its_msg, frm->data.buf, frm->data.size);
if (dec.code) {
syslog_debug("[facilities] invalid FR %s received", its_msg_def->name);
facilities_request_result_rejected(responder);
@ -119,11 +126,10 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
goto cleanup;
}
int64_t id = -1;
bool is_update = false;
int managed_msg = false;
if (fr->choice.message.itsMessageType == ItsMessageType_denm) {
if (frm->itsMessageType == ItsMessageType_denm) {
managed_msg = true;
uint8_t event_type = event_manage(facilities->den, its_msg, &facilities->epv, &id, NULL, 0);
@ -211,7 +217,7 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
}
}
}
} else if (fr->choice.message.itsMessageType == ItsMessageType_ivim) {
} else if (frm->itsMessageType == ItsMessageType_ivim) {
managed_msg = true;
uint8_t service_type = service_eval(facilities->infrastructure, SERVICE_IVI, its_msg, &facilities->epv, &id, NULL, 0);
@ -262,14 +268,10 @@ int facilities_request_single_message(facilities_t* facilities, void* responder,
// Forward message to [transport]
if (fwd) {
if (id != -1) {
bpr->id = id;
} else {
bpr->id = 0;
}
bpr->btpType = BTPType_btpB;
bpr->id = id;
bpr->data.buf = malloc(2048);
asn_enc_rval_t enc = uper_encode_to_buffer(its_msg_def, NULL, its_msg, bpr->data.buf, 2048);
if (enc.encoded == -1) {

View File

@ -7,7 +7,7 @@
int facilities_request_result_accepted(void* responder);
int facilities_request_result_rejected(void* responder);
int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr);
int facilities_request_single_message(facilities_t* facilities, void* responder, FacilitiesMessageRequest_t* frm);
int facilities_request_active_episodes(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr);
int facilities_request_attribute_types(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr);
int facilities_request_loaded_protected_zones(facilities_t* facilities, void* responder, FacilitiesRequest_t* fr);