xref: /freebsd/contrib/tcpdump/print-null.c (revision a88113a83091fa398943e3c86bacb00932e947bf)
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