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