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