aboutsummaryrefslogtreecommitdiff
path: root/pack.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2022-06-11 22:37:59 +0000
committerrodri <rgl@antares-labs.eu>2022-06-11 22:37:59 +0000
commitc69fa66f609925a98acf8dc7f645b9b50ce3a8ba (patch)
tree0246842728a85938e2ff074a160f11cabba3c049 /pack.c
parent0a15926abc589c372acf404765862bb22febd64d (diff)
downloadmusw-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.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/pack.c b/pack.c
index be9b170..1096f6b 100644
--- a/pack.c
+++ b/pack.c
@@ -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: