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