xref: /freebsd/contrib/tcpdump/print-ipnet.c (revision 27df3f5dddcc52e19be97c5e876161208987d4f1)
1*27df3f5dSRui Paulo #ifdef HAVE_CONFIG_H
2*27df3f5dSRui Paulo #include "config.h"
3*27df3f5dSRui Paulo #endif
4*27df3f5dSRui Paulo 
5*27df3f5dSRui Paulo #include <tcpdump-stdinc.h>
6*27df3f5dSRui Paulo 
7*27df3f5dSRui Paulo #include <stdio.h>
8*27df3f5dSRui Paulo #include <pcap.h>
9*27df3f5dSRui Paulo 
10*27df3f5dSRui Paulo #include "netdissect.h"
11*27df3f5dSRui Paulo #include "interface.h"
12*27df3f5dSRui Paulo #include "addrtoname.h"
13*27df3f5dSRui Paulo #include "ipnet.h"
14*27df3f5dSRui Paulo 
15*27df3f5dSRui Paulo #ifdef DLT_IPNET
16*27df3f5dSRui Paulo 
17*27df3f5dSRui Paulo const struct tok ipnet_values[] = {
18*27df3f5dSRui Paulo 	{ IPH_AF_INET,		"IPv4" },
19*27df3f5dSRui Paulo 	{ IPH_AF_INET6,		"IPv6" },
20*27df3f5dSRui Paulo 	{ 0,			NULL }
21*27df3f5dSRui Paulo };
22*27df3f5dSRui Paulo 
23*27df3f5dSRui Paulo static inline void
24*27df3f5dSRui Paulo ipnet_hdr_print(struct netdissect_options *ndo, const u_char *bp, u_int length)
25*27df3f5dSRui Paulo {
26*27df3f5dSRui Paulo 	const ipnet_hdr_t *hdr;
27*27df3f5dSRui Paulo 	hdr = (const ipnet_hdr_t *)bp;
28*27df3f5dSRui Paulo 
29*27df3f5dSRui Paulo 	ND_PRINT((ndo, "%d > %d", hdr->iph_zsrc, hdr->iph_zdst));
30*27df3f5dSRui Paulo 
31*27df3f5dSRui Paulo 	if (!ndo->ndo_qflag) {
32*27df3f5dSRui Paulo 		ND_PRINT((ndo,", family %s (%d)",
33*27df3f5dSRui Paulo                           tok2str(ipnet_values, "Unknown",
34*27df3f5dSRui Paulo                                   hdr->iph_family),
35*27df3f5dSRui Paulo                           hdr->iph_family));
36*27df3f5dSRui Paulo         } else {
37*27df3f5dSRui Paulo 		ND_PRINT((ndo,", %s",
38*27df3f5dSRui Paulo                           tok2str(ipnet_values,
39*27df3f5dSRui Paulo                                   "Unknown Ethertype (0x%04x)",
40*27df3f5dSRui Paulo                                   hdr->iph_family)));
41*27df3f5dSRui Paulo         }
42*27df3f5dSRui Paulo 
43*27df3f5dSRui Paulo 	ND_PRINT((ndo, ", length %u: ", length));
44*27df3f5dSRui Paulo }
45*27df3f5dSRui Paulo 
46*27df3f5dSRui Paulo static void
47*27df3f5dSRui Paulo ipnet_print(struct netdissect_options *ndo, const u_char *p, u_int length, u_int caplen)
48*27df3f5dSRui Paulo {
49*27df3f5dSRui Paulo 	ipnet_hdr_t *hdr;
50*27df3f5dSRui Paulo 
51*27df3f5dSRui Paulo 	if (caplen < sizeof(ipnet_hdr_t)) {
52*27df3f5dSRui Paulo 		ND_PRINT((ndo, "[|ipnet]"));
53*27df3f5dSRui Paulo 		return;
54*27df3f5dSRui Paulo 	}
55*27df3f5dSRui Paulo 
56*27df3f5dSRui Paulo 	if (ndo->ndo_eflag)
57*27df3f5dSRui Paulo 		ipnet_hdr_print(ndo, p, length);
58*27df3f5dSRui Paulo 
59*27df3f5dSRui Paulo 	length -= sizeof(ipnet_hdr_t);
60*27df3f5dSRui Paulo 	caplen -= sizeof(ipnet_hdr_t);
61*27df3f5dSRui Paulo 	hdr = (ipnet_hdr_t *)p;
62*27df3f5dSRui Paulo 	p += sizeof(ipnet_hdr_t);
63*27df3f5dSRui Paulo 
64*27df3f5dSRui Paulo 	switch (hdr->iph_family) {
65*27df3f5dSRui Paulo 
66*27df3f5dSRui Paulo 	case IPH_AF_INET:
67*27df3f5dSRui Paulo 	        ip_print(ndo, p, length);
68*27df3f5dSRui Paulo 		break;
69*27df3f5dSRui Paulo 
70*27df3f5dSRui Paulo #ifdef INET6
71*27df3f5dSRui Paulo 	case IPH_AF_INET6:
72*27df3f5dSRui Paulo 		ip6_print(p, length);
73*27df3f5dSRui Paulo 		break;
74*27df3f5dSRui Paulo #endif /*INET6*/
75*27df3f5dSRui Paulo 
76*27df3f5dSRui Paulo 	default:
77*27df3f5dSRui Paulo 		if (!ndo->ndo_eflag)
78*27df3f5dSRui Paulo 			ipnet_hdr_print(ndo, (u_char *)hdr,
79*27df3f5dSRui Paulo 					length + sizeof(ipnet_hdr_t));
80*27df3f5dSRui Paulo 
81*27df3f5dSRui Paulo 		if (!ndo->ndo_suppress_default_print)
82*27df3f5dSRui Paulo 			ndo->ndo_default_print(ndo, p, caplen);
83*27df3f5dSRui Paulo 		break;
84*27df3f5dSRui Paulo 	}
85*27df3f5dSRui Paulo }
86*27df3f5dSRui Paulo 
87*27df3f5dSRui Paulo /*
88*27df3f5dSRui Paulo  * This is the top level routine of the printer.  'p' points
89*27df3f5dSRui Paulo  * to the ether header of the packet, 'h->ts' is the timestamp,
90*27df3f5dSRui Paulo  * 'h->len' is the length of the packet off the wire, and 'h->caplen'
91*27df3f5dSRui Paulo  * is the number of bytes actually captured.
92*27df3f5dSRui Paulo  */
93*27df3f5dSRui Paulo u_int
94*27df3f5dSRui Paulo ipnet_if_print(struct netdissect_options *ndo,
95*27df3f5dSRui Paulo                const struct pcap_pkthdr *h, const u_char *p)
96*27df3f5dSRui Paulo {
97*27df3f5dSRui Paulo 	ipnet_print(ndo, p, h->len, h->caplen);
98*27df3f5dSRui Paulo 
99*27df3f5dSRui Paulo 	return (sizeof(ipnet_hdr_t));
100*27df3f5dSRui Paulo }
101*27df3f5dSRui Paulo 
102*27df3f5dSRui Paulo /*
103*27df3f5dSRui Paulo  * Local Variables:
104*27df3f5dSRui Paulo  * c-style: whitesmith
105*27df3f5dSRui Paulo  * c-basic-offset: 8
106*27df3f5dSRui Paulo  * End:
107*27df3f5dSRui Paulo  */
108*27df3f5dSRui Paulo 
109*27df3f5dSRui Paulo #endif /* DLT_IPNET */
110