From 8a9aed7fcd2ee9fa494612e8dc864e291d6b9a84 Mon Sep 17 00:00:00 2001 From: emanuel Date: Wed, 25 Nov 2020 14:29:49 +0000 Subject: [PATCH] Fix non forwarded IVIMs, ad default service duration --- src/config.c | 4 +++ src/facilities.c | 44 ++++++++++++++++++++-------- src/infrastructure.c | 70 +++++++++++++++++++++++++++++++++++--------- src/infrastructure.h | 1 + 4 files changed, 92 insertions(+), 27 deletions(-) diff --git a/src/config.c b/src/config.c index 3956023..c5fd6b6 100644 --- a/src/config.c +++ b/src/config.c @@ -162,6 +162,10 @@ int itss_config(void* facilities_s, char* config_file) { rv += extract_val_int(&replay_interval, ivim, "replay-interval"); facilities->infrastructure->replay_interval = replay_interval; + int64_t default_service_duration; + rv += extract_val_int(&default_service_duration, ivim, "default-service-duration"); + facilities->infrastructure->default_service_duration = default_service_duration * 60000; + // Replay int replay_active = 1; rv += extract_val_bool(&replay_active, replay, "activate"); diff --git a/src/facilities.c b/src/facilities.c index d3a0c20..ab6245d 100644 --- a/src/facilities.c +++ b/src/facilities.c @@ -224,13 +224,15 @@ static int facilities_request(facilities_t *facilities, void* responder, uint8_t is_update = true; } - if ( ((DENM_t*)its_msg)->denm.management.transmissionInterval ) { - transmission_interval = *( (uint32_t*) ((DENM_t*)its_msg)->denm.management.transmissionInterval ); - - if ( ((DENM_t*)its_msg)->denm.management.validityDuration ) { - transmission_duration = *( (uint32_t*) ((DENM_t*)its_msg)->denm.management.validityDuration ) * 1000; - } else { - transmission_duration = facilities->den->default_event_duration * 1000; + if (fwd) { + if ( ((DENM_t*)its_msg)->denm.management.transmissionInterval ) { + transmission_interval = *( (uint32_t*) ((DENM_t*)its_msg)->denm.management.transmissionInterval ); + + if ( ((DENM_t*)its_msg)->denm.management.validityDuration ) { + transmission_duration = *( (uint32_t*) ((DENM_t*)its_msg)->denm.management.validityDuration ) * 1000; + } else { + transmission_duration = facilities->den->default_event_duration * 1000; + } } } } else if (fdreq->choice.singleMessage.itssMessageType == ItssMessageType_ivim) { @@ -253,13 +255,29 @@ static int facilities_request(facilities_t *facilities, void* responder, uint8_t is_update = true; } - uint64_t valid_to, valid_from; - asn_INTEGER2ulong((INTEGER_t*) ((IVIM_t*) its_msg)->ivi.mandatory.validTo, &valid_to); - asn_INTEGER2ulong((INTEGER_t*) ((IVIM_t*) its_msg)->ivi.mandatory.validFrom, &valid_from); + if (fwd) { + uint64_t valid_to, valid_from; - transmission_start = valid_from; - transmission_interval = facilities->infrastructure->replay_interval; - transmission_duration = valid_to - valid_from; + if (!((IVIM_t*) its_msg)->ivi.mandatory.validFrom) { + struct timespec systemtime; + clock_gettime(CLOCK_REALTIME, &systemtime); + long now = (long) (systemtime.tv_sec * 1000 + systemtime.tv_nsec / 1E6); + now = now - 1072915200000; // Convert EPOCH to 2004/01/01 00:00:000 + valid_from = now; + } else { + asn_INTEGER2ulong((INTEGER_t*) ((IVIM_t*) its_msg)->ivi.mandatory.validFrom, &valid_from); + } + + if (!((IVIM_t*) its_msg)->ivi.mandatory.validTo) { + valid_to = valid_from + facilities->infrastructure->default_service_duration; + } else { + asn_INTEGER2ulong((INTEGER_t*) ((IVIM_t*) its_msg)->ivi.mandatory.validTo, &valid_to); + } + + transmission_start = valid_from; + transmission_interval = facilities->infrastructure->replay_interval; + transmission_duration = valid_to - valid_from; + } } if (!facilities->replay) { diff --git a/src/infrastructure.c b/src/infrastructure.c index 1af3f0d..544f267 100644 --- a/src/infrastructure.c +++ b/src/infrastructure.c @@ -17,6 +17,11 @@ static enum SERVICE_EVAL_RESULT service_check(infrastructure_t* infrastructure, enum SERVICE_TYPE type, void* its_msg) { int rv = 0; + struct timespec systemtime; + clock_gettime(CLOCK_REALTIME, &systemtime); + long now = (long) (systemtime.tv_sec * 1000 + systemtime.tv_nsec / 1E6); + now = now - 1072915200000; // Convert EPOCH to 2004/01/01 00:00:000 + switch (type) { case SERVICE_IVI: break; @@ -27,16 +32,25 @@ static enum SERVICE_EVAL_RESULT service_check(infrastructure_t* infrastructure, IVIM_t* ivim = (IVIM_t*) its_msg; uint64_t timestamp, valid_to, valid_from; - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.timeStamp, ×tamp); - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validTo, &valid_to); - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validFrom, &valid_from); + if (!ivim->ivi.mandatory.timeStamp) { + timestamp = now; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.timeStamp, ×tamp); + } - struct timespec systemtime; - clock_gettime(CLOCK_REALTIME, &systemtime); - long now = (long) (systemtime.tv_sec * 1000 + systemtime.tv_nsec / 1E6); - now = now - 1072915200000; // Convert EPOCH to 2004/01/01 00:00:000 + if (!ivim->ivi.mandatory.validFrom) { + valid_from = now; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validFrom, &valid_from); + } - if (now > valid_to) { + if (!ivim->ivi.mandatory.validTo) { + valid_to = valid_from + infrastructure->default_service_duration; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validTo, &valid_to); + } + + if (now >= valid_to) { return SERVICE_PASSED; } @@ -116,9 +130,23 @@ static int service_add(infrastructure_t* infrastructure, enum SERVICE_TYPE type, now = now - 1072915200000; // Convert EPOCH to 2004/01/01 00:00:000 uint64_t timestamp, valid_to, valid_from; - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.timeStamp, ×tamp); - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validTo, &valid_to); - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validFrom, &valid_from); + if (!ivim->ivi.mandatory.timeStamp) { + timestamp = now; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.timeStamp, ×tamp); + } + + if (!ivim->ivi.mandatory.validFrom) { + valid_from = now; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validFrom, &valid_from); + } + + if (!ivim->ivi.mandatory.validTo) { + valid_to = valid_from + infrastructure->default_service_duration; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validTo, &valid_to); + } pthread_mutex_lock(&infrastructure->lock); @@ -191,9 +219,23 @@ static int service_update(infrastructure_t* infrastructure, enum SERVICE_TYPE ty now = now - 1072915200000; // Convert EPOCH to 2004/01/01 00:00:000 uint64_t timestamp, valid_to, valid_from; - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.timeStamp, ×tamp); - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validTo, &valid_to); - asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validFrom, &valid_from); + if (!ivim->ivi.mandatory.timeStamp) { + timestamp = now; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.timeStamp, ×tamp); + } + + if (!ivim->ivi.mandatory.validFrom) { + valid_from = now; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validFrom, &valid_from); + } + + if (!ivim->ivi.mandatory.validTo) { + valid_to = valid_from + infrastructure->default_service_duration; + } else { + asn_INTEGER2ulong((INTEGER_t*) ivim->ivi.mandatory.validTo, &valid_to); + } uint8_t state; switch (ivim->ivi.mandatory.iviStatus) { diff --git a/src/infrastructure.h b/src/infrastructure.h index 303821d..b726f8d 100644 --- a/src/infrastructure.h +++ b/src/infrastructure.h @@ -45,6 +45,7 @@ typedef struct infrastructure { uint16_t n_max_services; uint32_t replay_interval; + uint64_t default_service_duration; pthread_mutex_t lock; } infrastructure_t;