nexmon – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | #define NETDISSECT_REWORKED |
2 | #ifdef HAVE_CONFIG_H |
||
3 | #include "config.h" |
||
4 | #endif |
||
5 | |||
6 | #include <tcpdump-stdinc.h> |
||
7 | |||
8 | #include "interface.h" |
||
9 | |||
10 | typedef struct ipnet_hdr { |
||
11 | uint8_t iph_version; |
||
12 | uint8_t iph_family; |
||
13 | uint16_t iph_htype; |
||
14 | uint32_t iph_pktlen; |
||
15 | uint32_t iph_ifindex; |
||
16 | uint32_t iph_grifindex; |
||
17 | uint32_t iph_zsrc; |
||
18 | uint32_t iph_zdst; |
||
19 | } ipnet_hdr_t; |
||
20 | |||
21 | #define IPH_AF_INET 2 /* Matches Solaris's AF_INET */ |
||
22 | #define IPH_AF_INET6 26 /* Matches Solaris's AF_INET6 */ |
||
23 | |||
24 | #ifdef DLT_IPNET |
||
25 | |||
26 | static const struct tok ipnet_values[] = { |
||
27 | { IPH_AF_INET, "IPv4" }, |
||
28 | { IPH_AF_INET6, "IPv6" }, |
||
29 | { 0, NULL } |
||
30 | }; |
||
31 | |||
32 | static inline void |
||
33 | ipnet_hdr_print(netdissect_options *ndo, const u_char *bp, u_int length) |
||
34 | { |
||
35 | const ipnet_hdr_t *hdr; |
||
36 | hdr = (const ipnet_hdr_t *)bp; |
||
37 | |||
38 | ND_PRINT((ndo, "%d > %d", hdr->iph_zsrc, hdr->iph_zdst)); |
||
39 | |||
40 | if (!ndo->ndo_qflag) { |
||
41 | ND_PRINT((ndo,", family %s (%d)", |
||
42 | tok2str(ipnet_values, "Unknown", |
||
43 | hdr->iph_family), |
||
44 | hdr->iph_family)); |
||
45 | } else { |
||
46 | ND_PRINT((ndo,", %s", |
||
47 | tok2str(ipnet_values, |
||
48 | "Unknown Ethertype (0x%04x)", |
||
49 | hdr->iph_family))); |
||
50 | } |
||
51 | |||
52 | ND_PRINT((ndo, ", length %u: ", length)); |
||
53 | } |
||
54 | |||
55 | static void |
||
56 | ipnet_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen) |
||
57 | { |
||
58 | ipnet_hdr_t *hdr; |
||
59 | |||
60 | if (caplen < sizeof(ipnet_hdr_t)) { |
||
61 | ND_PRINT((ndo, "[|ipnet]")); |
||
62 | return; |
||
63 | } |
||
64 | |||
65 | if (ndo->ndo_eflag) |
||
66 | ipnet_hdr_print(ndo, p, length); |
||
67 | |||
68 | length -= sizeof(ipnet_hdr_t); |
||
69 | caplen -= sizeof(ipnet_hdr_t); |
||
70 | hdr = (ipnet_hdr_t *)p; |
||
71 | p += sizeof(ipnet_hdr_t); |
||
72 | |||
73 | switch (hdr->iph_family) { |
||
74 | |||
75 | case IPH_AF_INET: |
||
76 | ip_print(ndo, p, length); |
||
77 | break; |
||
78 | |||
79 | case IPH_AF_INET6: |
||
80 | ip6_print(ndo, p, length); |
||
81 | break; |
||
82 | |||
83 | default: |
||
84 | if (!ndo->ndo_eflag) |
||
85 | ipnet_hdr_print(ndo, (u_char *)hdr, |
||
86 | length + sizeof(ipnet_hdr_t)); |
||
87 | |||
88 | if (!ndo->ndo_suppress_default_print) |
||
89 | ND_DEFAULTPRINT(p, caplen); |
||
90 | break; |
||
91 | } |
||
92 | } |
||
93 | |||
94 | /* |
||
95 | * This is the top level routine of the printer. 'p' points |
||
96 | * to the ether header of the packet, 'h->ts' is the timestamp, |
||
97 | * 'h->len' is the length of the packet off the wire, and 'h->caplen' |
||
98 | * is the number of bytes actually captured. |
||
99 | */ |
||
100 | u_int |
||
101 | ipnet_if_print(netdissect_options *ndo, |
||
102 | const struct pcap_pkthdr *h, const u_char *p) |
||
103 | { |
||
104 | ipnet_print(ndo, p, h->len, h->caplen); |
||
105 | |||
106 | return (sizeof(ipnet_hdr_t)); |
||
107 | } |
||
108 | |||
109 | /* |
||
110 | * Local Variables: |
||
111 | * c-style: whitesmith |
||
112 | * c-basic-offset: 8 |
||
113 | * End: |
||
114 | */ |
||
115 | |||
116 | #endif /* DLT_IPNET */ |