]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - cddl/lib/libdtrace/ip.d
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.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 provider ip
29
30 /*
31  * pktinfo is where packet ID info can be made available for deeper
32  * analysis if packet IDs become supported by the kernel in the future.
33  * The pkt_addr member is currently always NULL.
34  */
35 typedef struct pktinfo {
36         uintptr_t pkt_addr;
37 } pktinfo_t;
38
39 /*
40  * csinfo is where connection state info is made available.
41  */
42 typedef uint32_t zoneid_t;
43 typedef struct csinfo {
44         uintptr_t cs_addr;
45         uint64_t cs_cid;
46         pid_t cs_pid;
47         zoneid_t cs_zoneid;
48 } csinfo_t;
49
50 /*
51  * ipinfo contains common IP info for both IPv4 and IPv6.
52  */
53 typedef struct ipinfo {
54         uint8_t ip_ver;                 /* IP version (4, 6) */
55         uint32_t ip_plength;            /* payload length */
56         string ip_saddr;                /* source address */
57         string ip_daddr;                /* destination address */
58 } ipinfo_t;
59
60 /*
61  * ifinfo contains network interface info.
62  */
63 typedef struct ifinfo {
64         string if_name;                 /* interface name */
65         int8_t if_local;                /* is delivered locally */
66         /*netstackid_t if_ipstack;*/    /* ipstack ID */
67         uintptr_t if_addr;              /* pointer to raw ill_t */
68 } ifinfo_t;
69
70 typedef uint32_t ipaddr_t;
71 typedef struct {
72         uint8_t         ipha_version_and_hdr_length;
73         uint8_t         ipha_type_of_service;
74         uint16_t        ipha_length;
75         uint16_t        ipha_ident;
76         uint16_t        ipha_fragment_offset_and_flags;
77         uint8_t         ipha_ttl;
78         uint8_t         ipha_protocol;
79         uint16_t        ipha_hdr_checksum;
80         ipaddr_t        ipha_src;
81         ipaddr_t        ipha_dst;
82 } ipha_t;
83
84 /*
85  * ipv4info is a translated version of the IPv4 header (with raw pointer).
86  * These values are NULL if the packet is not IPv4.
87  */
88 typedef struct ipv4info {
89         uint8_t ipv4_ver;               /* IP version (4) */
90         uint8_t ipv4_ihl;               /* header length, bytes */
91         uint8_t ipv4_tos;               /* type of service field */
92         uint16_t ipv4_length;           /* length (header + payload) */
93         uint16_t ipv4_ident;            /* identification */
94         uint8_t ipv4_flags;             /* IP flags */
95         uint16_t ipv4_offset;           /* fragment offset */
96         uint8_t ipv4_ttl;               /* time to live */
97         uint8_t ipv4_protocol;          /* next level protocol */
98         string ipv4_protostr;           /* next level protocol, as a string */
99         uint16_t ipv4_checksum;         /* header checksum */
100         ipaddr_t ipv4_src;              /* source address */
101         ipaddr_t ipv4_dst;              /* destination address */
102         string ipv4_saddr;              /* source address, string */
103         string ipv4_daddr;              /* destination address, string */
104         ipha_t *ipv4_hdr;               /* pointer to raw header */
105 } ipv4info_t;
106
107 /*
108  * ipv6info is a translated version of the IPv6 header (with raw pointer).
109  * These values are NULL if the packet is not IPv6.
110  */
111 typedef struct in6_addr in6_addr_t;
112 typedef struct ip6_hdr ip6_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         ip6_t *ipv6_hdr;                /* pointer to raw header */
126 } ipv6info_t;
127
128 #pragma D binding "1.0" IPPROTO_IP
129 inline short IPPROTO_IP =       0;
130 #pragma D binding "1.0" IPPROTO_ICMP
131 inline short IPPROTO_ICMP =     1;
132 #pragma D binding "1.0" IPPROTO_IGMP
133 inline short IPPROTO_IGMP =     2;
134 #pragma D binding "1.0" IPPROTO_IPV4
135 inline short IPPROTO_IPV4 =     4;
136 #pragma D binding "1.0" IPPROTO_TCP
137 inline short IPPROTO_TCP =      6;
138 #pragma D binding "1.0" IPPROTO_UDP
139 inline short IPPROTO_UDP =      17;
140 #pragma D binding "1.0" IPPROTO_IPV6
141 inline short IPPROTO_IPV6 =     41;
142 #pragma D binding "1.0" IPPROTO_ROUTING
143 inline short IPPROTO_ROUTING =  43;
144 #pragma D binding "1.0" IPPROTO_FRAGMENT
145 inline short IPPROTO_FRAGMENT = 44;
146 #pragma D binding "1.0" IPPROTO_RSVP
147 inline short IPPROTO_RSVP =     46;
148 #pragma D binding "1.0" IPPROTO_GRE
149 inline short IPPROTO_GRE =      47;
150 #pragma D binding "1.0" IPPROTO_ESP
151 inline short IPPROTO_ESP =      50;
152 #pragma D binding "1.0" IPPROTO_AH
153 inline short IPPROTO_AH =       51;
154 #pragma D binding "1.0" IPPROTO_MOBILE
155 inline short IPPROTO_MOBILE =   55;
156 #pragma D binding "1.0" IPPROTO_ICMPV6
157 inline short IPPROTO_ICMPV6 =   58;
158 #pragma D binding "1.0" IPPROTO_DSTOPTS
159 inline short IPPROTO_DSTOPTS =  60;
160 #pragma D binding "1.0" IPPROTO_ETHERIP
161 inline short IPPROTO_ETHERIP =  97;
162 #pragma D binding "1.0" IPPROTO_PIM
163 inline short IPPROTO_PIM =      103;
164 #pragma D binding "1.0" IPPROTO_IPCOMP
165 inline short IPPROTO_IPCOMP =   108;
166 #pragma D binding "1.0" IPPROTO_SCTP
167 inline short IPPROTO_SCTP =     132;
168 #pragma D binding "1.0" IPPROTO_RAW
169 inline short IPPROTO_RAW =      255;
170
171 inline uint8_t INP_IPV4 = 0x01;
172 inline uint8_t INP_IPV6 = 0x02;
173
174 #pragma D binding "1.0" protocols
175 inline string protocols[int proto] =
176         proto == IPPROTO_IP ? "IP" :
177         proto == IPPROTO_ICMP ? "ICMP" :
178         proto == IPPROTO_IGMP ? "IGMP" :
179         proto == IPPROTO_IPV4 ? "IPV4" :
180         proto == IPPROTO_TCP ? "TCP" :
181         proto == IPPROTO_UDP ? "UDP" :
182         proto == IPPROTO_IPV6 ? "IPV6" :
183         proto == IPPROTO_ROUTING ? "ROUTING" :
184         proto == IPPROTO_FRAGMENT ? "FRAGMENT" :
185         proto == IPPROTO_RSVP ? "RSVP" :
186         proto == IPPROTO_GRE ? "GRE" :
187         proto == IPPROTO_ESP ? "ESP" :
188         proto == IPPROTO_AH ? "AH" :
189         proto == IPPROTO_MOBILE ? "MOBILE" :
190         proto == IPPROTO_ICMPV6 ? "ICMPV6" :
191         proto == IPPROTO_DSTOPTS ? "DSTOPTS" :
192         proto == IPPROTO_ETHERIP ? "ETHERIP" :
193         proto == IPPROTO_PIM ? "PIM" :
194         proto == IPPROTO_IPCOMP ? "IPCOMP" :
195         proto == IPPROTO_SCTP ? "SCTP" :
196         proto == IPPROTO_RAW ? "RAW" :
197         "<unknown>";
198
199 /*
200  * This field is always NULL according to the current definition of the ip
201  * probes.
202  */
203 #pragma D binding "1.0" translator
204 translator pktinfo_t < void *p > {
205         pkt_addr =      NULL;
206 };
207
208 #pragma D binding "1.0" translator
209 translator csinfo_t < void *p > {
210         cs_addr =       NULL;
211         cs_cid =        (uint64_t)p;
212         cs_pid =        0;
213         cs_zoneid =     0;
214 };
215
216 #pragma D binding "1.0" translator
217 translator csinfo_t < struct inpcb *p > {
218         cs_addr =       NULL;
219         cs_cid =        (uint64_t)p;
220         cs_pid =        0;      /* XXX */
221         cs_zoneid =     0;
222 };
223
224 #pragma D binding "1.0" translator
225 translator ipinfo_t < uint8_t *p > {
226         ip_ver =        p == NULL ? 0 : ((struct ip *)p)->ip_v;
227         ip_plength =    p == NULL ? 0 :
228             ((struct ip *)p)->ip_v == 4 ?
229             ntohs(((struct ip *)p)->ip_len) - (((struct ip *)p)->ip_hl << 2):
230             ntohs(((struct ip6_hdr *)p)->ip6_ctlun.ip6_un1.ip6_un1_plen);
231         ip_saddr =      p == NULL ? 0 :
232             ((struct ip *)p)->ip_v == 4 ?
233             inet_ntoa(&((struct ip *)p)->ip_src.s_addr) :
234             inet_ntoa6(&((struct ip6_hdr *)p)->ip6_src);
235         ip_daddr =      p == NULL ? 0 :
236             ((struct ip *)p)->ip_v == 4 ?
237             inet_ntoa(&((struct ip *)p)->ip_dst.s_addr) :
238             inet_ntoa6(&((struct ip6_hdr *)p)->ip6_dst);
239 };
240
241 #pragma D binding "1.0" IFF_LOOPBACK
242 inline int IFF_LOOPBACK =       0x8;
243
244 #pragma D binding "1.0" translator
245 translator ifinfo_t < struct ifnet *p > {
246         if_name =       p->if_xname;
247         if_local =      (p->if_flags & IFF_LOOPBACK) == 0 ? 0 : 1;
248         if_addr =       (uintptr_t)p;
249 };
250
251 #pragma D binding "1.0" translator
252 translator ipv4info_t < struct ip *p > {
253         ipv4_ver =      p == NULL ? 0 : p->ip_v;
254         ipv4_ihl =      p == NULL ? 0 : p->ip_hl;
255         ipv4_tos =      p == NULL ? 0 : p->ip_tos;
256         ipv4_length =   p == NULL ? 0 : ntohs(p->ip_len);
257         ipv4_ident =    p == NULL ? 0 : ntohs(p->ip_id);
258         ipv4_flags =    p == NULL ? 0 : (p->ip_off & 0xe000);
259         ipv4_offset =   p == NULL ? 0 : p->ip_off;
260         ipv4_ttl =      p == NULL ? 0 : p->ip_ttl;
261         ipv4_protocol = p == NULL ? 0 : p->ip_p;
262         ipv4_protostr = p == NULL ? "<null>" : protocols[p->ip_p];
263         ipv4_checksum = p == NULL ? 0 : ntohs(p->ip_sum);
264         ipv4_src =      p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_src.s_addr);
265         ipv4_dst =      p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_dst.s_addr);
266         ipv4_saddr =    p == NULL ? 0 : inet_ntoa(&p->ip_src.s_addr);
267         ipv4_daddr =    p == NULL ? 0 : inet_ntoa(&p->ip_dst.s_addr);
268         ipv4_hdr =      (ipha_t *)p;
269 };
270
271 #pragma D binding "1.0" translator
272 translator ipv6info_t < struct ip6_hdr *p > {
273         ipv6_ver =      p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0xf0000000) >> 28;
274         ipv6_tclass =   p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x0ff00000) >> 20;
275         ipv6_flow =     p == NULL ? 0 : ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x000fffff;
276         ipv6_plen =     p == NULL ? 0 : ntohs(p->ip6_ctlun.ip6_un1.ip6_un1_plen);
277         ipv6_nexthdr =  p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_nxt;
278         ipv6_nextstr =  p == NULL ? "<null>" : protocols[p->ip6_ctlun.ip6_un1.ip6_un1_nxt];
279         ipv6_hlim =     p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_hlim;
280         ipv6_src =      p == NULL ? 0 : (in6_addr_t *)&p->ip6_src;
281         ipv6_dst =      p == NULL ? 0 : (in6_addr_t *)&p->ip6_dst;
282         ipv6_saddr =    p == NULL ? 0 : inet_ntoa6(&p->ip6_src);
283         ipv6_daddr =    p == NULL ? 0 : inet_ntoa6(&p->ip6_dst);
284         ipv6_hdr =      (ip6_t *)p;
285 };