diff --git a/src/config.c b/src/config.c index 22a76f7..61ccbc0 100644 --- a/src/config.c +++ b/src/config.c @@ -186,6 +186,23 @@ int facilities_config(void* facilities_s) { } else { facilities->id.value = config->security.identity.station_id; } + // Inform management + ManagementRequest_t* mreq_set = calloc(1, sizeof(ManagementRequest_t)); + mreq_set->present = ManagementRequest_PR_set; + mreq_set->choice.set.stationId = malloc(sizeof(long)); + *mreq_set->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->default_event_duration = config->facilities.denm.default_event_duration; @@ -274,7 +291,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]; - asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_ManagementRequest, NULL, mreq, buffer, 256); + 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/facilities.c b/src/facilities.c index e4fdc55..4b0a1fd 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -264,8 +265,8 @@ static int security_indication(facilities_t *facilities, void* responder_secured } if (facilities->id.change.stage == ID_CHANGE_PREPARE && - si->choice.idChangeEvent.command != SecurityIdChangeEventType_commit && - si->choice.idChangeEvent.command != SecurityIdChangeEventType_abort) { + si->choice.idChangeEvent.command != SecurityIdChangeEventType_commit && + si->choice.idChangeEvent.command != SecurityIdChangeEventType_abort) { pthread_mutex_unlock(&facilities->id.change.lock); syslog_debug("[facilities] current identity change state is prepare, but received identity change command is not commit nor abort"); rv = 1; @@ -285,10 +286,6 @@ static int security_indication(facilities_t *facilities, void* responder_secured ; facilities->id.change.stage = ID_CHANGE_COMMIT; - // Change Station ID - facilities->id.value = rand(); - pthread_mutex_unlock(&facilities->id.lock); - // Reset lightship for (int i = 0; i < facilities->lightship->pos_history_len; ++i) { free(facilities->lightship->pos_history[i]); @@ -302,7 +299,13 @@ static int security_indication(facilities_t *facilities, void* responder_secured pthread_mutex_unlock(&facilities->lightship->lock); + // Change Station ID + facilities->id.value = rand(); + facilities->id.change.stage = ID_CHANGE_INACTIVE; + + pthread_mutex_unlock(&facilities->id.lock); + break; case SecurityIdChangeEventType_abort: @@ -319,13 +322,35 @@ static int security_indication(facilities_t *facilities, void* responder_secured goto cleanup; } - pthread_mutex_unlock(&facilities->id.change.lock); sr->present = SecurityResponse_PR_idChangeEvent; sr->choice.idChangeEvent.returnCode = 0; enc = oer_encode_to_buffer(&asn_DEF_SecurityResponse, NULL, sr, buffer, 64); zmq_send(responder_secured, buffer, enc.encoded, 0); + if (facilities->id.change.stage == ID_CHANGE_INACTIVE) { + // Inform management + ManagementRequest_t* mreq = calloc(1, sizeof(ManagementRequest_t)); + mreq->present = ManagementRequest_PR_set; + mreq->choice.set.stationId = malloc(sizeof(long)); + *mreq->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, b_oer, 128); + if (enc.encoded != -1) { + int wait_ms = 1000; + void* management_socket = zmq_socket(facilities->zmq.ctx, ZMQ_REQ); + zmq_setsockopt(management_socket, ZMQ_RCVTIMEO, &wait_ms, sizeof(int)); + zmq_connect(management_socket, facilities->zmq.management_address); + zmq_send(management_socket, b_oer, enc.encoded, 0); + uint8_t code; + rv = zmq_recv(management_socket, &code, 1, 0); + if (rv == -1) {syslog_err("[facilities]-> timeout sending MReq set.stationId to ->[management]");} + zmq_close(management_socket); + } + ASN_STRUCT_FREE(asn_DEF_ManagementRequest, mreq); + } + + pthread_mutex_unlock(&facilities->id.change.lock); cleanup: if (rv) { @@ -497,7 +522,7 @@ int main() { facilities.id.change.stage = ID_CHANGE_BLOCKED; } pthread_mutex_unlock(&facilities.id.change.lock); - + if (!in_idchange) { transport_indication(&facilities, facilities.zmq.responders[i].socket, buffer+1, PACKET_MAX_LEN-1);