/** * \brief Get the age of the bundle * \param bundlemem Bundle MMEM Pointer * \return Age in milliseconds */ uint32_t bundle_ageing_get_age(struct mmem * bundlemem) { struct bundle_t *bundle; udtn_timeval_t tv; if( bundlemem == NULL ) { return 0; } bundle = (struct bundle_t *) MMEM_PTR(bundlemem); if( bundle == NULL ) { return 0; } // Bundle has a timestamp and we have time sync if( bundle->tstamp != 0 && udtn_getclockstate() >= UDTN_CLOCK_STATE_GOOD ) { // Get current time udtn_gettimeofday(&tv); // Convert into DTN time tv.tv_sec -= UDTN_CLOCK_DTN_EPOCH_OFFSET; // If our clock is ahead of the bundle timestamp the age seems to be 0 if( tv.tv_sec < bundle->tstamp ) { return 0; } // Calculate age based on timestamp and current time return (tv.tv_sec - bundle->tstamp) * 1000 + tv.tv_usec / 1000; } // We have to rely on the age block information return bundle->aeb_value_ms + (xTaskGetTickCount() - bundle->rec_time) / portTICK_PERIOD_MS; }
udtn_time_t udtn_time(udtn_time_t *t) { udtn_timeval_t ret; udtn_gettimeofday(&ret); if (t != NULL) { (*t) = ret.tv_sec; return 0; } return ret.tv_sec; }
int dtntp_discovery_add_service(uint8_t * ipnd_buffer, int length, int * offset) { char string_buffer[60]; int len; udtn_timeval_t tv; float rating; // get local clock rating rating = dtntp_get_rating(); // do not send sync beacons if clock rating is zero if (rating == 0.0) return 0; // get local time udtn_gettimeofday(&tv); // do not send sync beacons if the clock timestamp is wrong if (tv.tv_sec < UDTN_CLOCK_DTN_EPOCH_OFFSET) return 0; // Convert timestamp into DTN time tv.tv_sec -= UDTN_CLOCK_DTN_EPOCH_OFFSET; len = sprintf(string_buffer, DTNTP_SERVICE_TAG); (*offset) += sdnv_encode(len, ipnd_buffer + (*offset), length - (*offset)); memcpy(ipnd_buffer + (*offset), string_buffer, len); (*offset) += len; if (rating < 1.0f) { len = sprintf(string_buffer, "version=2;quality=0.%lu;timestamp=%li;", \ (unsigned long)(rating * 1000000), tv.tv_sec); } else { len = sprintf(string_buffer, "version=2;quality=1.0;timestamp=%li;", \ tv.tv_sec); } (*offset) += sdnv_encode(len, ipnd_buffer + (*offset), length - (*offset)); memcpy(ipnd_buffer + (*offset), string_buffer, len); (*offset) += len; return 1; }