From 947e2bd0312aacc2e1eb57b56c094386208c3931 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Philipp=20T=C3=B6lke?= Date: Mon, 28 Jun 2010 12:37:38 +0000 Subject: [PATCH] vpn: pull the pretty-printer out of the packet-file --- src/vpn/Makefile | 2 +- src/vpn/packet.c | 138 +--------------------------------------- src/vpn/packet.h | 2 + src/vpn/pretty-print.c | 141 +++++++++++++++++++++++++++++++++++++++++ src/vpn/pretty-print.h | 12 ++++ 5 files changed, 158 insertions(+), 137 deletions(-) create mode 100644 src/vpn/pretty-print.c create mode 100644 src/vpn/pretty-print.h diff --git a/src/vpn/Makefile b/src/vpn/Makefile index 848faf24d..783c66d92 100644 --- a/src/vpn/Makefile +++ b/src/vpn/Makefile @@ -7,7 +7,7 @@ all:default default: test -test: test.o tun.o packet.o debug.o +test: test.o tun.o packet.o debug.o pretty-print.o clean: rm -f *.o diff --git a/src/vpn/packet.c b/src/vpn/packet.c index 9a895224a..8125cbb0f 100644 --- a/src/vpn/packet.c +++ b/src/vpn/packet.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -10,32 +9,10 @@ #include "debug.h" #include "packet.h" -static long payload(struct ip6_pkt* pkt) { - return (pkt->paylgth[0] << 8) + pkt->paylgth[1]; +long payload(struct ip6_pkt* pkt) { + return (pkt->hdr.paylgth[0] << 8) + pkt->hdr.paylgth[1]; } -static char* pretty = /*{{{*/ -/* 0 1 2 3 4 5 6 - 0123456789012345678901234567890123456789012345678901234567890123456789 */ -"IPv6-Paket from xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx \n" //60 -" to xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx \n" //120 -" flow 0xXXX ( ) \n" //180 -" length 0xXX ( ) \n" //240 -" nexthdr 0xXX ( \n" //300 -" hoplmt 0xXX ( ) \n" //360 -"first 128 bytes of payload: \n" //420 -/* 0 1 2 3 4 5 6 - 0123456789012345678901234567890123456789012345678901234567890123456789 */ -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //490 -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //560 -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //630 -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //700 -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //770 -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //840 -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //910 -"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n";//980 -/*}}}*/ - void send_pkt(int fd, struct ip6_pkt* pkt) {{{ int sz = payload(pkt); int w = 0; @@ -148,114 +125,3 @@ struct ip6_pkt* parse_ip6(struct pkt_tun* pkt) {{{ return pkt6; }}} - -static void pp_ip6adr(unsigned char* adr, char* dest) {{{ - char tmp[3]; - - sprintf(tmp, "%02X", adr[0]); - memcpy(dest+0, tmp, 2); - sprintf(tmp, "%02X", adr[1]); - memcpy(dest+2, tmp, 2); - - sprintf(tmp, "%02X", adr[2]); - memcpy(dest+5, tmp, 2); - sprintf(tmp, "%02X", adr[3]); - memcpy(dest+7, tmp, 2); - - sprintf(tmp, "%02X", adr[4]); - memcpy(dest+10, tmp, 2); - sprintf(tmp, "%02X", adr[5]); - memcpy(dest+12, tmp, 2); - - sprintf(tmp, "%02X", adr[6]); - memcpy(dest+15, tmp, 2); - sprintf(tmp, "%02X", adr[7]); - memcpy(dest+17, tmp, 2); - - sprintf(tmp, "%02X", adr[8]); - memcpy(dest+20, tmp, 2); - sprintf(tmp, "%02X", adr[9]); - memcpy(dest+22, tmp, 2); - - sprintf(tmp, "%02X", adr[10]); - memcpy(dest+25, tmp, 2); - sprintf(tmp, "%02X", adr[11]); - memcpy(dest+27, tmp, 2); - - sprintf(tmp, "%02X", adr[12]); - memcpy(dest+30, tmp, 2); - sprintf(tmp, "%02X", adr[13]); - memcpy(dest+32, tmp, 2); - - sprintf(tmp, "%02X", adr[14]); - memcpy(dest+35, tmp, 2); - sprintf(tmp, "%02X", adr[15]); - memcpy(dest+37, tmp, 2); -}}} - -void pp_hexdump(unsigned char* data, char* dest, int max) {{{ - char tmp[3]; - char tmp2[2]; - int off = 0; - int to = max > 16 ? 16 : max; - for (int i = 0; i < to; i++) { - if (i == 8) off = 1; - sprintf(tmp, "%02x", data[i]); - memcpy(dest+(3*i)+off, tmp, 2); - if (isprint(data[i])) { - sprintf(tmp2, "%c", data[i]); - memcpy(dest+51+i, tmp2, 1); - } - } -}}} - -void pp_write_header(char* dest, struct ip6_pkt* pkt) { - switch (pkt->nxthdr) { - case 0x3a: - memcpy(dest, "ICMPv6)", 7); - break; - default: - memcpy(dest, "unknown)", 8); - break; - } -} - -void pkt_printf(struct ip6_pkt* pkt) { - char* buf = (char*)malloc(strlen(pretty)+1); - char tmp[9]; - - memcpy(buf, pretty, strlen(pretty)+1); - - pp_ip6adr(pkt->sadr, buf+16); - pp_ip6adr(pkt->dadr, buf+76); - - int flow = (pkt->flowlbl[0] << 16) + (pkt->flowlbl[1] << 8) + (pkt->flowlbl[2]); - sprintf(tmp, "%03x", flow); - memcpy(buf+138, tmp, 3); - sprintf(tmp, "%-8d", flow); - memcpy(buf+143, tmp, 8); - - int length = (pkt->paylgth[0] << 8) + (pkt->paylgth[1]); - sprintf(tmp, "%02x", length); - memcpy(buf+198, tmp, 2); - sprintf(tmp, "%-3d", length); - memcpy(buf+203, tmp, 3); - - sprintf(tmp, "%02x", pkt->nxthdr); - memcpy(buf+258, tmp, 2); - pp_write_header(buf+263, pkt); - - sprintf(tmp, "%02x", pkt->hoplmt); - memcpy(buf+318, tmp, 2); - sprintf(tmp, "%-3d", pkt->hoplmt); - memcpy(buf+323, tmp, 3); - - int size = payload(pkt); - 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); - } - - printf(buf); - free(buf); -} diff --git a/src/vpn/packet.h b/src/vpn/packet.h index 9d5153f13..b86f4a65c 100644 --- a/src/vpn/packet.h +++ b/src/vpn/packet.h @@ -26,4 +26,6 @@ extern int recv_pkt(int fd, struct pkt_tun** pkt); extern struct ip6_pkt* parse_ip6(struct pkt_tun* pkt); extern void pkt_printf(struct ip6_pkt* pkt); +extern long payload(struct ip6_pkt* pkt); + #endif diff --git a/src/vpn/pretty-print.c b/src/vpn/pretty-print.c new file mode 100644 index 000000000..945ac92a7 --- /dev/null +++ b/src/vpn/pretty-print.c @@ -0,0 +1,141 @@ +#include +#include +#include +#include + +#include "packet.h" + +static char* pretty = /*{{{*/ +/* 0 1 2 3 4 5 6 + 0123456789012345678901234567890123456789012345678901234567890123456789 */ +"IPv6-Paket from xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx \n" //60 +" to xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx \n" //120 +/* 0 1 2 3 4 5 6 + 0123456789012345678901234567890123456789012345678901234567890123456789 */ +" flow 0xXXX ( ) \n" //180 +" length 0xXX ( ) \n" //240 +" nexthdr 0xXX ( \n" //300 +" hoplmt 0xXX ( ) \n" //360 +"first 128 bytes of payload: \n" //420 +/* 0 1 2 3 4 5 6 + 0123456789012345678901234567890123456789012345678901234567890123456789 */ +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //490 +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //560 +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //630 +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //700 +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //770 +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //840 +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n" //910 +"XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | ................ \n";//980 +/*}}}*/ + +static void pp_ip6adr(unsigned char* adr, char* dest) {{{ + char tmp[3]; + + sprintf(tmp, "%02X", adr[0]); + memcpy(dest+0, tmp, 2); + sprintf(tmp, "%02X", adr[1]); + memcpy(dest+2, tmp, 2); + + sprintf(tmp, "%02X", adr[2]); + memcpy(dest+5, tmp, 2); + sprintf(tmp, "%02X", adr[3]); + memcpy(dest+7, tmp, 2); + + sprintf(tmp, "%02X", adr[4]); + memcpy(dest+10, tmp, 2); + sprintf(tmp, "%02X", adr[5]); + memcpy(dest+12, tmp, 2); + + sprintf(tmp, "%02X", adr[6]); + memcpy(dest+15, tmp, 2); + sprintf(tmp, "%02X", adr[7]); + memcpy(dest+17, tmp, 2); + + sprintf(tmp, "%02X", adr[8]); + memcpy(dest+20, tmp, 2); + sprintf(tmp, "%02X", adr[9]); + memcpy(dest+22, tmp, 2); + + sprintf(tmp, "%02X", adr[10]); + memcpy(dest+25, tmp, 2); + sprintf(tmp, "%02X", adr[11]); + memcpy(dest+27, tmp, 2); + + sprintf(tmp, "%02X", adr[12]); + memcpy(dest+30, tmp, 2); + sprintf(tmp, "%02X", adr[13]); + memcpy(dest+32, tmp, 2); + + sprintf(tmp, "%02X", adr[14]); + memcpy(dest+35, tmp, 2); + sprintf(tmp, "%02X", adr[15]); + memcpy(dest+37, tmp, 2); +}}} + +void pp_hexdump(unsigned char* data, char* dest, int max) {{{ + char tmp[3]; + char tmp2[2]; + int off = 0; + int to = max > 16 ? 16 : max; + for (int i = 0; i < to; i++) { + if (i == 8) off = 1; + sprintf(tmp, "%02x", data[i]); + memcpy(dest+(3*i)+off, tmp, 2); + if (isprint(data[i])) { + sprintf(tmp2, "%c", data[i]); + memcpy(dest+51+i, tmp2, 1); + } + } +}}} + +void pp_write_header(char* dest, struct ip6_pkt* pkt) {{{ + switch (pkt->hdr.nxthdr) { + case 0x3a: + memcpy(dest, "ICMPv6)", 7); + break; + default: + memcpy(dest, "unknown)", 8); + break; + } +}}} + +void pkt_printf(struct ip6_pkt* pkt) {{{ + char* buf = (char*)malloc(strlen(pretty)+1); + char tmp[9]; + + memcpy(buf, pretty, strlen(pretty)+1); + + 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]); + 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]); + sprintf(tmp, "%02x", length); + memcpy(buf+198, tmp, 2); + sprintf(tmp, "%-3d", length); + memcpy(buf+203, tmp, 3); + + sprintf(tmp, "%02x", pkt->hdr.nxthdr); + memcpy(buf+258, tmp, 2); + pp_write_header(buf+263, pkt); + + sprintf(tmp, "%02x", pkt->hdr.hoplmt); + memcpy(buf+318, tmp, 2); + sprintf(tmp, "%-3d", pkt->hdr.hoplmt); + memcpy(buf+323, tmp, 3); + + int size = payload(pkt); + 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); + } + + printf(buf); + free(buf); +}}} diff --git a/src/vpn/pretty-print.h b/src/vpn/pretty-print.h new file mode 100644 index 000000000..191e2e2b5 --- /dev/null +++ b/src/vpn/pretty-print.h @@ -0,0 +1,12 @@ +#ifndef _GNTUN_PP_H_ +#define _GNTUN_PP_H_ + +extern static void pp_ip6adr(unsigned char* adr, char* dest); + +extern void pp_hexdump(unsigned char* data, char* dest, int max); + +extern void pp_write_header(char* dest, struct ip6_pkt* pkt); + +extern void pkt_printf(struct ip6_pkt* pkt); + +#endif -- 2.25.1