changed timer source (#522)

* changed timer source

* changed timer source

* changed timer source

* changed timer source

* changed timer source

* changed timer source
This commit is contained in:
Logan oos Even 2020-12-08 20:31:00 +05:45 committed by GitHub
parent c45da8714b
commit 0298efa36e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 12 deletions

View File

@ -48,8 +48,8 @@ N2N_LIB=libn2n.a
N2N_OBJS=$(patsubst src/%.c, src/%.o, $(wildcard src/*.c))
N2N_DEPS=$(wildcard include/*.h) $(wildcard src/*.c) Makefile $(N2N_LIB)
LIBS_EDGE+=$(LIBS_EDGE_OPT)
LIBS_SN=
LIBS_EDGE+=-lrt $(LIBS_EDGE_OPT)
LIBS_SN=-lrt
#For OpenSolaris (Solaris too?)
ifeq ($(shell uname), SunOS)

View File

@ -54,7 +54,6 @@
#define PACKAGE_BUILDDATE (__DATE__ " " __TIME__)
#include <time.h>
#include <ctype.h>
#include <stdlib.h>
@ -121,6 +120,7 @@
#define closesocket(a) close(a)
#endif /* #ifndef WIN32 */
#include <time.h> /* should be included after eventually including unistd.h for _POSIX_TIMERS macro gets correctly defined */
#include "minilzo.h"
#include <signal.h>
#include <string.h>

View File

@ -546,19 +546,31 @@ int gettimeofday(struct timeval *tp, void *tzp) {
// returns a time stamp for use with replay protection
uint64_t time_stamp (void) {
struct timeval tod;
uint64_t micro_seconds;
#if defined (_POSIX_TIMERS)
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
#else
struct timeval t;
gettimeofday (&t, NULL);
#endif
gettimeofday (&tod, NULL);
/* We will (roughly) calculate the microseconds since 1970 leftbound into the return value.
The leading 32 bits are used for tv_sec. The following 20 bits (sufficent as microseconds
fraction never exceeds 1,000,000,) encode the value tv_usec. The remaining lowest 12 bits
are kept random for use in IV */
micro_seconds = n2n_rand();
micro_seconds = ( (((uint64_t)(tod.tv_sec) << 32) + (tod.tv_usec << 12))
| (micro_seconds >> 52) );
// more exact but more costly due to the multiplication:
// micro_seconds = (tod.tv_sec * 1000000 + tod.tv_usec) << 12) | ...
fraction never exceeds 1,000,000,) encode the value tv_nsec/1024 ( ~ usec) or tv_usec
respectively. The remaining lowest 12 bits are kept random for use in IV */
micro_seconds = (uint64_t)(t.tv_sec) << 32;
#if defined (_POSIX_TIMERS)
micro_seconds += (t.tv_nsec >> 10) << 12;
#else
micro_seconds += t.tv_usec << 12;
#endif
micro_seconds |= (uint64_t)n2n_rand() >> 52;
// to do the following would be more exact but also
// more costly due to the multiplication and divison:
// micro_seconds = (t.tv_sec * 1000000 + t.tv_nsec / 1000) << 12) | ... or
// micro_seconds = (t.tv_sec * 1000000 + t.tv_usec) << 12) | ...
return (micro_seconds);
}