Heartbeats v2

This commit is contained in:
emanuel 2021-07-01 15:39:08 +01:00
parent 1a76fd89cb
commit a22a723fca
4 changed files with 123 additions and 38 deletions

View File

@ -228,14 +228,18 @@ static int facilities_request(facilities_t *facilities, void* responder, uint8_t
rv = facilities_request_single_message(facilities, responder, fdreq); rv = facilities_request_single_message(facilities, responder, fdreq);
break; break;
case FacilitiesDataRequest_PR_activeEvents: case FacilitiesDataRequest_PR_activeEpisodes:
rv = facilities_request_active_events(facilities, responder, fdreq); rv = facilities_request_active_episodes(facilities, responder, fdreq);
break; break;
case FacilitiesDataRequest_PR_attributeTypes: case FacilitiesDataRequest_PR_attributeTypes:
rv = facilities_request_attribute_types(facilities, responder, fdreq); rv = facilities_request_attribute_types(facilities, responder, fdreq);
break; break;
case FacilitiesDataRequest_PR_loadedProtectionZones:
rv = facilities_request_loaded_protected_zones(facilities, responder, fdreq);
break;
default: default:
syslog_err("[facilities] unrecognized FDR type received (%d)", fdreq->present); syslog_err("[facilities] unrecognized FDR type received (%d)", fdreq->present);
facilities_request_result_rejected(responder); facilities_request_result_rejected(responder);

View File

@ -529,7 +529,7 @@ void* infrastructure_service(void *fc) {
infrastructure->services[i] = calloc(1, sizeof(service_t)); infrastructure->services[i] = calloc(1, sizeof(service_t));
} }
uint32_t sleep4us = 5e5; uint32_t sleep4us = 1e6;
uint32_t sleep_count = 0; uint32_t sleep_count = 0;
while (!facilities->exit) { while (!facilities->exit) {

View File

@ -323,55 +323,95 @@ cleanup:
return rv; return rv;
} }
int facilities_request_active_events(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq) { int facilities_request_active_episodes(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq) {
int rv = 0; int rv = 0;
FacilitiesDataResult_t* fdres = calloc(1, sizeof(FacilitiesDataResult_t)); FacilitiesDataResult_t* fdres = calloc(1, sizeof(FacilitiesDataResult_t));
uint8_t* fdres_oer = NULL; uint8_t* fdres_oer = NULL;
pthread_mutex_lock(&facilities->den->lock);
fdres->code = FacilitiesResultCode_accepted; fdres->code = FacilitiesResultCode_accepted;
fdres->result = calloc(1, sizeof(FacilitiesResult_t)); fdres->result = calloc(1, sizeof(FacilitiesResult_t));
fdres->result->present = FacilitiesResult_PR_events; fdres->result->present = FacilitiesResult_PR_episodes;
pthread_mutex_lock(&facilities->den->lock);
pthread_mutex_lock(&facilities->infrastructure->lock);
uint16_t nae = facilities->den->n_active_events; uint16_t nae = facilities->den->n_active_events;
uint16_t nas = facilities->infrastructure->n_active_services;
switch (fdreq->choice.activeEvents) { uint16_t na = 0;
case EventType_active:
fdres->result->choice.events.list.count = nae; for (int e = 0; e < fdreq->choice.activeEpisodes.list.count; ++e) {
fdres->result->choice.events.list.size = nae * sizeof(DENM_t *); switch (*fdreq->choice.activeEpisodes.list.array[e]) {
fdres->result->choice.events.list.array = malloc(nae * sizeof(DENM_t *)); case EpisodeType_denm:
for (int i = 0, j = 0; j < nae; ++i) { na += nae;
break;
case EpisodeType_ivim:
na += nas;
break;
}
}
fdres->result->choice.episodes.list.count = na;
fdres->result->choice.episodes.list.size = na * sizeof(void *);
fdres->result->choice.episodes.list.array = malloc(na * sizeof(void *));
for (int e = 0, j = 0; e < fdreq->choice.activeEpisodes.list.count; ++e) {
switch (*fdreq->choice.activeEpisodes.list.array[e]) {
case EpisodeType_denm:
for (int i = 0, n = 0; n < nae; ++i) {
if (facilities->den->events[i]->enabled && facilities->den->events[i]->state == EVENT_ACTIVE) { if (facilities->den->events[i]->enabled && facilities->den->events[i]->state == EVENT_ACTIVE) {
fdres->result->choice.events.list.array[j] = calloc(1, sizeof(ItsMessage_t)); fdres->result->choice.episodes.list.array[j] = calloc(1, sizeof(ItsMessage_t));
fdres->result->choice.events.list.array[j]->itsMessageType = ItsMessageType_denm; fdres->result->choice.episodes.list.array[j]->itsMessageType = ItsMessageType_denm;
fdres->result->choice.events.list.array[j]->data.buf = malloc(2048); fdres->result->choice.episodes.list.array[j]->data.buf = malloc(2048);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_DENM, NULL, facilities->den->events[i]->denm, fdres->result->choice.events.list.array[j]->data.buf, 2048); asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_DENM, NULL, facilities->den->events[i]->denm, fdres->result->choice.episodes.list.array[j]->data.buf, 2048);
if (enc.encoded == -1) { /* encoding shouldn't fail as all saved DENMs are structurally valid */ if (enc.encoded == -1) { /* encoding shouldn't fail as all saved DENMs are structurally valid */
syslog_err("[facilities] failed encoding DENM for FDResult (%s)", enc.failed_type->name); syslog_err("[facilities] failed encoding DENM for FDResult (%s)", enc.failed_type->name);
fdres->result->choice.events.list.array[j]->data.size = 0; fdres->result->choice.episodes.list.array[j]->data.size = 0;
continue; continue;
} }
fdres->result->choice.events.list.array[j]->data.size = (enc.encoded + 7) / 8; fdres->result->choice.episodes.list.array[j]->data.size = (enc.encoded + 7) / 8;
++j; ++j;
++n;
}
}
break;
case EpisodeType_ivim:
for (int i = 0, n = 0; n < nas; ++i) {
if (facilities->infrastructure->services[i]->enabled && facilities->infrastructure->services[i]->state == SERVICE_ACTIVE) {
fdres->result->choice.episodes.list.array[j] = calloc(1, sizeof(ItsMessage_t));
fdres->result->choice.episodes.list.array[j]->itsMessageType = ItsMessageType_ivim;
fdres->result->choice.episodes.list.array[j]->data.buf = malloc(2048);
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_IVIM, NULL, facilities->infrastructure->services[i]->ivim, fdres->result->choice.episodes.list.array[j]->data.buf, 2048);
if (enc.encoded == -1) { /* encoding shouldn't fail as all saved DENMs are structurally valid */
syslog_err("[facilities] failed encoding IVIM for FDResult (%s)", enc.failed_type->name);
fdres->result->choice.episodes.list.array[j]->data.size = 0;
continue;
}
fdres->result->choice.episodes.list.array[j]->data.size = (enc.encoded + 7) / 8;
++j;
++n;
} }
} }
break; break;
default: default:
syslog_err("[facilities] unrecognized FDR event type (%ld)", fdreq->choice.activeEvents); syslog_err("[facilities] unrecognized FDR event type (%ld)", *fdreq->choice.activeEpisodes.list.array[0]);
pthread_mutex_unlock(&facilities->den->lock); pthread_mutex_unlock(&facilities->den->lock);
pthread_mutex_unlock(&facilities->infrastructure->lock);
facilities_request_result_rejected(responder); facilities_request_result_rejected(responder);
rv = 1; rv = 1;
goto cleanup; goto cleanup;
} }
}
pthread_mutex_unlock(&facilities->den->lock);
pthread_mutex_unlock(&facilities->infrastructure->lock);
fdres_oer = malloc(32768); fdres_oer = malloc(32768);
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesDataResult, NULL, fdres, fdres_oer, 32768); asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesDataResult, NULL, fdres, fdres_oer, 32768);
if (enc.encoded == -1) { if (enc.encoded == -1) {
syslog_err("[facilities] failed encoding FDResult (%s)", enc.failed_type->name); syslog_err("[facilities] failed encoding FDResult (%s)", enc.failed_type->name);
pthread_mutex_unlock(&facilities->den->lock);
facilities_request_result_rejected(responder); facilities_request_result_rejected(responder);
rv = 1; rv = 1;
@ -380,8 +420,6 @@ int facilities_request_active_events(facilities_t* facilities, void* responder,
zmq_send(responder, fdres_oer, enc.encoded, 0); zmq_send(responder, fdres_oer, enc.encoded, 0);
pthread_mutex_unlock(&facilities->den->lock);
cleanup: cleanup:
free(fdres_oer); free(fdres_oer);
ASN_STRUCT_FREE(asn_DEF_FacilitiesDataResult, fdres); ASN_STRUCT_FREE(asn_DEF_FacilitiesDataResult, fdres);
@ -435,3 +473,45 @@ cleanup:
return rv; return rv;
} }
int facilities_request_loaded_protected_zones(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq) {
int rv = 0;
FacilitiesDataResult_t* fdres = calloc(1, sizeof(FacilitiesDataResult_t));
fdres->code = FacilitiesResultCode_accepted;
fdres->result = calloc(1, sizeof(FacilitiesResult_t));
fdres->result->present = FacilitiesResult_PR_protectedCommunicationZones;
pthread_mutex_lock(&facilities->lightship->lock);
fdres->result->choice.protectedCommunicationZones.list.count = facilities->lightship->protected_zones.pz_len;
fdres->result->choice.protectedCommunicationZones.list.size = facilities->lightship->protected_zones.pz_len * sizeof(void*);
fdres->result->choice.protectedCommunicationZones.list.array = malloc(facilities->lightship->protected_zones.pz_len * sizeof(void*));
uint8_t buf[256];
for (int z = 0; z < facilities->lightship->protected_zones.pz_len; ++z) {
fdres->result->choice.protectedCommunicationZones.list.array[z] = calloc(1, sizeof(ProtectedCommunicationZone_t));
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_ProtectedCommunicationZone, NULL, facilities->lightship->protected_zones.pz[z], buf, 256);
uper_decode_complete(NULL, &asn_DEF_ProtectedCommunicationZone, (void**) &fdres->result->choice.protectedCommunicationZones.list.array[z], buf, (enc.encoded+7) / 8);
}
pthread_mutex_unlock(&facilities->lightship->lock);
uint8_t fdres_oer[1024];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_FacilitiesDataResult, NULL, fdres, fdres_oer, 1024);
if (enc.encoded == -1) {
syslog_err("[facilities] failed encoding FDResult (%s)", enc.failed_type->name);
facilities_request_result_rejected(responder);
rv = 1;
goto cleanup;
}
zmq_send(responder, fdres_oer, enc.encoded, 0);
cleanup:
ASN_STRUCT_FREE(asn_DEF_FacilitiesDataResult, fdres);
return rv;
}

View File

@ -8,7 +8,8 @@ int facilities_request_result_accepted(void* responder);
int facilities_request_result_rejected(void* responder); 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 facilities_request_active_events(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq); int facilities_request_active_episodes(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq);
int facilities_request_attribute_types(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq); int facilities_request_attribute_types(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq);
int facilities_request_loaded_protected_zones(facilities_t* facilities, void* responder, FacilitiesDataRequest_t* fdreq);
#endif #endif