diff options
author | Philipp Tölke <toelke@in.tum.de> | 2010-06-28 12:37:41 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2010-06-28 12:37:41 +0000 |
commit | 06ae585b485c07e74f02a4c9905d5f56a4fbc9b8 (patch) | |
tree | 09e83738a0787f0d308b37dc3e66afad1ea5b81c | |
parent | abfd8251847962ccdff4d445ff2069da1dcb212a (diff) | |
download | gnunet-06ae585b485c07e74f02a4c9905d5f56a4fbc9b8.tar.gz gnunet-06ae585b485c07e74f02a4c9905d5f56a4fbc9b8.zip |
vpn: parse and pretty-print tcp-packets
-rw-r--r-- | src/vpn/packet.c | 30 | ||||
-rw-r--r-- | src/vpn/packet.h | 15 | ||||
-rw-r--r-- | src/vpn/pretty-print.c | 24 | ||||
-rw-r--r-- | src/vpn/pretty-print.h | 4 | ||||
-rw-r--r-- | src/vpn/test.c | 12 |
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 | |||
129 | struct 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 | ||
26 | struct 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 | ||
36 | struct ip6_tcp { | ||
37 | struct ip6_hdr hdr; | ||
38 | struct tcp_pkt data; | ||
39 | }; | ||
40 | |||
29 | extern void send_pkt(int fd, struct ip6_pkt* pkt); | 41 | extern void send_pkt(int fd, struct ip6_pkt* pkt); |
30 | extern int recv_ipv6pkt(int fd, struct pkt_tun** pkt, unsigned char*); | 42 | extern int recv_ipv6pkt(int fd, struct pkt_tun** pkt, unsigned char*); |
31 | extern int recv_pkt(int fd, struct pkt_tun** pkt); | 43 | extern int recv_pkt(int fd, struct pkt_tun** pkt); |
32 | extern struct ip6_pkt* parse_ip6(struct pkt_tun* pkt); | 44 | extern struct ip6_pkt* parse_ip6(struct pkt_tun* pkt); |
33 | extern void pkt_printf(struct ip6_pkt* pkt); | 45 | |
46 | struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*); | ||
34 | 47 | ||
35 | extern long payload(struct ip6_pkt* pkt); | 48 | extern 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 | |||
146 | void 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 | ||
4 | extern static void pp_ip6adr(unsigned char* adr, char* dest); | ||
5 | |||
6 | extern void pp_hexdump(unsigned char* data, char* dest, int max); | 4 | extern void pp_hexdump(unsigned char* data, char* dest, int max); |
7 | 5 | ||
8 | extern void pp_write_header(char* dest, struct ip6_pkt* pkt); | 6 | extern void pp_write_header(char* dest, struct ip6_pkt* pkt); |
9 | 7 | ||
10 | extern void pkt_printf(struct ip6_pkt* pkt); | 8 | extern void pkt_printf(struct ip6_pkt* pkt); |
11 | 9 | ||
10 | void 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 | ||
11 | int main(int c, char** v) { | 12 | int 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"); |