aboutsummaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'net.c')
-rw-r--r--net.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/net.c b/net.c
new file mode 100644
index 0000000..d645eb4
--- /dev/null
+++ b/net.c
@@ -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);
+}