diff options
author | rodri <rgl@antares-labs.eu> | 2022-06-11 22:37:59 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2022-06-11 22:37:59 +0000 |
commit | c69fa66f609925a98acf8dc7f645b9b50ce3a8ba (patch) | |
tree | 0246842728a85938e2ff074a160f11cabba3c049 /pack.c | |
parent | 0a15926abc589c372acf404765862bb22febd64d (diff) | |
download | musw-c69fa66f609925a98acf8dc7f645b9b50ce3a8ba.tar.gz musw-c69fa66f609925a98acf8dc7f645b9b50ce3a8ba.tar.bz2 musw-c69fa66f609925a98acf8dc7f645b9b50ce3a8ba.zip |
implemented a custom PDU/frame structure on top of UDP for game networking.
Diffstat (limited to 'pack.c')
-rw-r--r-- | pack.c | 49 |
1 files changed, 49 insertions, 0 deletions
@@ -1,10 +1,23 @@ #include <u.h> #include <libc.h> +#include <ip.h> #include <draw.h> #include "libgeometry/geometry.h" #include "dat.h" #include "fns.h" +static ushort +get2(uchar *p) +{ + return p[0]<<8 | p[1]; +} + +static void +put2(uchar *p, ushort u) +{ + p[0] = u>>8, p[1] = u; +} + static ulong get4(uchar *p) { @@ -24,6 +37,7 @@ vpack(uchar *p, int n, char *fmt, va_list a) ulong k; FPdbleword d; Point2 P; + Frame *F; for(;;){ switch(*fmt++){ @@ -57,6 +71,19 @@ vpack(uchar *p, int n, char *fmt, va_list a) put4(p, k), p += 4; break; + case 'F': + F = va_arg(a, Frame*); + + if(p+Framesize+F->len > e) + goto err; + + put4(p, F->seq), p += 4; + put4(p, F->ack), p += 4; + put4(p, F->id), p += 4; + put2(p, F->len), p += 2; + memmove(p, F->data, F->len), p += F->len; + + break; } } err: @@ -70,6 +97,7 @@ vunpack(uchar *p, int n, char *fmt, va_list a) ulong k; FPdbleword d; Point2 P; + Frame *F; for(;;){ switch(*fmt++){ @@ -100,6 +128,27 @@ vunpack(uchar *p, int n, char *fmt, va_list a) *va_arg(a, ulong*) = k; break; + case 'F': + if(p+Udphdrsize+Framesize > e) + goto err; + + F = va_arg(a, Frame*); + + F->udp = (Udphdr*)p, p += Udphdrsize; + F->seq = get4(p), p += 4; + F->ack = get4(p), p += 4; + F->id = get4(p), p += 4; + F->len = get2(p), p += 2; + + /* XXX: I'm not happy with this. */ + if(p+F->len > e) + goto err; + + F = erealloc(F, sizeof(Frame)+F->len); + memmove(F->data, p, F->len); + p += F->len; + + break; } } err: |