diff options
author | rodri <rgl@antares-labs.eu> | 2020-12-18 16:28:05 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2020-12-18 16:28:05 +0000 |
commit | 6b56dcfb94347af43b0213863b79bcee3530b742 (patch) | |
tree | 6f73352fd7c20522e84ee106e1630d2873f22720 /main.c | |
parent | 47b8a9471fe006cef74d1ba8f8a2839fd8164041 (diff) | |
download | echod-6b56dcfb94347af43b0213863b79bcee3530b742.tar.gz echod-6b56dcfb94347af43b0213863b79bcee3530b742.tar.bz2 echod-6b56dcfb94347af43b0213863b79bcee3530b742.zip |
added echo+ support.
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 29 |
1 files changed, 28 insertions, 1 deletions
@@ -69,9 +69,14 @@ void* udpechosrv(void *a) { sockaddr_in csa; - char buf[4096], caddr[128], *cs; + uchar buf[4096]; + char caddr[128], *cs; int n, port; uint csalen; + UDPEchoPlus ephdr; + + struct timespec ts; + uvlong us; memset(&csa, 0, sizeof(sockaddr_in)); csalen = sizeof(sockaddr_in); @@ -84,6 +89,10 @@ udpechosrv(void *a) } pthread_mutex_unlock(&attendlock); + clock_gettime(CLOCK_REALTIME, &ts); + us = ts.tv_sec*1e6; + us += ts.tv_nsec/1e3; + cs = inet_ntoa(csa.sin_addr); port = ntohs(csa.sin_port); snprint(caddr, sizeof caddr, "udp!%s!%d", cs, port); @@ -91,6 +100,24 @@ udpechosrv(void *a) if(debug) fprint(2, "thr#%lu received %d byte datagram from %s\n", pthread_self(), n, caddr); + /* check for echo+ data */ + if(n >= 24){ + if(getechoplus(&ephdr, buf) < 0) + goto EchoBack; + + ephdr.ressn = ephdr.gensn; + ephdr.rxtime = us; + ephdr.ntxfails = 0; /* being over-optimistic */ + + clock_gettime(CLOCK_REALTIME, &ts); + us = ts.tv_sec*1e6; + us += ts.tv_nsec/1e3; + + ephdr.txtime = us; + + putechoplus(&ephdr, buf); + } +EchoBack: if(sendto(lfd, buf, n, 0, (sockaddr*)&csa, csalen) < 0) continue; |