diff options
author | rodri <rgl@antares-labs.eu> | 2023-02-11 00:26:30 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2023-02-11 00:26:30 +0000 |
commit | 775309861b51dd1f340d82074b7e9234f3e0675e (patch) | |
tree | c0a20e4edcb09814e3fc659e97aaeb363b5b51ef /net.c | |
parent | c1cdf0f980b92193953f05bf444b7c78f369a122 (diff) | |
download | musw-775309861b51dd1f340d82074b7e9234f3e0675e.tar.gz musw-775309861b51dd1f340d82074b7e9234f3e0675e.tar.bz2 musw-775309861b51dd1f340d82074b7e9234f3e0675e.zip |
implemented connection establishment with per client DHX.
Diffstat (limited to 'net.c')
-rw-r--r-- | net.c | 94 |
1 files changed, 94 insertions, 0 deletions
@@ -0,0 +1,94 @@ +#include <u.h> +#include <libc.h> +#include <ip.h> +#include <thread.h> +#include <draw.h> +#include <geometry.h> +#include "dat.h" +#include "fns.h" + +/* DHX */ + +void +dhgenpg(ulong *p, ulong *g) +{ + static ulong P = 97; + static ulong G = 71; + + *p = P; + *g = G; +} + +/* + * x = g^k mod p + */ +ulong +dhgenkey(ulong g, ulong k, ulong p) +{ + ulong r, y; + + y = 1; + + while(k > 0){ + r = k % 2; + if(r == 1) + y = y*g % p; + g = g*g % p; + k /= 2; + } + return y; +} + +/* NetConn */ + +NetConn * +newnetconn(NCState s, Udphdr *u) +{ + NetConn *nc; + + nc = emalloc(sizeof(NetConn)); + memset(nc, 0, sizeof(NetConn)); + if(u != nil) + memmove(&nc->udp, u, Udphdrsize); + nc->state = s; + + return nc; +} + +void +delnetconn(NetConn *nc) +{ + free(nc); +} + +/* Frame */ + +Frame * +newframe(Frame *pf, u8int type, u32int seq, u32int ack, u16int len, uchar *data) +{ + Frame *f; + + f = emalloc(sizeof(Frame)+len); + f->id = ProtocolID; + f->type = type; + if(pf != nil){ + memmove(&f->udp, &pf->udp, Udphdrsize); + f->seq = pf->seq+1; + f->ack = pf->seq; + }else{ + memset(&f->udp, 0, Udphdrsize); + f->seq = seq; + f->ack = ack; + } + f->len = len; + if(data != nil) + memmove(f->data, data, f->len); + + return f; +} + +void +delframe(Frame *f) +{ + free(f); +} |