10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * Copyright (C) 1993-2001 by Darren Reed. 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * See the IPFILTER.LICENCE file for details on licencing. 50Sstevel@tonic-gate * 6*2393Syz155240 * $Id: printpacket.c,v 1.12.4.1 2005/02/21 05:09:24 darrenr Exp $ 70Sstevel@tonic-gate */ 80Sstevel@tonic-gate 90Sstevel@tonic-gate #include "ipf.h" 100Sstevel@tonic-gate 110Sstevel@tonic-gate #ifndef IP_OFFMASK 120Sstevel@tonic-gate # define IP_OFFMASK 0x3fff 130Sstevel@tonic-gate #endif 140Sstevel@tonic-gate 150Sstevel@tonic-gate 160Sstevel@tonic-gate void printpacket(ip) 170Sstevel@tonic-gate struct ip *ip; 180Sstevel@tonic-gate { 190Sstevel@tonic-gate struct tcphdr *tcp; 200Sstevel@tonic-gate u_short len; 21*2393Syz155240 u_short off; 220Sstevel@tonic-gate 23*2393Syz155240 if (IP_V(ip) == 6) { 24*2393Syz155240 off = 0; 250Sstevel@tonic-gate len = ntohs(((u_short *)ip)[2]) + 40; 26*2393Syz155240 } else { 27*2393Syz155240 off = ntohs(ip->ip_off); 280Sstevel@tonic-gate len = ntohs(ip->ip_len); 29*2393Syz155240 } 300Sstevel@tonic-gate 310Sstevel@tonic-gate if ((opts & OPT_HEX) == OPT_HEX) { 320Sstevel@tonic-gate u_char *s; 330Sstevel@tonic-gate int i; 340Sstevel@tonic-gate 350Sstevel@tonic-gate for (s = (u_char *)ip, i = 0; i < len; i++) { 360Sstevel@tonic-gate printf("%02x", *s++ & 0xff); 370Sstevel@tonic-gate if (len - i > 1) { 380Sstevel@tonic-gate i++; 390Sstevel@tonic-gate printf("%02x", *s++ & 0xff); 400Sstevel@tonic-gate } 410Sstevel@tonic-gate putchar(' '); 420Sstevel@tonic-gate } 430Sstevel@tonic-gate putchar('\n'); 440Sstevel@tonic-gate return; 450Sstevel@tonic-gate } 460Sstevel@tonic-gate 470Sstevel@tonic-gate if (IP_V(ip) == 6) { 480Sstevel@tonic-gate printpacket6(ip); 490Sstevel@tonic-gate return; 500Sstevel@tonic-gate } 510Sstevel@tonic-gate 520Sstevel@tonic-gate tcp = (struct tcphdr *)((char *)ip + (IP_HL(ip) << 2)); 530Sstevel@tonic-gate printf("ip %d(%d) %d", ntohs(ip->ip_len), IP_HL(ip) << 2, ip->ip_p); 54*2393Syz155240 if (off & IP_OFFMASK) 55*2393Syz155240 printf(" @%d", off << 3); 560Sstevel@tonic-gate printf(" %s", inet_ntoa(ip->ip_src)); 57*2393Syz155240 if (!(off & IP_OFFMASK)) 580Sstevel@tonic-gate if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP) 590Sstevel@tonic-gate printf(",%d", ntohs(tcp->th_sport)); 600Sstevel@tonic-gate printf(" > "); 610Sstevel@tonic-gate printf("%s", inet_ntoa(ip->ip_dst)); 62*2393Syz155240 if (!(off & IP_OFFMASK)) { 630Sstevel@tonic-gate if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP) 640Sstevel@tonic-gate printf(",%d", ntohs(tcp->th_dport)); 650Sstevel@tonic-gate if ((ip->ip_p == IPPROTO_TCP) && (tcp->th_flags != 0)) { 660Sstevel@tonic-gate putchar(' '); 670Sstevel@tonic-gate if (tcp->th_flags & TH_FIN) 680Sstevel@tonic-gate putchar('F'); 690Sstevel@tonic-gate if (tcp->th_flags & TH_SYN) 700Sstevel@tonic-gate putchar('S'); 710Sstevel@tonic-gate if (tcp->th_flags & TH_RST) 720Sstevel@tonic-gate putchar('R'); 730Sstevel@tonic-gate if (tcp->th_flags & TH_PUSH) 740Sstevel@tonic-gate putchar('P'); 750Sstevel@tonic-gate if (tcp->th_flags & TH_ACK) 760Sstevel@tonic-gate putchar('A'); 770Sstevel@tonic-gate if (tcp->th_flags & TH_URG) 780Sstevel@tonic-gate putchar('U'); 790Sstevel@tonic-gate if (tcp->th_flags & TH_ECN) 800Sstevel@tonic-gate putchar('E'); 810Sstevel@tonic-gate if (tcp->th_flags & TH_CWR) 820Sstevel@tonic-gate putchar('C'); 830Sstevel@tonic-gate } 840Sstevel@tonic-gate } 850Sstevel@tonic-gate 860Sstevel@tonic-gate putchar('\n'); 870Sstevel@tonic-gate } 88