xref: /freebsd/cddl/lib/libdtrace/ip.d (revision dd41de95a84d979615a2ef11df6850622bf6184e)
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 };
307