14edb46e9SPaul Traina /* 2699fc314SBill Fenner * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997 34edb46e9SPaul Traina * The Regents of the University of California. All rights reserved. 44edb46e9SPaul Traina * 54edb46e9SPaul Traina * Redistribution and use in source and binary forms, with or without 64edb46e9SPaul Traina * modification, are permitted provided that: (1) source code distributions 74edb46e9SPaul Traina * retain the above copyright notice and this paragraph in its entirety, (2) 84edb46e9SPaul Traina * distributions including binary code include the above copyright notice and 94edb46e9SPaul Traina * this paragraph in its entirety in the documentation or other materials 104edb46e9SPaul Traina * provided with the distribution, and (3) all advertising materials mentioning 114edb46e9SPaul Traina * features or use of this software display the following acknowledgement: 124edb46e9SPaul Traina * ``This product includes software developed by the University of California, 134edb46e9SPaul Traina * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 144edb46e9SPaul Traina * the University nor the names of its contributors may be used to endorse 154edb46e9SPaul Traina * or promote products derived from this software without specific prior 164edb46e9SPaul Traina * written permission. 174edb46e9SPaul Traina * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 184edb46e9SPaul Traina * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 194edb46e9SPaul Traina * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20a88113a8SBill Fenner * 21a88113a8SBill Fenner * $FreeBSD$ 224edb46e9SPaul Traina */ 234edb46e9SPaul Traina 244edb46e9SPaul Traina #ifndef lint 252ebf6c05SBill Fenner static const char rcsid[] = 26a88113a8SBill Fenner "@(#) $Header: /tcpdump/master/tcpdump/print-null.c,v 1.30 1999/12/22 06:27:21 itojun Exp $ (LBL)"; 27a88113a8SBill Fenner #endif 28a88113a8SBill Fenner 29a88113a8SBill Fenner #ifdef HAVE_CONFIG_H 30a88113a8SBill Fenner #include "config.h" 314edb46e9SPaul Traina #endif 324edb46e9SPaul Traina 334edb46e9SPaul Traina #include <sys/param.h> 344edb46e9SPaul Traina #include <sys/time.h> 354edb46e9SPaul Traina #include <sys/socket.h> 364edb46e9SPaul Traina #include <sys/file.h> 374edb46e9SPaul Traina #include <sys/ioctl.h> 384edb46e9SPaul Traina 394edb46e9SPaul Traina #if __STDC__ 404edb46e9SPaul Traina struct mbuf; 414edb46e9SPaul Traina struct rtentry; 424edb46e9SPaul Traina #endif 434edb46e9SPaul Traina #include <net/if.h> 444edb46e9SPaul Traina 454edb46e9SPaul Traina #include <netinet/in.h> 464edb46e9SPaul Traina #include <netinet/in_systm.h> 474edb46e9SPaul Traina #include <netinet/ip.h> 48ee3e7633SGarrett Wollman #include <net/ethernet.h> 494edb46e9SPaul Traina #include <netinet/ip_var.h> 504edb46e9SPaul Traina #include <netinet/udp.h> 514edb46e9SPaul Traina #include <netinet/udp_var.h> 524edb46e9SPaul Traina #include <netinet/tcp.h> 534edb46e9SPaul Traina 542ebf6c05SBill Fenner #include <pcap.h> 554edb46e9SPaul Traina #include <stdio.h> 564edb46e9SPaul Traina #include <string.h> 574edb46e9SPaul Traina 58a88113a8SBill Fenner #ifdef INET6 59a88113a8SBill Fenner #include <netinet/ip6.h> 60a88113a8SBill Fenner #endif 61a88113a8SBill Fenner 622ebf6c05SBill Fenner #include "interface.h" 63699fc314SBill Fenner #include "addrtoname.h" 644edb46e9SPaul Traina 652ebf6c05SBill Fenner #ifndef AF_NS 662ebf6c05SBill Fenner #define AF_NS 6 /* XEROX NS protocols */ 672ebf6c05SBill Fenner #endif 682ebf6c05SBill Fenner 69699fc314SBill Fenner /* 70699fc314SBill Fenner * The DLT_NULL packet header is 4 bytes long. It contains a network 71699fc314SBill Fenner * order 32 bit integer that specifies the family, e.g. AF_INET 72699fc314SBill Fenner */ 73699fc314SBill Fenner #define NULL_HDRLEN 4 74699fc314SBill Fenner 754edb46e9SPaul Traina static void 764edb46e9SPaul Traina null_print(const u_char *p, const struct ip *ip, u_int length) 774edb46e9SPaul Traina { 784edb46e9SPaul Traina u_int family; 794edb46e9SPaul Traina 804edb46e9SPaul Traina memcpy((char *)&family, (char *)p, sizeof(family)); 814edb46e9SPaul Traina 824edb46e9SPaul Traina if (nflag) { 834edb46e9SPaul Traina /* XXX just dump the header */ 844edb46e9SPaul Traina return; 854edb46e9SPaul Traina } 864edb46e9SPaul Traina switch (family) { 874edb46e9SPaul Traina 884edb46e9SPaul Traina case AF_INET: 894edb46e9SPaul Traina printf("ip: "); 904edb46e9SPaul Traina break; 914edb46e9SPaul Traina 92a88113a8SBill Fenner #ifdef INET6 93a88113a8SBill Fenner case AF_INET6: 94a88113a8SBill Fenner printf("ip6: "); 95a88113a8SBill Fenner break; 96a88113a8SBill Fenner #endif 97a88113a8SBill Fenner 984edb46e9SPaul Traina case AF_NS: 994edb46e9SPaul Traina printf("ns: "); 1004edb46e9SPaul Traina break; 1014edb46e9SPaul Traina 1024edb46e9SPaul Traina default: 1034edb46e9SPaul Traina printf("AF %d: ", family); 1044edb46e9SPaul Traina break; 1054edb46e9SPaul Traina } 1064edb46e9SPaul Traina } 1074edb46e9SPaul Traina 1084edb46e9SPaul Traina void 1094edb46e9SPaul Traina null_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) 1104edb46e9SPaul Traina { 1114edb46e9SPaul Traina u_int length = h->len; 1124edb46e9SPaul Traina u_int caplen = h->caplen; 1134edb46e9SPaul Traina const struct ip *ip; 1144edb46e9SPaul Traina 1154edb46e9SPaul Traina ts_print(&h->ts); 1164edb46e9SPaul Traina 1174edb46e9SPaul Traina /* 1184edb46e9SPaul Traina * Some printers want to get back at the link level addresses, 1194edb46e9SPaul Traina * and/or check that they're not walking off the end of the packet. 1204edb46e9SPaul Traina * Rather than pass them all the way down, we set these globals. 1214edb46e9SPaul Traina */ 1224edb46e9SPaul Traina packetp = p; 1234edb46e9SPaul Traina snapend = p + caplen; 1244edb46e9SPaul Traina 1254edb46e9SPaul Traina length -= NULL_HDRLEN; 1264edb46e9SPaul Traina 1274edb46e9SPaul Traina ip = (struct ip *)(p + NULL_HDRLEN); 1284edb46e9SPaul Traina 1294edb46e9SPaul Traina if (eflag) 1304edb46e9SPaul Traina null_print(p, ip, length); 1314edb46e9SPaul Traina 132a88113a8SBill Fenner switch (ip->ip_v) { 133a88113a8SBill Fenner case 4: 1344edb46e9SPaul Traina ip_print((const u_char *)ip, length); 135a88113a8SBill Fenner break; 136a88113a8SBill Fenner #ifdef INET6 137a88113a8SBill Fenner case 6: 138a88113a8SBill Fenner ip6_print((const u_char *)ip, length); 139a88113a8SBill Fenner break; 140a88113a8SBill Fenner #endif /* INET6 */ 141a88113a8SBill Fenner default: 142a88113a8SBill Fenner printf("ip v%d", ip->ip_v); 143a88113a8SBill Fenner break; 144a88113a8SBill Fenner } 1454edb46e9SPaul Traina 1464edb46e9SPaul Traina if (xflag) 1474edb46e9SPaul Traina default_print((const u_char *)ip, caplen - NULL_HDRLEN); 1484edb46e9SPaul Traina putchar('\n'); 1494edb46e9SPaul Traina } 1504edb46e9SPaul Traina 151