|  | /* | 
|  | * Copyright (C) 2002 by Darren Reed. | 
|  | * | 
|  | * See the IPFILTER.LICENCE file for details on licencing. | 
|  | * | 
|  | * $Id$ | 
|  | */ | 
|  |  | 
|  | #include "ipf.h" | 
|  |  | 
|  | /* | 
|  | * This is meant to work without the IPv6 header files being present or | 
|  | * the inet_ntop() library. | 
|  | */ | 
|  | void printpacket6(ip) | 
|  | struct ip *ip; | 
|  | { | 
|  | u_char *buf, p; | 
|  | u_short plen, *addrs; | 
|  | tcphdr_t *tcp; | 
|  | u_32_t flow; | 
|  |  | 
|  | buf = (u_char *)ip; | 
|  | tcp = (tcphdr_t *)(buf + 40); | 
|  | p = buf[6]; | 
|  | flow = ntohl(*(u_32_t *)buf); | 
|  | flow &= 0xfffff; | 
|  | plen = ntohs(*((u_short *)buf +2)); | 
|  | addrs = (u_short *)buf + 4; | 
|  |  | 
|  | printf("ip6/%d %d %#x %d", buf[0] & 0xf, plen, flow, p); | 
|  | printf(" %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", | 
|  | ntohs(addrs[0]), ntohs(addrs[1]), ntohs(addrs[2]), | 
|  | ntohs(addrs[3]), ntohs(addrs[4]), ntohs(addrs[5]), | 
|  | ntohs(addrs[6]), ntohs(addrs[7])); | 
|  | if (plen >= 4) | 
|  | if (p == IPPROTO_TCP || p == IPPROTO_UDP) | 
|  | (void)printf(",%d", ntohs(tcp->th_sport)); | 
|  | printf(" >"); | 
|  | addrs += 8; | 
|  | printf(" %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", | 
|  | ntohs(addrs[0]), ntohs(addrs[1]), ntohs(addrs[2]), | 
|  | ntohs(addrs[3]), ntohs(addrs[4]), ntohs(addrs[5]), | 
|  | ntohs(addrs[6]), ntohs(addrs[7])); | 
|  | if (plen >= 4) | 
|  | if (p == IPPROTO_TCP || p == IPPROTO_UDP) | 
|  | (void)printf(",%d", ntohs(tcp->th_dport)); | 
|  | putchar('\n'); | 
|  | } |