gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r12028 - gnunet/src/vpn


From: gnunet
Subject: [GNUnet-SVN] r12028 - gnunet/src/vpn
Date: Mon, 28 Jun 2010 14:37:44 +0200

Author: toelke
Date: 2010-06-28 14:37:44 +0200 (Mon, 28 Jun 2010)
New Revision: 12028

Modified:
   gnunet/src/vpn/packet.c
   gnunet/src/vpn/packet.h
   gnunet/src/vpn/pretty-print.c
   gnunet/src/vpn/test.c
Log:
vpn: a better way to parse the packets using bitfields

Modified: gnunet/src/vpn/packet.c
===================================================================
--- gnunet/src/vpn/packet.c     2010-06-28 12:37:43 UTC (rev 12027)
+++ gnunet/src/vpn/packet.c     2010-06-28 12:37:44 UTC (rev 12028)
@@ -8,32 +8,17 @@
 
 #include "debug.h"
 #include "packet.h"
+#include "arpa/inet.h"
 
-long payload(struct ip6_hdr* hdr) {{{
-       return (hdr->paylgth[0] << 8) + hdr->paylgth[1];
+short payload(struct ip6_hdr* hdr) {{{
+       return ntohs(hdr->paylgth);
 }}}
 
 void send_pkt(int fd, struct ip6_pkt* pkt) {{{
        int sz = payload(&(pkt->hdr));
        int w = 0;
-       char* buf = (char*)malloc(sz+40);
+       char* buf = (char*)pkt;
 
-       buf[0] = (6 << 4) | (pkt->hdr.tclass >> 4);
-       buf[1] = (pkt->hdr.tclass << 4) | (pkt->hdr.flowlbl[0] >> 4);
-       buf[2] = pkt->hdr.flowlbl[1];
-       buf[3] = pkt->hdr.flowlbl[2];
-       buf[4] = pkt->hdr.paylgth[0];
-       buf[5] = pkt->hdr.paylgth[1];
-       buf[6] = pkt->hdr.nxthdr;
-       buf[7] = pkt->hdr.hoplmt;
-
-       for (w = 0; w < 16; w++) {
-               buf[8+w] = pkt->hdr.sadr[w];
-               buf[24+w] = pkt->hdr.dadr[w];
-       }
-
-       memcpy(buf+40, pkt->data, sz);
-
        w = 0;
        while ( w > 0) {
                int t = write(fd, buf+w, (sz + 40) - w);
@@ -46,48 +31,31 @@
        free(buf);
 }}}
 
-int recv_ipv6pkt(int fd, struct pkt_tun** pkt, unsigned char* data) {{{
-       int size = (data[4] << 8) + data[5] + 40;
-
-       debug(1, 0, "read the size: %d\n", size);
-
-       (*pkt)->data = (unsigned char*)malloc(size);
-
-       memcpy((*pkt)->data, data, size);
-
-       return size;
+int recv_ipv6pkt(int fd, struct pkt_tun** pkt) {{{
 }}}
 
 int recv_pkt(int fd, struct pkt_tun** pkt) {{{
-       struct pkt_tun* _pkt = (struct pkt_tun*)malloc(sizeof(struct pkt_tun));
-       *pkt = _pkt;
+       // TODO: länge lesen?
+       *pkt = (struct pkt_tun*)malloc(1504);
+       struct pkt_tun* _pkt = *pkt;
 
-       unsigned char data[1500];
-       unsigned char buf[4];
+       unsigned char *data = (unsigned char*)_pkt;
 
-       struct iovec vect[2];
-       vect[0].iov_len = sizeof(struct tun_pi);
-       vect[0].iov_base = &buf;
-       vect[1].iov_len = 1500;
-       vect[1].iov_base = data;
-
-       int r = 0;
-
        debug(1, 0, "beginning to read...\n");
 
-       r = readv(fd, vect, 2);
+       int r = read(fd, data, 1504);
+       debug(1, 0, "read %d bytes\n", r);
 
-       _pkt->flags[0] = buf[0];
-       _pkt->flags[1] = buf[1];
-       _pkt->type[0] = buf[2];
-       _pkt->type[1] = buf[3];
+       debug(1, 0, "read the flags: %04x\n", ntohs(_pkt->flags));
+       debug(1, 0, "read the type: %04x\n", ntohs(_pkt->type));
 
-       debug(1, 0, "read the flags: %02x%02x\n", _pkt->flags[0], 
_pkt->flags[1]);
-       debug(1, 0, "read the type: %02x%02x\n", _pkt->type[0], _pkt->type[1]);
-
-       switch((_pkt->type[0] << 8) + _pkt->type[1]) {
+       switch(ntohs(_pkt->type)) {
                case 0x86dd:
-                       return recv_ipv6pkt(fd, pkt, data);
+                       debug(1, 0, "reading an ipv6-packet\n");
+                       struct ip6_pkt * pkt6 = (struct ip6_pkt*) *pkt;
+                       int size = payload(&(pkt6->hdr));
+                       debug(1, 0, "read the size: %d\n", size);
+                       return size;
                        break;
                case 0x0800:
                        debug(1, 0, "unknown pkt-type: IPv4\n");
@@ -102,56 +70,13 @@
 }}}
 
 struct ip6_pkt* parse_ip6(struct pkt_tun* pkt) {{{
-       struct ip6_pkt* pkt6 = (struct ip6_pkt*)malloc(sizeof(struct ip6_pkt));
+       struct ip6_pkt* pkt6 = (struct ip6_pkt*)pkt;
 
-       pkt6->hdr.tclass = pkt->data[0] << 4 | pkt->data[1] >> 4;
-       pkt6->hdr.flowlbl[0] = pkt->data[1]>>4;
-       pkt6->hdr.flowlbl[1] = pkt->data[2];
-       pkt6->hdr.flowlbl[2] = pkt->data[3];
-
-       pkt6->hdr.paylgth[0] = pkt->data[4];
-       pkt6->hdr.paylgth[1] = pkt->data[5];
-
-       pkt6->hdr.nxthdr = pkt->data[6];
-       pkt6->hdr.hoplmt = pkt->data[7];
-
-       for (int w = 0; w < 16; w++) {
-               pkt6->hdr.sadr[w] = pkt->data[8+w];
-               pkt6->hdr.dadr[w] = pkt->data[24+w];
-       }
-
-       pkt6->data = (unsigned char*)malloc(payload(&(pkt6->hdr)));
-       memcpy(pkt6->data, pkt->data+40, payload(&(pkt6->hdr)));
-
        return pkt6;
 }}}
 
 struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt* pkt) {{{
-       struct ip6_tcp* res = (struct ip6_tcp*) malloc(sizeof(struct ip6_tcp));
-       memcpy(&(res->hdr), &(pkt->hdr), sizeof(struct ip6_hdr));
-       
-       res->data.spt = (pkt->data[0] << 8) | pkt->data[1];
-       res->data.dpt = (pkt->data[2] << 8) | pkt->data[3];
+       struct ip6_tcp* res = (struct ip6_tcp*) pkt;
 
-       res->data.seq = (pkt->data[4] << 24) | (pkt->data[5] << 16) | 
(pkt->data[6] << 8) | pkt->data[7];
-       res->data.ack = (pkt->data[8] << 24) | (pkt->data[9] << 16) | 
(pkt->data[10] << 8) | pkt->data[11];
-
-       res->data.off = pkt->data[12] >> 4;
-       res->data.rsv = pkt->data[12] & 0xF;
-
-       res->data.flg = pkt->data[13];
-
-       res->data.wsz = (pkt->data[14] << 8) | pkt->data[15];
-
-       res->data.crc = (pkt->data[16] << 8) | pkt->data[17];
-
-       res->data.urg = (pkt->data[18] << 8) | pkt->data[19];
-
-       res->data.opt = (unsigned char*) malloc((res->data.off - 5)*4);
-       memcpy(res->data.opt, pkt->data+20, (res->data.off - 5)*4);
-
-       res->data.data = (unsigned char*) malloc(payload(&(pkt->hdr)) - 
4*(res->data.off));
-       memcpy(res->data.data, pkt->data+4*(res->data.off), 
payload(&(pkt->hdr)) - 4*(res->data.off));
-
        return res;
 }}}

Modified: gnunet/src/vpn/packet.h
===================================================================
--- gnunet/src/vpn/packet.h     2010-06-28 12:37:43 UTC (rev 12027)
+++ gnunet/src/vpn/packet.h     2010-06-28 12:37:44 UTC (rev 12028)
@@ -2,49 +2,54 @@
 #define _GNTUN_PACKET_H_
 
 struct pkt_tun {
-       unsigned char flags[2];
-       unsigned char type[2];
-
-       unsigned char* data;
+       unsigned flags:16;
+       unsigned type:16;
 };
 
 struct ip6_hdr {
-       unsigned char tclass;
-       unsigned char flowlbl[3];
-       unsigned char paylgth[2];
-       unsigned char nxthdr;
-       unsigned char hoplmt;
+       unsigned version:4;
+       unsigned tclass:8;
+       unsigned flowlbl:20;
+       unsigned paylgth:16;
+       unsigned nxthdr:8;
+       unsigned hoplmt:8;
        unsigned char sadr[16];
        unsigned char dadr[16];
 };
 
+struct tcp_pkt {
+       unsigned spt:16;
+       unsigned dpt:16;
+       unsigned seq:32;
+       unsigned ack:32;
+       unsigned off:4;
+       unsigned rsv:4;
+       unsigned flg:8;
+       unsigned wsz:16;
+       unsigned crc:16;
+       unsigned urg:16;
+       unsigned char data[1];
+};
+
 struct ip6_pkt {
+       struct pkt_tun tun;
        struct ip6_hdr hdr;
-       unsigned char* data;
+       unsigned char data[1];
 };
 
-struct tcp_pkt {
-       unsigned short spt, dpt;
-       unsigned int seq, ack;
-       unsigned char off, rsv, flg;
-       unsigned short wsz;
-       unsigned short crc, urg;
-       unsigned char* opt;
-       unsigned char* data;
-};
-
 struct ip6_tcp {
+       struct pkt_tun tun;
        struct ip6_hdr hdr;
        struct tcp_pkt data;
 };
 
 extern void send_pkt(int fd, struct ip6_pkt* pkt);
-extern int recv_ipv6pkt(int fd, struct pkt_tun** pkt, unsigned char*);
+extern int recv_ipv6pkt(int fd, struct pkt_tun** pkt);
 extern int recv_pkt(int fd, struct pkt_tun** pkt);
 extern struct ip6_pkt* parse_ip6(struct pkt_tun* pkt);
 
-struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
+extern struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
 
-extern long payload(struct ip6_hdr* pkt);
+extern short payload(struct ip6_hdr* pkt);
 
 #endif

Modified: gnunet/src/vpn/pretty-print.c
===================================================================
--- gnunet/src/vpn/pretty-print.c       2010-06-28 12:37:43 UTC (rev 12027)
+++ gnunet/src/vpn/pretty-print.c       2010-06-28 12:37:44 UTC (rev 12028)
@@ -2,6 +2,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
+#include <arpa/inet.h>
 
 #include "packet.h"
 
@@ -112,13 +113,13 @@
        pp_ip6adr(pkt->hdr.sadr, buf+16);
        pp_ip6adr(pkt->hdr.dadr, buf+76);
 
-       int flow = (pkt->hdr.flowlbl[0] << 16) + (pkt->hdr.flowlbl[1] << 8) + 
(pkt->hdr.flowlbl[2]);
+       int flow = (ntohl(pkt->hdr.flowlbl));
        sprintf(tmp, "%03x", flow);
        memcpy(buf+138, tmp, 3);
        sprintf(tmp, "%-8d", flow);
        memcpy(buf+143, tmp, 8);
 
-       int length = (pkt->hdr.paylgth[0] << 8) + (pkt->hdr.paylgth[1]);
+       int length = ntohs(pkt->hdr.paylgth);
        sprintf(tmp, "%02x", length);
        memcpy(buf+198, tmp, 2);
        sprintf(tmp, "%-3d", length);
@@ -133,7 +134,7 @@
        sprintf(tmp, "%-3d", pkt->hdr.hoplmt);
        memcpy(buf+323, tmp, 3);
 
-       int size = payload(pkt);
+       int size = payload(&pkt->hdr);
        for(int i = 0; i < 8; i++) {
                if (16*i > size) break;
                pp_hexdump(pkt->data + (16*i), buf + 420 + (i*70), size - 16*i);
@@ -144,14 +145,14 @@
 }}}
 
 void pkt_printf_ip6tcp(struct ip6_tcp* pkt) {{{
-       printf("spt: %u\n", pkt->data.spt);
-       printf("dpt: %u\n", pkt->data.dpt);
-       printf("seq: %u\n", pkt->data.seq);
-       printf("ack: %u\n", pkt->data.ack);
-       printf("off: %u\n", pkt->data.off);
-       printf("wsz: %u\n", pkt->data.wsz);
-       printf("crc: %u\n", pkt->data.crc);
-       printf("urg: %u\n", pkt->data.urg);
+       printf("spt: %u\n", ntohs(pkt->data.spt));
+       printf("dpt: %u\n", ntohs(pkt->data.dpt));
+       printf("seq: %u\n", ntohs(pkt->data.seq));
+       printf("ack: %u\n", ntohs(pkt->data.ack));
+       printf("off: %u\n", ntohs(pkt->data.off));
+       printf("wsz: %u\n", ntohs(pkt->data.wsz));
+       printf("crc: %u\n", ntohs(pkt->data.crc));
+       printf("urg: %u\n", ntohs(pkt->data.urg));
        printf("flags: %c%c%c%c%c%c%c%c\n",
                        pkt->data.flg & 0x80 ? 'C' : '.',
                        pkt->data.flg & 0x40 ? 'E' : '.',

Modified: gnunet/src/vpn/test.c
===================================================================
--- gnunet/src/vpn/test.c       2010-06-28 12:37:43 UTC (rev 12027)
+++ gnunet/src/vpn/test.c       2010-06-28 12:37:44 UTC (rev 12028)
@@ -10,7 +10,9 @@
 #include "debug.h"
 #include "pretty-print.h"
 #include "tcp.h"
+#include <arpa/inet.h>
 
+
 int main(int c, char** v) {
        char dev[IFNAMSIZ];
        memset(dev, 0, IFNAMSIZ);
@@ -22,17 +24,15 @@
 
        for(;;) {
                printf("read %d bytes from socket, ", recv_pkt(fd, &pkt));
-               switch (pkt->type[0] << 8 | pkt->type[1]) {
+               switch (ntohs(pkt->type)) {
                        case 0x86dd:
                                printf("parsing ipv6:\n");
                                struct ip6_pkt* pkt6 = parse_ip6(pkt);
+                               pkt_printf(pkt6);
+                               struct ip6_tcp* pkt6_tcp;
                                switch(pkt6->hdr.nxthdr) {
-                                       case 0x3a:
-                                               pkt_printf(pkt6);
-                                               break;
                                        case 0x06:
-                                               pkt_printf(pkt6);
-                                               struct ip6_tcp* pkt6_tcp = 
parse_ip6_tcp(pkt6);
+                                               pkt6_tcp = parse_ip6_tcp(pkt6);
                                                pkt_printf_ip6tcp(pkt6_tcp);
                                                handle_tcp(pkt6_tcp);
                                                break;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]