xref: /freebsd/contrib/tcpdump/print-ppi.c (revision cac3dcd5f981d8843fb0acc27b4d28af1339af66)
1*cac3dcd5SXin LI /*
2*cac3dcd5SXin LI  * Oracle
3*cac3dcd5SXin LI  */
4*cac3dcd5SXin LI #ifdef HAVE_CONFIG_H
5*cac3dcd5SXin LI #include "config.h"
6*cac3dcd5SXin LI #endif
7*cac3dcd5SXin LI 
8*cac3dcd5SXin LI #include <tcpdump-stdinc.h>
9*cac3dcd5SXin LI 
10*cac3dcd5SXin LI #include <stdio.h>
11*cac3dcd5SXin LI #include <pcap.h>
12*cac3dcd5SXin LI 
13*cac3dcd5SXin LI #include "netdissect.h"
14*cac3dcd5SXin LI #include "interface.h"
15*cac3dcd5SXin LI #include "extract.h"
16*cac3dcd5SXin LI #include "ppi.h"
17*cac3dcd5SXin LI 
18*cac3dcd5SXin LI #ifdef DLT_PPI
19*cac3dcd5SXin LI 
20*cac3dcd5SXin LI static inline void
21*cac3dcd5SXin LI ppi_header_print(struct netdissect_options *ndo, const u_char *bp, u_int length)
22*cac3dcd5SXin LI {
23*cac3dcd5SXin LI 	const ppi_header_t *hdr;
24*cac3dcd5SXin LI 	u_int32_t dlt;
25*cac3dcd5SXin LI 	u_int16_t len;
26*cac3dcd5SXin LI 
27*cac3dcd5SXin LI 	hdr = (const ppi_header_t *)bp;
28*cac3dcd5SXin LI 
29*cac3dcd5SXin LI 	len = EXTRACT_16BITS(&hdr->ppi_len);
30*cac3dcd5SXin LI 	dlt = EXTRACT_32BITS(&hdr->ppi_dlt);
31*cac3dcd5SXin LI 
32*cac3dcd5SXin LI 	if (!ndo->ndo_qflag) {
33*cac3dcd5SXin LI 		ND_PRINT((ndo,", V.%d DLT %s (%d) len %d", hdr->ppi_ver,
34*cac3dcd5SXin LI 			  pcap_datalink_val_to_name(dlt), dlt,
35*cac3dcd5SXin LI                           len));
36*cac3dcd5SXin LI         } else {
37*cac3dcd5SXin LI 		ND_PRINT((ndo,", %s", pcap_datalink_val_to_name(dlt)));
38*cac3dcd5SXin LI         }
39*cac3dcd5SXin LI 
40*cac3dcd5SXin LI 	ND_PRINT((ndo, ", length %u: ", length));
41*cac3dcd5SXin LI }
42*cac3dcd5SXin LI 
43*cac3dcd5SXin LI static void
44*cac3dcd5SXin LI ppi_print(struct netdissect_options *ndo,
45*cac3dcd5SXin LI                const struct pcap_pkthdr *h, const u_char *p)
46*cac3dcd5SXin LI {
47*cac3dcd5SXin LI 	if_ndo_printer ndo_printer;
48*cac3dcd5SXin LI         if_printer printer;
49*cac3dcd5SXin LI 	ppi_header_t *hdr;
50*cac3dcd5SXin LI 	u_int caplen = h->caplen;
51*cac3dcd5SXin LI 	u_int length = h->len;
52*cac3dcd5SXin LI 	u_int32_t dlt;
53*cac3dcd5SXin LI 
54*cac3dcd5SXin LI 	if (caplen < sizeof(ppi_header_t)) {
55*cac3dcd5SXin LI 		ND_PRINT((ndo, "[|ppi]"));
56*cac3dcd5SXin LI 		return;
57*cac3dcd5SXin LI 	}
58*cac3dcd5SXin LI 	hdr = (ppi_header_t *)p;
59*cac3dcd5SXin LI 	dlt = EXTRACT_32BITS(&hdr->ppi_dlt);
60*cac3dcd5SXin LI 
61*cac3dcd5SXin LI 	if (ndo->ndo_eflag)
62*cac3dcd5SXin LI 		ppi_header_print(ndo, p, length);
63*cac3dcd5SXin LI 
64*cac3dcd5SXin LI 	length -= sizeof(ppi_header_t);
65*cac3dcd5SXin LI 	caplen -= sizeof(ppi_header_t);
66*cac3dcd5SXin LI 	p += sizeof(ppi_header_t);
67*cac3dcd5SXin LI 
68*cac3dcd5SXin LI 	if ((printer = lookup_printer(dlt)) != NULL) {
69*cac3dcd5SXin LI 		printer(h, p);
70*cac3dcd5SXin LI 	} else if ((ndo_printer = lookup_ndo_printer(dlt)) != NULL) {
71*cac3dcd5SXin LI 		ndo_printer(ndo, h, p);
72*cac3dcd5SXin LI 	} else {
73*cac3dcd5SXin LI 		if (!ndo->ndo_eflag)
74*cac3dcd5SXin LI 			ppi_header_print(ndo, (u_char *)hdr,
75*cac3dcd5SXin LI 					length + sizeof(ppi_header_t));
76*cac3dcd5SXin LI 
77*cac3dcd5SXin LI 		if (!ndo->ndo_suppress_default_print)
78*cac3dcd5SXin LI 			ndo->ndo_default_print(ndo, p, caplen);
79*cac3dcd5SXin LI 	}
80*cac3dcd5SXin LI }
81*cac3dcd5SXin LI 
82*cac3dcd5SXin LI /*
83*cac3dcd5SXin LI  * This is the top level routine of the printer.  'p' points
84*cac3dcd5SXin LI  * to the ether header of the packet, 'h->ts' is the timestamp,
85*cac3dcd5SXin LI  * 'h->len' is the length of the packet off the wire, and 'h->caplen'
86*cac3dcd5SXin LI  * is the number of bytes actually captured.
87*cac3dcd5SXin LI  */
88*cac3dcd5SXin LI u_int
89*cac3dcd5SXin LI ppi_if_print(struct netdissect_options *ndo,
90*cac3dcd5SXin LI                const struct pcap_pkthdr *h, const u_char *p)
91*cac3dcd5SXin LI {
92*cac3dcd5SXin LI 	ppi_print(ndo, h, p);
93*cac3dcd5SXin LI 
94*cac3dcd5SXin LI 	return (sizeof(ppi_header_t));
95*cac3dcd5SXin LI }
96*cac3dcd5SXin LI 
97*cac3dcd5SXin LI /*
98*cac3dcd5SXin LI  * Local Variables:
99*cac3dcd5SXin LI  * c-style: whitesmith
100*cac3dcd5SXin LI  * c-basic-offset: 8
101*cac3dcd5SXin LI  * End:
102*cac3dcd5SXin LI  */
103*cac3dcd5SXin LI 
104*cac3dcd5SXin LI #endif /* DLT_PPI */
105