Esempio n. 1
0
/**
 * \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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}