aboutsummaryrefslogtreecommitdiff
path: root/pack.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2023-02-09 21:01:00 +0000
committerrodri <rgl@antares-labs.eu>2023-02-09 21:01:00 +0000
commitc1cdf0f980b92193953f05bf444b7c78f369a122 (patch)
tree8a79930693c546dde79954f467ba1cc4119c9e6b /pack.c
parente769c8684c1200f922ff41c6ef5d0cdd4fe0e67f (diff)
downloadmusw-c1cdf0f980b92193953f05bf444b7c78f369a122.tar.gz
musw-c1cdf0f980b92193953f05bf444b7c78f369a122.tar.bz2
musw-c1cdf0f980b92193953f05bf444b7c78f369a122.zip
implemented a packet processing pipeline. got rid of Lobby. began development of a network protocol.
Diffstat (limited to 'pack.c')
-rw-r--r--pack.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/pack.c b/pack.c
index 3b61a66..08405ec 100644
--- a/pack.c
+++ b/pack.c
@@ -1,5 +1,6 @@
#include <u.h>
#include <libc.h>
+#include <pool.h>
#include <ip.h>
#include <draw.h>
#include <geometry.h>
@@ -37,7 +38,7 @@ vpack(uchar *p, int n, char *fmt, va_list a)
ulong k;
FPdbleword d;
Point2 P;
- Frame *F;
+ Frame *F = nil;
for(;;){
switch(*fmt++){
@@ -74,13 +75,25 @@ vpack(uchar *p, int n, char *fmt, va_list a)
case 'F':
F = va_arg(a, Frame*);
+ if(p+Udphdrsize > e)
+ goto err;
+
+ memmove(p, &F->udp, Udphdrsize), p += Udphdrsize;
+ /* fallthrough */
+ case 'f':
+ if(F == nil)
+ F = va_arg(a, Frame*);
+
if(p+Framehdrsize+F->len > e)
goto err;
+ *p++ = F->type;
put4(p, F->seq), p += 4;
put4(p, F->ack), p += 4;
- put4(p, F->id), p += 4;
put2(p, F->len), p += 2;
+
+ if(p+F->len > e)
+ goto err;
memmove(p, F->data, F->len), p += F->len;
break;
@@ -97,7 +110,7 @@ vunpack(uchar *p, int n, char *fmt, va_list a)
ulong k;
FPdbleword d;
Point2 P;
- Frame *F;
+ Frame *F = nil;
for(;;){
switch(*fmt++){
@@ -129,24 +142,29 @@ vunpack(uchar *p, int n, char *fmt, va_list a)
break;
case 'F':
- if(p+Udphdrsize+Framehdrsize > e)
+ if(p+Udphdrsize > e)
goto err;
F = va_arg(a, Frame*);
- F->udp = (Udphdr*)p, p += Udphdrsize;
+ memmove(&F->udp, p, Udphdrsize), p += Udphdrsize;
+ /* fallthrough */
+ case 'f':
+ if(p+Framehdrsize > e)
+ goto err;
+
+ if(F == nil)
+ F = va_arg(a, Frame*);
+
+ F->type = *p++;
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;
+ memmove(F->data, p, F->len), p += F->len;
break;
}