1
2 /*
3 * Copyright (C) 2012 by Darren Reed.
4 *
5 * See the IPFILTER.LICENCE file for details on licencing.
6 *
7 * $Id$
8 */
9
10 #include "ipf.h"
11
12 /*
13 * This is meant to work without the IPv6 header files being present or
14 * the inet_ntop() library.
15 */
16 void
printpacket6(int dir,mb_t * m)17 printpacket6(int dir, mb_t *m)
18 {
19 u_char *buf, p;
20 u_short plen, *addrs;
21 tcphdr_t *tcp;
22 u_32_t flow;
23
24 buf = (u_char *)m->mb_data;
25 tcp = (tcphdr_t *)(buf + 40);
26 p = buf[6];
27 flow = ntohl(*(u_32_t *)buf);
28 flow &= 0xfffff;
29 plen = ntohs(*((u_short *)buf +2));
30 addrs = (u_short *)buf + 4;
31
32 if (dir)
33 PRINTF("> ");
34 else
35 PRINTF("< ");
36
37 PRINTF("%s ", IFNAME(m->mb_ifp));
38
39 PRINTF("ip6/%d %d %#x %d", buf[0] & 0xf, plen, flow, p);
40 PRINTF(" %x:%x:%x:%x:%x:%x:%x:%x",
41 ntohs(addrs[0]), ntohs(addrs[1]), ntohs(addrs[2]),
42 ntohs(addrs[3]), ntohs(addrs[4]), ntohs(addrs[5]),
43 ntohs(addrs[6]), ntohs(addrs[7]));
44 if (plen >= 4)
45 if (p == IPPROTO_TCP || p == IPPROTO_UDP)
46 (void)PRINTF(",%d", ntohs(tcp->th_sport));
47 PRINTF(" >");
48 addrs += 8;
49 PRINTF(" %x:%x:%x:%x:%x:%x:%x:%x",
50 ntohs(addrs[0]), ntohs(addrs[1]), ntohs(addrs[2]),
51 ntohs(addrs[3]), ntohs(addrs[4]), ntohs(addrs[5]),
52 ntohs(addrs[6]), ntohs(addrs[7]));
53 if (plen >= 4)
54 if (p == IPPROTO_TCP || p == IPPROTO_UDP)
55 PRINTF(",%d", ntohs(tcp->th_dport));
56 putchar('\n');
57 }
58