]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - cddl/lib/libdtrace/ip.d
devd.conf(5): Fix a mandoc related issue
[FreeBSD/FreeBSD.git] / cddl / lib / libdtrace / ip.d
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  *
21  * $FreeBSD$
22  */
23 /*
24  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
25  * Copyright (c) 2013 Mark Johnston <markj@freebsd.org>
26  */
27
28 #pragma D depends_on module kernel
29 #pragma D depends_on provider ip
30
31 /*
32  * pktinfo is where packet ID info can be made available for deeper
33  * analysis if packet IDs become supported by the kernel in the future.
34  * The pkt_addr member is currently always NULL.
35  */
36 typedef struct pktinfo {
37         uintptr_t pkt_addr;
38 } pktinfo_t;
39
40 /*
41  * csinfo is where connection state info is made available.
42  */
43 typedef uint32_t zoneid_t;
44 typedef struct csinfo {
45         uintptr_t cs_addr;
46         uint64_t cs_cid;
47         pid_t cs_pid;
48         zoneid_t cs_zoneid;
49 } csinfo_t;
50
51 /*
52  * ipinfo contains common IP info for both IPv4 and IPv6.
53  */
54 typedef struct ipinfo {
55         uint8_t ip_ver;                 /* IP version (4, 6) */
56         uint32_t ip_plength;            /* payload length */
57         string ip_saddr;                /* source address */
58         string ip_daddr;                /* destination address */
59 } ipinfo_t;
60
61 /*
62  * ifinfo contains network interface info.
63  */
64 typedef struct ifinfo {
65         string if_name;                 /* interface name */
66         int8_t if_local;                /* is delivered locally */
67         /*netstackid_t if_ipstack;*/    /* ipstack ID */
68         uintptr_t if_addr;              /* pointer to raw ill_t */
69 } ifinfo_t;
70
71 typedef uint32_t ipaddr_t;
72 typedef struct {
73         uint8_t         ipha_version_and_hdr_length;
74         uint8_t         ipha_type_of_service;
75         uint16_t        ipha_length;
76         uint16_t        ipha_ident;
77         uint16_t        ipha_fragment_offset_and_flags;
78         uint8_t         ipha_ttl;
79         uint8_t         ipha_protocol;
80         uint16_t        ipha_hdr_checksum;
81         ipaddr_t        ipha_src;
82         ipaddr_t        ipha_dst;
83 } ipha_t;
84
85 /*
86  * ipv4info is a translated version of the IPv4 header (with raw pointer).
87  * These values are NULL if the packet is not IPv4.
88  */
89 typedef struct ipv4info {
90         uint8_t ipv4_ver;               /* IP version (4) */
91         uint8_t ipv4_ihl;               /* header length, bytes */
92         uint8_t ipv4_tos;               /* type of service field */
93         uint16_t ipv4_length;           /* length (header + payload) */
94         uint16_t ipv4_ident;            /* identification */
95         uint8_t ipv4_flags;             /* IP flags */
96         uint16_t ipv4_offset;           /* fragment offset */
97         uint8_t ipv4_ttl;               /* time to live */
98         uint8_t ipv4_protocol;          /* next level protocol */
99         string ipv4_protostr;           /* next level protocol, as a string */
100         uint16_t ipv4_checksum;         /* header checksum */
101         ipaddr_t ipv4_src;              /* source address */
102         ipaddr_t ipv4_dst;              /* destination address */
103         string ipv4_saddr;              /* source address, string */
104         string ipv4_daddr;              /* destination address, string */
105         ipha_t *ipv4_hdr;               /* pointer to raw header */
106 } ipv4info_t;
107
108 /*
109  * ipv6info is a translated version of the IPv6 header (with raw pointer).
110  * These values are NULL if the packet is not IPv6.
111  */
112 typedef struct in6_addr in6_addr_t;
113 typedef struct ipv6info {
114         uint8_t ipv6_ver;               /* IP version (6) */
115         uint8_t ipv6_tclass;            /* traffic class */
116         uint32_t ipv6_flow;             /* flow label */
117         uint16_t ipv6_plen;             /* payload length */
118         uint8_t ipv6_nexthdr;           /* next header protocol */
119         string ipv6_nextstr;            /* next header protocol, as a string */
120         uint8_t ipv6_hlim;              /* hop limit */
121         in6_addr_t *ipv6_src;           /* source address */
122         in6_addr_t *ipv6_dst;           /* destination address */
123         string ipv6_saddr;              /* source address, string */
124         string ipv6_daddr;              /* destination address, string */
125         struct ip6_hdr *ipv6_hdr;       /* pointer to raw header */
126 } ipv6info_t;
127
128 #pragma D binding "1.5" IPPROTO_IP
129 inline short IPPROTO_IP =       0;
130 #pragma D binding "1.5" IPPROTO_ICMP
131 inline short IPPROTO_ICMP =     1;
132 #pragma D binding "1.5" IPPROTO_IGMP
133 inline short IPPROTO_IGMP =     2;
134 #pragma D binding "1.5" IPPROTO_IPV4
135 inline short IPPROTO_IPV4 =     4;
136 #pragma D binding "1.5" IPPROTO_TCP
137 inline short IPPROTO_TCP =      6;
138 #pragma D binding "1.5" IPPROTO_UDP
139 inline short IPPROTO_UDP =      17;
140 #pragma D binding "1.5" IPPROTO_IPV6
141 inline short IPPROTO_IPV6 =     41;
142 #pragma D binding "1.5" IPPROTO_ROUTING
143 inline short IPPROTO_ROUTING =  43;
144 #pragma D binding "1.5" IPPROTO_FRAGMENT
145 inline short IPPROTO_FRAGMENT = 44;
146 #pragma D binding "1.5" IPPROTO_RSVP
147 inline short IPPROTO_RSVP =     46;
148 #pragma D binding "1.5" IPPROTO_GRE
149 inline short IPPROTO_GRE =      47;
150 #pragma D binding "1.5" IPPROTO_ESP
151 inline short IPPROTO_ESP =      50;
152 #pragma D binding "1.5" IPPROTO_AH
153 inline short IPPROTO_AH =       51;
154 #pragma D binding "1.5" IPPROTO_MOBILE
155 inline short IPPROTO_MOBILE =   55;
156 #pragma D binding "1.5" IPPROTO_ICMPV6
157 inline short IPPROTO_ICMPV6 =   58;
158 #pragma D binding "1.5" IPPROTO_DSTOPTS
159 inline short IPPROTO_DSTOPTS =  60;
160 #pragma D binding "1.5" IPPROTO_ETHERIP
161 inline short IPPROTO_ETHERIP =  97;
162 #pragma D binding "1.5" IPPROTO_PIM
163 inline short IPPROTO_PIM =      103;
164 #pragma D binding "1.5" IPPROTO_IPCOMP
165 inline short IPPROTO_IPCOMP =   108;
166 #pragma D binding "1.5" IPPROTO_SCTP
167 inline short IPPROTO_SCTP =     132;
168 #pragma D binding "1.5" IPPROTO_RAW
169 inline short IPPROTO_RAW =      255;
170 #pragma D binding "1.13" IPPROTO_UDPLITE
171 inline short IPPROTO_UDPLITE =  136;
172
173 inline uint8_t INP_IPV4 = 0x01;
174 inline uint8_t INP_IPV6 = 0x02;
175
176 #pragma D binding "1.5" protocols
177 inline string protocols[int proto] =
178         proto == IPPROTO_IP ? "IP" :
179         proto == IPPROTO_ICMP ? "ICMP" :
180         proto == IPPROTO_IGMP ? "IGMP" :
181         proto == IPPROTO_IPV4 ? "IPV4" :
182         proto == IPPROTO_TCP ? "TCP" :
183         proto == IPPROTO_UDP ? "UDP" :
184         proto == IPPROTO_IPV6 ? "IPV6" :
185         proto == IPPROTO_ROUTING ? "ROUTING" :
186         proto == IPPROTO_FRAGMENT ? "FRAGMENT" :
187         proto == IPPROTO_RSVP ? "RSVP" :
188         proto == IPPROTO_GRE ? "GRE" :
189         proto == IPPROTO_ESP ? "ESP" :
190         proto == IPPROTO_AH ? "AH" :
191         proto == IPPROTO_MOBILE ? "MOBILE" :
192         proto == IPPROTO_ICMPV6 ? "ICMPV6" :
193         proto == IPPROTO_DSTOPTS ? "DSTOPTS" :
194         proto == IPPROTO_ETHERIP ? "ETHERIP" :
195         proto == IPPROTO_PIM ? "PIM" :
196         proto == IPPROTO_IPCOMP ? "IPCOMP" :
197         proto == IPPROTO_SCTP ? "SCTP" :
198         proto == IPPROTO_UDPLITE ? "UDPLITE" :
199         proto == IPPROTO_RAW ? "RAW" :
200         "<unknown>";
201
202 /*
203  * This field is always NULL according to the current definition of the ip
204  * probes.
205  */
206 #pragma D binding "1.5" translator
207 translator pktinfo_t < void *p > {
208         pkt_addr =      NULL;
209 };
210
211 #pragma D binding "1.5" translator
212 translator csinfo_t < void *p > {
213         cs_addr =       NULL;
214         cs_cid =        (uint64_t)p;
215         cs_pid =        0;
216         cs_zoneid =     0;
217 };
218
219 #pragma D binding "1.6.3" translator
220 translator csinfo_t < struct inpcb *p > {
221         cs_addr =       NULL;
222         cs_cid =        (uint64_t)p;
223         cs_pid =        0;      /* XXX */
224         cs_zoneid =     0;
225 };
226
227 #pragma D binding "1.5" translator
228 translator ipinfo_t < uint8_t *p > {
229         ip_ver =        p == NULL ? 0 : ((struct ip *)p)->ip_v;
230         ip_plength =    p == NULL ? 0 :
231             ((struct ip *)p)->ip_v == 4 ?
232             ntohs(((struct ip *)p)->ip_len) - (((struct ip *)p)->ip_hl << 2):
233             ntohs(((struct ip6_hdr *)p)->ip6_ctlun.ip6_un1.ip6_un1_plen);
234         ip_saddr =      p == NULL ? "<unknown>" :
235             ((struct ip *)p)->ip_v == 4 ?
236             inet_ntoa(&((struct ip *)p)->ip_src.s_addr) :
237             inet_ntoa6(&((struct ip6_hdr *)p)->ip6_src);
238         ip_daddr =      p == NULL ? "<unknown>" :
239             ((struct ip *)p)->ip_v == 4 ?
240             inet_ntoa(&((struct ip *)p)->ip_dst.s_addr) :
241             inet_ntoa6(&((struct ip6_hdr *)p)->ip6_dst);
242 };
243
244 #pragma D binding "1.13" translator
245 translator ipinfo_t < struct mbuf *m > {
246         ip_ver =        m == NULL ? 0 : ((struct ip *)m->m_data)->ip_v;
247         ip_plength =    m == NULL ? 0 :
248             ((struct ip *)m->m_data)->ip_v == 4 ?
249             ntohs(((struct ip *)m->m_data)->ip_len) - 
250                         (((struct ip *)m->m_data)->ip_hl << 2):
251             ntohs(((struct ip6_hdr *)m->m_data)->ip6_ctlun.ip6_un1.ip6_un1_plen);
252         ip_saddr =      m == NULL ? "<unknown>" :
253             ((struct ip *)m->m_data)->ip_v == 4 ?
254             inet_ntoa(&((struct ip *)m->m_data)->ip_src.s_addr) :
255             inet_ntoa6(&((struct ip6_hdr *)m->m_data)->ip6_src);
256         ip_daddr =      m == NULL ? "<unknown>" :
257             ((struct ip *)m->m_data)->ip_v == 4 ?
258             inet_ntoa(&((struct ip *)m->m_data)->ip_dst.s_addr) :
259             inet_ntoa6(&((struct ip6_hdr *)m->m_data)->ip6_dst);
260 };
261
262 #pragma D binding "1.5" IFF_LOOPBACK
263 inline int IFF_LOOPBACK =       0x8;
264
265 #pragma D binding "1.5" translator
266 translator ifinfo_t < struct ifnet *p > {
267         if_name =       p->if_xname;
268         if_local =      (p->if_flags & IFF_LOOPBACK) == 0 ? 0 : 1;
269         if_addr =       (uintptr_t)p;
270 };
271
272 #pragma D binding "1.5" translator
273 translator ipv4info_t < struct ip *p > {
274         ipv4_ver =      p == NULL ? 0 : p->ip_v;
275         ipv4_ihl =      p == NULL ? 0 : p->ip_hl;
276         ipv4_tos =      p == NULL ? 0 : p->ip_tos;
277         ipv4_length =   p == NULL ? 0 : ntohs(p->ip_len);
278         ipv4_ident =    p == NULL ? 0 : ntohs(p->ip_id);
279         ipv4_flags =    p == NULL ? 0 : (ntohs(p->ip_off) & 0xe000) >> 8;
280         ipv4_offset =   p == NULL ? 0 : ntohs(p->ip_off) & 0x1fff;
281         ipv4_ttl =      p == NULL ? 0 : p->ip_ttl;
282         ipv4_protocol = p == NULL ? 0 : p->ip_p;
283         ipv4_protostr = p == NULL ? "<null>" : protocols[p->ip_p];
284         ipv4_checksum = p == NULL ? 0 : ntohs(p->ip_sum);
285         ipv4_src =      p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_src.s_addr);
286         ipv4_dst =      p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_dst.s_addr);
287         ipv4_saddr =    p == NULL ? 0 : inet_ntoa(&p->ip_src.s_addr);
288         ipv4_daddr =    p == NULL ? 0 : inet_ntoa(&p->ip_dst.s_addr);
289         ipv4_hdr =      (ipha_t *)p;
290 };
291
292 #pragma D binding "1.5" translator
293 translator ipv6info_t < struct ip6_hdr *p > {
294         ipv6_ver =      p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0xf0000000) >> 28;
295         ipv6_tclass =   p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x0ff00000) >> 20;
296         ipv6_flow =     p == NULL ? 0 : ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x000fffff;
297         ipv6_plen =     p == NULL ? 0 : ntohs(p->ip6_ctlun.ip6_un1.ip6_un1_plen);
298         ipv6_nexthdr =  p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_nxt;
299         ipv6_nextstr =  p == NULL ? "<null>" : protocols[p->ip6_ctlun.ip6_un1.ip6_un1_nxt];
300         ipv6_hlim =     p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_hlim;
301         ipv6_src =      p == NULL ? 0 : (in6_addr_t *)&p->ip6_src;
302         ipv6_dst =      p == NULL ? 0 : (in6_addr_t *)&p->ip6_dst;
303         ipv6_saddr =    p == NULL ? 0 : inet_ntoa6(&p->ip6_src);
304         ipv6_daddr =    p == NULL ? 0 : inet_ntoa6(&p->ip6_dst);
305         ipv6_hdr =      p;
306 };