diff --git a/src/cam.c b/src/cam.c index 45c4156..da773d7 100644 --- a/src/cam.c +++ b/src/cam.c @@ -93,7 +93,7 @@ static int mk_cam(facilities_t* facilities, uint8_t *cam_oer, uint32_t *cam_len) cam->header.protocolVersion = 2; cam->header.messageID = ItsPduHeader__messageID_cam; pthread_mutex_lock(&facilities->id.lock); - cam->header.stationID = facilities->id.value; + cam->header.stationID = facilities->id.station_id; pthread_mutex_unlock(&facilities->id.lock); cam->cam.camParameters.basicContainer.stationType = facilities->station_type; diff --git a/src/config.c b/src/config.c index ab9a005..8714426 100644 --- a/src/config.c +++ b/src/config.c @@ -214,11 +214,13 @@ int facilities_config(void* facilities_s) { SecurityReply_t* sREP = NULL; sREQ->present = SecurityRequest_PR_ids; - sREQ->choice.ids.list.count = 1; - sREQ->choice.ids.list.size = sizeof(void*); - sREQ->choice.ids.list.array = malloc(sizeof(void*)); + 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; uint8_t b_sdu[256]; asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_SecurityRequest, NULL, sREQ, b_sdu, 256); @@ -237,8 +239,15 @@ int facilities_config(void* facilities_s) { } for (int i = 0; i < sREP->data->choice.ids.list.count; ++i) { - if (sREP->data->choice.ids.list.array[i]->present == SecurityId_PR_stationId) { - facilities->id.value = sREP->data->choice.ids.list.array[i]->choice.stationId; + switch (sREP->data->choice.ids.list.array[i]->present) { + case SecurityId_PR_stationId: + facilities->id.station_id = sREP->data->choice.ids.list.array[i]->choice.stationId; + break; + case SecurityId_PR_ipv6Address: + memcpy(facilities->id.ipv6_addr, sREP->data->choice.ids.list.array[i]->choice.ipv6Address.buf, 16); + break; + default: + break; } } @@ -246,25 +255,8 @@ int facilities_config(void* facilities_s) { ASN_STRUCT_FREE(asn_DEF_SecurityReply, sREP); } else { - facilities->id.value = config->security.identity.station_id; + facilities->id.station_id = config->security.identity.station_id; } - // Inform management - ManagementRequest_t* mreq_set = calloc(1, sizeof(ManagementRequest_t)); - mreq_set->present = ManagementRequest_PR_attributes; - mreq_set->choice.attributes.present = ManagementRequestAttributes_PR_set; - mreq_set->choice.attributes.choice.set.stationID = malloc(sizeof(long)); - *mreq_set->choice.attributes.choice.set.stationID = facilities->id.value; - uint8_t b_oer[128]; - asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_ManagementRequest, mreq_set, b_oer, 128); - if (enc.encoded != -1) { - void* management_socket = zmq_socket(facilities->zmq.ctx, ZMQ_REQ); - zmq_connect(management_socket, facilities->zmq.management_address); - zmq_send(management_socket, b_oer, enc.encoded, 0); - uint8_t code; - zmq_recv(management_socket, &code, 1, 0); - zmq_close(management_socket); - } - ASN_STRUCT_FREE(asn_DEF_ManagementRequest, mreq_set); // DENM facilities->den->n_max_events = config->facilities.denm.nmax_active_events; @@ -362,7 +354,7 @@ int facilities_config(void* facilities_s) { void* management_socket = zmq_socket(facilities->zmq.ctx, ZMQ_REQ); zmq_connect(management_socket, facilities->zmq.management_address); uint8_t buffer[256]; - enc = oer_encode_to_buffer(&asn_DEF_ManagementRequest, NULL, mreq, buffer, 256); + asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_ManagementRequest, NULL, mreq, buffer, 256); zmq_send(management_socket, buffer, enc.encoded, 0); zmq_recv(management_socket, buffer, 256, 0); diff --git a/src/cpm.c b/src/cpm.c index 77c5c57..0656028 100644 --- a/src/cpm.c +++ b/src/cpm.c @@ -500,7 +500,9 @@ static int mk_cpm(facilities_t* facilities, uint8_t *bdr_oer, uint32_t *bdr_len, cpm_tx->header.protocolVersion = PROTOCOL_VERSION; cpm_tx->header.messageID = MESSAGE_ID; - cpm_tx->header.stationID = facilities->id.value; + pthread_mutex_lock(&facilities->id.lock); + cpm_tx->header.stationID = facilities->id.station_id; + pthread_mutex_unlock(&facilities->id.lock); uint64_t generationDeltaTime = it2s_tender_get_clock(&facilities->epv) % 65536; // generationDeltaTime = TimestampIts mod 65 536 diff --git a/src/facilities.c b/src/facilities.c index d23a269..b8fb2f1 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -348,8 +348,15 @@ static int security_indication(facilities_t *facilities, void* responder_secured // Change Station ID for (int i = 0; i < si->choice.idChangeEvent.ids.list.count; ++i) { - if (si->choice.idChangeEvent.ids.list.array[i]->present == SecurityId_PR_stationId) { - facilities->id.value = si->choice.idChangeEvent.ids.list.array[i]->choice.stationId; + switch (si->choice.idChangeEvent.ids.list.array[i]->present) { + case SecurityId_PR_stationId: + facilities->id.station_id = si->choice.idChangeEvent.ids.list.array[i]->choice.stationId; + break; + case SecurityId_PR_ipv6Address: + memcpy(facilities->id.ipv6_addr, si->choice.idChangeEvent.ids.list.array[i]->choice.ipv6Address.buf, 16); + break; + default: + break; } } diff --git a/src/facilities.h b/src/facilities.h index 6164f4d..ad37adf 100644 --- a/src/facilities.h +++ b/src/facilities.h @@ -71,7 +71,8 @@ typedef struct facilities { struct { pthread_mutex_t lock; - uint64_t value; + uint64_t station_id; + uint8_t ipv6_addr[16]; struct { pthread_mutex_t lock; bool random; diff --git a/src/requests.c b/src/requests.c index 51e3e9c..72ec4c8 100644 --- a/src/requests.c +++ b/src/requests.c @@ -147,7 +147,7 @@ int facilities_request_single_message(facilities_t* facilities, void* responder, if (fwd) { // set stationID pthread_mutex_lock(&facilities->id.lock); - ((DENM_t*)its_msg)->header.stationID = facilities->id.value; + ((DENM_t*)its_msg)->header.stationID = facilities->id.station_id; pthread_mutex_unlock(&facilities->id.lock); // Set only one trace @@ -450,7 +450,7 @@ int facilities_request_attribute_types(facilities_t* facilities, void* responder 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); - *((uint64_t*) frep->choice.data.choice.attributes.list.array[j]->data.buf) = facilities->id.value; + *((uint64_t*) frep->choice.data.choice.attributes.list.array[j]->data.buf) = facilities->id.station_id; pthread_mutex_unlock(&facilities->id.lock); break; diff --git a/src/sa.c b/src/sa.c index 99e2e31..37688c3 100644 --- a/src/sa.c +++ b/src/sa.c @@ -115,10 +115,7 @@ int mk_saem(facilities_t* facilities, uint8_t* b_saem, uint32_t* b_saem_len) { saem->header.messageID = messageID_saem; pthread_mutex_lock(&facilities->id.lock); - saem->header.stationID = facilities->id.value; - pthread_mutex_unlock(&facilities->id.lock); - - uint8_t ipv6_addr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; + saem->header.stationID = facilities->id.station_id; /* sam */ saem->sam.version = 0; @@ -144,13 +141,15 @@ int mk_saem(facilities_t* facilities, uint8_t* b_saem, uint32_t* b_saem_len) { saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions->list.array[0]->choice.addressIPv6.size = 16; saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions->list.array[0]->choice.addressIPv6.buf = malloc(16); - memcpy(saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions->list.array[0]->choice.addressIPv6.buf, ipv6_addr, 16); + memcpy(saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions->list.array[0]->choice.addressIPv6.buf, facilities->id.ipv6_addr, 16); saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions->list.array[1] = calloc(1, sizeof(ServiceInfoExt_t)); saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions->list.array[1]->present = ServiceInfoExt_PR_servicePort; saem->sam.body.serviceInfos->list.array[i]->chOptions.extensions->list.array[1]->choice.servicePort = 7777; } + pthread_mutex_unlock(&facilities->id.lock); + asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_UNALIGNED_CANONICAL_PER, &asn_DEF_SAEM, saem, b_saem, *b_saem_len); if (enc.encoded == -1) { syslog_err("[facilities] [sa] failure to encode SAEM (%s)", enc.failed_type->name);