aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2010-06-28 12:37:41 +0000
committerPhilipp Tölke <toelke@in.tum.de>2010-06-28 12:37:41 +0000
commit06ae585b485c07e74f02a4c9905d5f56a4fbc9b8 (patch)
tree09e83738a0787f0d308b37dc3e66afad1ea5b81c
parentabfd8251847962ccdff4d445ff2069da1dcb212a (diff)
downloadgnunet-06ae585b485c07e74f02a4c9905d5f56a4fbc9b8.tar.gz
gnunet-06ae585b485c07e74f02a4c9905d5f56a4fbc9b8.zip
vpn: parse and pretty-print tcp-packets
-rw-r--r--src/vpn/packet.c30
-rw-r--r--src/vpn/packet.h15
-rw-r--r--src/vpn/pretty-print.c24
-rw-r--r--src/vpn/pretty-print.h4
-rw-r--r--src/vpn/test.c12
5 files changed, 81 insertions, 4 deletions
diff --git a/src/vpn/packet.c b/src/vpn/packet.c
index fc9eb7ba4..79841dc64 100644
--- a/src/vpn/packet.c
+++ b/src/vpn/packet.c
@@ -125,3 +125,33 @@ struct ip6_pkt* parse_ip6(struct pkt_tun* pkt) {{{
125 125
126 return pkt6; 126 return pkt6;
127}}} 127}}}
128
129struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt* pkt) {{{
130 struct ip6_tcp* res = (struct ip6_tcp*) malloc(sizeof(struct ip6_tcp));
131 memcpy(&(res->hdr), &(pkt->hdr), sizeof(struct ip6_hdr));
132
133 res->data.spt = (pkt->data[0] << 8) | pkt->data[1];
134 res->data.dpt = (pkt->data[2] << 8) | pkt->data[3];
135
136 res->data.seq = (pkt->data[4] << 24) | (pkt->data[5] << 16) | (pkt->data[6] << 8) | pkt->data[7];
137 res->data.ack = (pkt->data[8] << 24) | (pkt->data[9] << 16) | (pkt->data[10] << 8) | pkt->data[11];
138
139 res->data.off = pkt->data[12] >> 4;
140 res->data.rsv = pkt->data[12] & 0xF;
141
142 res->data.flg = pkt->data[13];
143
144 res->data.wsz = (pkt->data[14] << 8) | pkt->data[15];
145
146 res->data.crc = (pkt->data[16] << 8) | pkt->data[17];
147
148 res->data.urg = (pkt->data[18] << 8) | pkt->data[19];
149
150 res->data.opt = (unsigned char*) malloc((res->data.off - 5)*4);
151 memcpy(res->data.opt, pkt->data+20, (res->data.off - 5)*4);
152
153 res->data.data = (unsigned char*) malloc(payload(pkt) - 4*(res->data.off));
154 memcpy(res->data.data, pkt->data+4*(res->data.off), payload(pkt) - 4*(res->data.off));
155
156 return res;
157}}}
diff --git a/src/vpn/packet.h b/src/vpn/packet.h
index 7857bb283..504690936 100644
--- a/src/vpn/packet.h
+++ b/src/vpn/packet.h
@@ -23,14 +23,27 @@ struct ip6_pkt {
23 unsigned char* data; 23 unsigned char* data;
24}; 24};
25 25
26struct tcp_pkt {
27 unsigned short spt, dpt;
28 unsigned int seq, ack;
29 unsigned char off, rsv, flg;
30 unsigned short wsz;
31 unsigned short crc, urg;
32 unsigned char* opt;
26 unsigned char* data; 33 unsigned char* data;
27}; 34};
28 35
36struct ip6_tcp {
37 struct ip6_hdr hdr;
38 struct tcp_pkt data;
39};
40
29extern void send_pkt(int fd, struct ip6_pkt* pkt); 41extern void send_pkt(int fd, struct ip6_pkt* pkt);
30extern int recv_ipv6pkt(int fd, struct pkt_tun** pkt, unsigned char*); 42extern int recv_ipv6pkt(int fd, struct pkt_tun** pkt, unsigned char*);
31extern int recv_pkt(int fd, struct pkt_tun** pkt); 43extern int recv_pkt(int fd, struct pkt_tun** pkt);
32extern struct ip6_pkt* parse_ip6(struct pkt_tun* pkt); 44extern struct ip6_pkt* parse_ip6(struct pkt_tun* pkt);
33extern void pkt_printf(struct ip6_pkt* pkt); 45
46struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
34 47
35extern long payload(struct ip6_pkt* pkt); 48extern long payload(struct ip6_pkt* pkt);
36 49
diff --git a/src/vpn/pretty-print.c b/src/vpn/pretty-print.c
index 945ac92a7..c9878461d 100644
--- a/src/vpn/pretty-print.c
+++ b/src/vpn/pretty-print.c
@@ -94,6 +94,9 @@ void pp_write_header(char* dest, struct ip6_pkt* pkt) {{{
94 case 0x3a: 94 case 0x3a:
95 memcpy(dest, "ICMPv6)", 7); 95 memcpy(dest, "ICMPv6)", 7);
96 break; 96 break;
97 case 0x06:
98 memcpy(dest, "TCP)", 4);
99 break;
97 default: 100 default:
98 memcpy(dest, "unknown)", 8); 101 memcpy(dest, "unknown)", 8);
99 break; 102 break;
@@ -139,3 +142,24 @@ void pkt_printf(struct ip6_pkt* pkt) {{{
139 printf(buf); 142 printf(buf);
140 free(buf); 143 free(buf);
141}}} 144}}}
145
146void pkt_printf_ip6tcp(struct ip6_tcp* pkt) {{{
147 printf("spt: %u\n", pkt->data.spt);
148 printf("dpt: %u\n", pkt->data.dpt);
149 printf("seq: %u\n", pkt->data.seq);
150 printf("ack: %u\n", pkt->data.ack);
151 printf("off: %u\n", pkt->data.off);
152 printf("wsz: %u\n", pkt->data.wsz);
153 printf("crc: %u\n", pkt->data.crc);
154 printf("urg: %u\n", pkt->data.urg);
155 printf("flags: %c%c%c%c%c%c%c%c\n",
156 pkt->data.flg & 0x80 ? 'C' : '.',
157 pkt->data.flg & 0x40 ? 'E' : '.',
158 pkt->data.flg & 0x20 ? 'U' : '.',
159 pkt->data.flg & 0x10 ? 'A' : '.',
160 pkt->data.flg & 0x08 ? 'P' : '.',
161 pkt->data.flg & 0x04 ? 'R' : '.',
162 pkt->data.flg & 0x02 ? 'S' : '.',
163 pkt->data.flg & 0x01 ? 'F' : '.'
164 );
165}}}
diff --git a/src/vpn/pretty-print.h b/src/vpn/pretty-print.h
index 191e2e2b5..2ab32b9c2 100644
--- a/src/vpn/pretty-print.h
+++ b/src/vpn/pretty-print.h
@@ -1,12 +1,12 @@
1#ifndef _GNTUN_PP_H_ 1#ifndef _GNTUN_PP_H_
2#define _GNTUN_PP_H_ 2#define _GNTUN_PP_H_
3 3
4extern static void pp_ip6adr(unsigned char* adr, char* dest);
5
6extern void pp_hexdump(unsigned char* data, char* dest, int max); 4extern void pp_hexdump(unsigned char* data, char* dest, int max);
7 5
8extern void pp_write_header(char* dest, struct ip6_pkt* pkt); 6extern void pp_write_header(char* dest, struct ip6_pkt* pkt);
9 7
10extern void pkt_printf(struct ip6_pkt* pkt); 8extern void pkt_printf(struct ip6_pkt* pkt);
11 9
10void pkt_printf_ip6tcp(struct ip6_tcp* pkt);
11
12#endif 12#endif
diff --git a/src/vpn/test.c b/src/vpn/test.c
index 15aad30d6..6d63d4bb1 100644
--- a/src/vpn/test.c
+++ b/src/vpn/test.c
@@ -7,6 +7,7 @@
7#include "packet.h" 7#include "packet.h"
8#include "tun.h" 8#include "tun.h"
9#include "debug.h" 9#include "debug.h"
10#include "pretty-print.h"
10 11
11int main(int c, char** v) { 12int main(int c, char** v) {
12 //char* dev = (char*) malloc(IFNAMSIZ); 13 //char* dev = (char*) malloc(IFNAMSIZ);
@@ -23,7 +24,16 @@ int main(int c, char** v) {
23 case 0x86dd: 24 case 0x86dd:
24 printf("parsing ipv6:\n"); 25 printf("parsing ipv6:\n");
25 struct ip6_pkt* pkt6 = parse_ip6(pkt); 26 struct ip6_pkt* pkt6 = parse_ip6(pkt);
26 pkt_printf(pkt6); 27 switch(pkt6->hdr.nxthdr) {
28 case 0x3a:
29 pkt_printf(pkt6);
30 break;
31 case 0x06:
32 pkt_printf(pkt6);
33 struct ip6_tcp* pkt6_tcp = parse_ip6_tcp(pkt6);
34 pkt_printf_ip6tcp(pkt6_tcp);
35 break;
36 }
27 break; 37 break;
28 default: 38 default:
29 printf("unknown/unimplemented packet-type\n"); 39 printf("unknown/unimplemented packet-type\n");