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