Compare commits

...

6 Commits

Author SHA1 Message Date
Adrien Gallouët
cfd7af9241 Add .build.sh 2016-07-11 11:13:29 +00:00
Adrien Gallouët
c81592fcc5 Don't fd_set_nonblock(-1) 2016-06-23 12:15:01 +00:00
Adrien Gallouët
b4a311cdc8 Check for clock_gettime() 2016-06-15 14:12:21 +00:00
Adrien Gallouët
08617d0017 Fix macosx build 2016-06-15 14:01:20 +00:00
Adrien Gallouët
38cd3b0371 Try to do a more accurate bench 2016-06-15 09:20:18 +00:00
Adrien Gallouët
5944e61dfe Fix bench output 2016-06-15 09:10:57 +00:00
3 changed files with 79 additions and 26 deletions

15
.build.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/sh
export CC="gcc -static"
git clone https://github.com/jedisct1/libsodium --depth=1 --branch stable
cd libsodium || exit 1
./autogen.sh && ./configure --enable-minimal --disable-shared --prefix=/usr && make install
cd ..
./autogen.sh && ./configure && make
[ -x glorytun ] || exit 1
mkdir -p deploy
strip -s glorytun
mv glorytun deploy/glorytun-$(cat VERSION)-$(uname -m).bin

View File

@@ -16,6 +16,8 @@ AC_PROG_CC_C99
AC_USE_SYSTEM_EXTENSIONS AC_USE_SYSTEM_EXTENSIONS
AC_SEARCH_LIBS([getaddrinfo], [resolv nsl]) AC_SEARCH_LIBS([getaddrinfo], [resolv nsl])
AC_SEARCH_LIBS([socket], [socket]) AC_SEARCH_LIBS([socket], [socket])
AC_CHECK_LIB([rt], [clock_gettime])
AC_CHECK_FUNCS([clock_gettime])
PKG_CHECK_MODULES([libsodium], [libsodium >= 1.0.4]) PKG_CHECK_MODULES([libsodium], [libsodium >= 1.0.4])
AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([Makefile])
AC_OUTPUT AC_OUTPUT

View File

@@ -14,6 +14,7 @@
#include <signal.h> #include <signal.h>
#include <poll.h> #include <poll.h>
#include <fcntl.h> #include <fcntl.h>
#include <time.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/time.h> #include <sys/time.h>
@@ -36,6 +37,10 @@
#include <sodium.h> #include <sodium.h>
#ifdef __APPLE__
#include <mach/mach_time.h>
#endif
#ifndef O_CLOEXEC #ifndef O_CLOEXEC
#define O_CLOEXEC 0 #define O_CLOEXEC 0
#endif #endif
@@ -277,8 +282,11 @@ static int sk_accept (int fd)
int ret = accept(fd, (struct sockaddr *)&addr, &addr_size); int ret = accept(fd, (struct sockaddr *)&addr, &addr_size);
if (ret==-1 && errno!=EINTR) if (ret==-1) {
perror("accept"); if (errno!=EINTR)
perror("accept");
return -1;
}
fd_set_nonblock(ret); fd_set_nonblock(ret);
@@ -986,50 +994,78 @@ static int gt_track (uint8_t **db, struct ip_common *ic, uint8_t *data, int rev)
return 0; return 0;
} }
static unsigned long long gt_now (void)
{
#if defined __APPLE__
static mach_timebase_info_data_t mtid;
if (!mtid.denom) mach_timebase_info(&mtid);
return (mach_absolute_time()*mtid.numer/mtid.denom)/1000ULL;
#elif defined CLOCK_MONOTONIC
struct timespec tv;
clock_gettime(CLOCK_MONOTONIC, &tv);
return tv.tv_sec*1000000ULL+tv.tv_nsec/1000ULL;
#else
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec*1000000ULL+tv.tv_usec;
#endif
}
static void gt_bench (int chacha) static void gt_bench (int chacha)
{ {
unsigned char npub[crypto_aead_aes256gcm_NPUBBYTES]; unsigned char npub[crypto_aead_aes256gcm_NPUBBYTES];
memset(npub, 0, sizeof(npub)); memset(npub, 0, sizeof(npub));
unsigned char key[crypto_aead_aes256gcm_KEYBYTES]; unsigned char key[crypto_aead_aes256gcm_KEYBYTES];
memset(key, 1, sizeof(key)); memset(key, 1, sizeof(key));
crypto_aead_aes256gcm_state ctx; crypto_aead_aes256gcm_state ctx;
if (!chacha) if (!chacha)
crypto_aead_aes256gcm_beforenm(&ctx, key); crypto_aead_aes256gcm_beforenm(&ctx, key);
int count = 2000000;
size_t size = 8;
gt_print("bench: %s\n", chacha?"chacha20poly1305":"aes256gcm"); gt_print("bench: %s\n", chacha?"chacha20poly1305":"aes256gcm");
_align_(16) unsigned char buf[32*1024+crypto_aead_aes256gcm_ABYTES]; _align_(16) unsigned char buf[32*1024+crypto_aead_aes256gcm_ABYTES];
for (size_t size=8; size<=sizeof(buf); size*=2) { size_t bs = 8;
struct timeval tv1;
gettimeofday(&tv1, NULL);
for (int i=0; !gt.quit && i<count; i++) { while (!gt.quit && bs<=sizeof(buf)) {
if (chacha) { size_t total_size = 0;
crypto_aead_chacha20poly1305_encrypt(buf, NULL, unsigned long long total_dt = 0.0;
buf, size, NULL, 0, NULL, npub, key); double mbps = 0.0;
} else {
crypto_aead_aes256gcm_encrypt_afternm(buf, NULL, while (!gt.quit) {
buf, size, NULL, 0, NULL, npub, unsigned long long now = gt_now();
(const crypto_aead_aes256gcm_state *)&ctx);
size_t size = 0;
while (!gt.quit && size<16*1024*1024) {
if (chacha) {
crypto_aead_chacha20poly1305_encrypt(buf, NULL,
buf, bs, NULL, 0, NULL, npub, key);
} else {
crypto_aead_aes256gcm_encrypt_afternm(buf, NULL,
buf, bs, NULL, 0, NULL, npub,
(const crypto_aead_aes256gcm_state *)&ctx);
}
size += bs;
} }
total_dt += gt_now()-now;
total_size += size;
double last_mbps = mbps;
mbps = total_size*8.0/total_dt;
double diff = mbps-last_mbps;
if (-0.1<diff && diff<0.1)
break;
} }
if (gt.quit) gt_print("%6zu bytes %9.2f Mbps\n", bs, mbps);
break; bs *= 2;
struct timeval tv2;
gettimeofday(&tv2, NULL);
double dt = (tv2.tv_usec+tv2.tv_sec*1e6)-(tv1.tv_usec+tv1.tv_sec*1e6);
gt_print("block size: %-6zu bps: %.2f\n", size, size*count*8.0/dt);
} }
} }