Fix: scsi: sd: Atomic write support added in 6.11-rc1
[lttng-modules.git] / include / instrumentation / events / net.h
... / ...
CommitLineData
1// SPDX-FileCopyrightText: 2012 Paul Woegerer <paul_woegerer@mentor.com>
2//
3// SPDX-License-Identifier: GPL-2.0-only
4
5#undef TRACE_SYSTEM
6#define TRACE_SYSTEM net
7
8#if !defined(LTTNG_TRACE_NET_H) || defined(TRACE_HEADER_MULTI_READ)
9#define LTTNG_TRACE_NET_H
10
11#include <lttng/tracepoint-event.h>
12#include <linux/skbuff.h>
13#include <linux/netdevice.h>
14#include <linux/ip.h>
15#include <linux/ipv6.h>
16#include <linux/tcp.h>
17#include <linux/udp.h>
18#include <linux/icmp.h>
19#include <lttng/kernel-version.h>
20#include <lttng/endian.h>
21#include <net/sock.h>
22
23#ifndef ONCE_LTTNG_NET_H
24#define ONCE_LTTNG_NET_H
25
26static inline unsigned char __has_network_hdr(struct sk_buff *skb)
27{
28 /*
29 * If the header is not set yet, the network header will point
30 * to the head.
31 */
32 return skb_network_header(skb) != skb->head;
33}
34
35enum transport_header_types {
36 TH_NONE = 0,
37 TH_TCP = 1,
38 TH_UDP = 2,
39 TH_ICMP = 3,
40};
41
42static inline enum transport_header_types __get_transport_header_type_ip(struct sk_buff *skb)
43{
44 switch (ip_hdr(skb)->protocol) {
45 case IPPROTO_TCP:
46 return TH_TCP;
47 case IPPROTO_UDP:
48 return TH_UDP;
49 case IPPROTO_ICMP:
50 return TH_ICMP;
51 }
52 return TH_NONE;
53}
54
55static inline enum transport_header_types __get_transport_header_type_ipv6(struct sk_buff *skb)
56{
57 switch (ipv6_hdr(skb)->nexthdr) {
58 case IPPROTO_TCP:
59 return TH_TCP;
60 case IPPROTO_UDP:
61 return TH_UDP;
62 case IPPROTO_ICMP:
63 return TH_ICMP;
64 }
65 return TH_NONE;
66}
67
68static inline enum transport_header_types __get_transport_header_type(struct sk_buff *skb)
69{
70 if (__has_network_hdr(skb)) {
71 /*
72 * When both transport and network headers are set,
73 * transport header is greater than network header,
74 * otherwise it points to head.
75 */
76 if (skb->transport_header > skb->network_header) {
77 /*
78 * Get the transport protocol from the network
79 * header's data. This method works both for
80 * sent and received packets.
81 */
82 if (skb->protocol == htons(ETH_P_IP)) {
83 return __get_transport_header_type_ip(skb);
84 } else if(skb->protocol == htons(ETH_P_IPV6)) {
85 return __get_transport_header_type_ipv6(skb);
86 }
87 }
88 /* Fallthrough for other cases where header is not recognized. */
89 }
90 return TH_NONE;
91}
92
93enum network_header_types {
94 NH_NONE,
95 NH_IPV4,
96 NH_IPV6,
97};
98
99static inline unsigned char __get_network_header_type(struct sk_buff *skb)
100{
101 if (__has_network_hdr(skb)) {
102 if (skb->protocol == htons(ETH_P_IPV6))
103 return NH_IPV6;
104 else if (skb->protocol == htons(ETH_P_IP))
105 return NH_IPV4;
106 /* Fallthrough for other header types. */
107 }
108 return NH_NONE;
109}
110
111#endif
112
113#ifdef LTTNG_CREATE_FIELD_METADATA
114
115static const struct lttng_kernel_event_field *emptyfields[] = {
116};
117
118/* Structures for transport headers. */
119
120static const struct lttng_kernel_event_field *tcpfields[] = {
121 [0] = lttng_kernel_static_event_field("source_port",
122 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
123 false, false),
124 [1] = lttng_kernel_static_event_field("dest_port",
125 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
126 false, false),
127 [2] = lttng_kernel_static_event_field("seq",
128 lttng_kernel_static_type_integer_from_type(uint32_t, __BIG_ENDIAN, 10),
129 false, false),
130 [3] = lttng_kernel_static_event_field("ack_seq",
131 lttng_kernel_static_type_integer_from_type(uint32_t, __BIG_ENDIAN, 10),
132 false, false),
133 [4] = lttng_kernel_static_event_field("data_offset",
134 lttng_kernel_static_type_integer(4, 4, 0, __BIG_ENDIAN, 10),
135 false, false),
136 [5] = lttng_kernel_static_event_field("reserved",
137 lttng_kernel_static_type_integer(3, 1, 0, __BIG_ENDIAN, 10),
138 false, false),
139 [6] = lttng_kernel_static_event_field("flags",
140 lttng_kernel_static_type_integer(9, 1, 0, __BIG_ENDIAN, 16),
141 false, false),
142 [7] = lttng_kernel_static_event_field("window_size",
143 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
144 false, false),
145 [8] = lttng_kernel_static_event_field("checksum",
146 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 16),
147 false, false),
148 [9] = lttng_kernel_static_event_field("urg_ptr",
149 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
150 false, false),
151};
152
153static const struct lttng_kernel_event_field *udpfields[] = {
154 [0] = lttng_kernel_static_event_field("source_port",
155 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
156 false, false),
157 [1] = lttng_kernel_static_event_field("dest_port",
158 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
159 false, false),
160 [2] = lttng_kernel_static_event_field("len",
161 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
162 false, false),
163 [3] = lttng_kernel_static_event_field("check",
164 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
165 false, false),
166};
167
168static const struct lttng_kernel_event_field *icmpfields[] = {
169 [0] = lttng_kernel_static_event_field("type",
170 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10),
171 false, false),
172 [1] = lttng_kernel_static_event_field("code",
173 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10),
174 false, false),
175 [2] = lttng_kernel_static_event_field("checksum",
176 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
177 false, false),
178 [3] = lttng_kernel_static_event_field("gateway",
179 lttng_kernel_static_type_integer_from_type(uint32_t, __BIG_ENDIAN, 10),
180 false, false),
181};
182
183static const struct lttng_kernel_event_field *transport_fields[] = {
184 [0] = lttng_kernel_static_event_field("unknown",
185 lttng_kernel_static_type_struct(ARRAY_SIZE(emptyfields), emptyfields, 0),
186 false, true),
187 [1] = lttng_kernel_static_event_field("tcp",
188 lttng_kernel_static_type_struct(ARRAY_SIZE(tcpfields), tcpfields, 0),
189 false, true),
190 [2] = lttng_kernel_static_event_field("udp",
191 lttng_kernel_static_type_struct(ARRAY_SIZE(udpfields), udpfields, 0),
192 false, true),
193 [3] = lttng_kernel_static_event_field("icmp",
194 lttng_kernel_static_type_struct(ARRAY_SIZE(icmpfields), icmpfields, 0),
195 false, true),
196};
197
198#endif /* LTTNG_CREATE_FIELD_METADATA */
199
200LTTNG_TRACEPOINT_ENUM(proto_transport_header_type,
201 TP_ENUM_VALUES(
202 ctf_enum_range("_unknown", 0, IPPROTO_ICMP - 1)
203 ctf_enum_value("_icmp", IPPROTO_ICMP)
204 ctf_enum_range("_unknown", IPPROTO_ICMP + 1, IPPROTO_TCP - 1)
205 ctf_enum_value("_tcp", IPPROTO_TCP)
206 ctf_enum_range("_unknown", IPPROTO_TCP + 1, IPPROTO_UDP - 1)
207 ctf_enum_value("_udp", IPPROTO_UDP)
208 ctf_enum_range("_unknown", IPPROTO_UDP + 1, 255)
209 )
210)
211
212LTTNG_TRACEPOINT_ENUM(transport_header_type,
213 TP_ENUM_VALUES(
214 ctf_enum_value("_unknown", TH_NONE)
215 ctf_enum_value("_tcp", TH_TCP)
216 ctf_enum_value("_udp", TH_UDP)
217 ctf_enum_value("_icmp", TH_ICMP)
218 )
219)
220
221#ifdef LTTNG_CREATE_FIELD_METADATA
222
223/* Structures for network headers. */
224
225static const struct lttng_kernel_event_field *ipv4fields[] = {
226 [0] = lttng_kernel_static_event_field("version",
227 lttng_kernel_static_type_integer(4, 4, 0, __BIG_ENDIAN, 10),
228 false, false),
229 [1] = lttng_kernel_static_event_field("ihl",
230 lttng_kernel_static_type_integer(4, 4, 0, __BIG_ENDIAN, 10),
231 false, false),
232 [2] = lttng_kernel_static_event_field("tos",
233 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10),
234 false, false),
235 [3] = lttng_kernel_static_event_field("tot_len",
236 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
237 false, false),
238 [4] = lttng_kernel_static_event_field("id",
239 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 16),
240 false, false),
241 [5] = lttng_kernel_static_event_field("frag_off",
242 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
243 false, false),
244 [6] = lttng_kernel_static_event_field("ttl",
245 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10),
246 false, false),
247 [7] = lttng_kernel_static_event_field("protocol",
248 lttng_kernel_static_type_enum(&__enum_proto_transport_header_type,
249 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10)),
250 false, false),
251 [8] = lttng_kernel_static_event_field("checksum",
252 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 16),
253 false, false),
254 [9] = lttng_kernel_static_event_field("saddr",
255 lttng_kernel_static_type_array(4,
256 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10),
257 lttng_alignof(uint8_t), none),
258 false, false),
259 [10] = lttng_kernel_static_event_field("daddr",
260 lttng_kernel_static_type_array(4,
261 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10),
262 lttng_alignof(uint8_t), none),
263 false, false),
264 [11] = lttng_kernel_static_event_field("transport_header_type",
265 lttng_kernel_static_type_enum(&__enum_transport_header_type,
266 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 10)),
267 false, false),
268 [12] = lttng_kernel_static_event_field("transport_header",
269 lttng_kernel_static_type_variant(ARRAY_SIZE(transport_fields), transport_fields,
270 NULL, 0), /* Previous field as tag. */
271 false, false),
272};
273
274static const struct lttng_kernel_event_field *ipv6fields[] = {
275 [0] = lttng_kernel_static_event_field("version",
276 lttng_kernel_static_type_integer(4, 4, 0, __BIG_ENDIAN, 10),
277 false, false),
278 [1] = lttng_kernel_static_event_field("prio",
279 lttng_kernel_static_type_integer(4, 4, 0, __BIG_ENDIAN, 10),
280 false, false),
281 [2] = lttng_kernel_static_event_field("flow_lbl",
282 lttng_kernel_static_type_array(3, lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 16), lttng_alignof(uint8_t), none),
283 false, false),
284 [3] = lttng_kernel_static_event_field("payload_len",
285 lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 10),
286 false, false),
287 [4] = lttng_kernel_static_event_field("nexthdr",
288 lttng_kernel_static_type_enum(&__enum_proto_transport_header_type,
289 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10)),
290 false, false),
291 [5] = lttng_kernel_static_event_field("hop_limit",
292 lttng_kernel_static_type_integer_from_type(uint8_t, __BIG_ENDIAN, 10),
293 false, false),
294 [6] = lttng_kernel_static_event_field("saddr",
295 lttng_kernel_static_type_array(8, lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 16), lttng_alignof(uint16_t), none),
296 false, false),
297 [7] = lttng_kernel_static_event_field("daddr",
298 lttng_kernel_static_type_array(8, lttng_kernel_static_type_integer_from_type(uint16_t, __BIG_ENDIAN, 16), lttng_alignof(uint16_t), none),
299 false, false),
300 [8] = lttng_kernel_static_event_field("transport_header_type",
301 lttng_kernel_static_type_enum(&__enum_transport_header_type,
302 lttng_kernel_static_type_integer_from_type(uint8_t, __BYTE_ORDER, 10)),
303 false, false),
304 [9] = lttng_kernel_static_event_field("transport_header",
305 lttng_kernel_static_type_variant(ARRAY_SIZE(transport_fields),
306 transport_fields, NULL, 0), /* Previous field as tag. */
307 false, false),
308};
309
310static const struct lttng_kernel_event_field *network_fields[] = {
311 [0] = lttng_kernel_static_event_field("unknown",
312 lttng_kernel_static_type_struct(0, emptyfields, 0),
313 false, false),
314 [1] = lttng_kernel_static_event_field("ipv4",
315 lttng_kernel_static_type_struct(ARRAY_SIZE(ipv4fields), ipv4fields, 0),
316 false, false),
317 [2] = lttng_kernel_static_event_field("ipv6",
318 lttng_kernel_static_type_struct(ARRAY_SIZE(ipv6fields), ipv6fields, 0),
319 false, false),
320};
321
322#endif /* LTTNG_CREATE_FIELD_METADATA */
323
324LTTNG_TRACEPOINT_ENUM(net_network_header,
325 TP_ENUM_VALUES(
326 ctf_enum_value("_unknown", NH_NONE)
327 ctf_enum_value("_ipv4", NH_IPV4)
328 ctf_enum_value("_ipv6", NH_IPV6)
329 )
330)
331
332LTTNG_TRACEPOINT_EVENT(net_dev_xmit,
333
334 TP_PROTO(struct sk_buff *skb,
335 int rc,
336 struct net_device *dev,
337 unsigned int skb_len),
338
339 TP_ARGS(skb, rc, dev, skb_len),
340
341 TP_FIELDS(
342 ctf_integer_hex(void *, skbaddr, skb)
343 ctf_integer(int, rc, rc)
344 ctf_integer(unsigned int, len, skb_len)
345 ctf_string(name, dev->name)
346 )
347)
348
349LTTNG_TRACEPOINT_EVENT_CLASS(net_dev_template,
350
351 TP_PROTO(struct sk_buff *skb),
352
353 TP_ARGS(skb),
354
355 TP_FIELDS(
356 ctf_integer_hex(void *, skbaddr, skb)
357 ctf_integer(unsigned int, len, skb->len)
358 ctf_string(name, skb->dev->name)
359 ctf_enum(net_network_header, unsigned char,
360 network_header_type, __get_network_header_type(skb))
361 ctf_custom_field(
362 ctf_custom_type(
363 lttng_kernel_static_type_variant(ARRAY_SIZE(network_fields),
364 network_fields, NULL, 0) /* Previous field as tag. */
365 ),
366 network_header,
367 ctf_custom_code(
368 bool has_network_header = false;
369
370 /* Copy the network header. */
371 switch (__get_network_header_type(skb)) {
372 case NH_IPV4: {
373 ctf_align(uint16_t)
374 ctf_array_type(uint8_t, ip_hdr(skb),
375 sizeof(struct iphdr))
376 has_network_header = true;
377 break;
378 }
379 case NH_IPV6: {
380 ctf_align(uint16_t)
381 ctf_array_type(uint8_t, ipv6_hdr(skb),
382 sizeof(struct ipv6hdr))
383 has_network_header = true;
384 break;
385 }
386 default:
387 /*
388 * For any other network header
389 * type, there is nothing to do.
390 */
391 break;
392 }
393
394 if (has_network_header) {
395 enum transport_header_types th_type =
396 __get_transport_header_type(skb);
397
398 /* Transport header type field. */
399 ctf_integer_type(unsigned char, th_type)
400
401 /* Copy the transport header. */
402 switch (th_type) {
403 case TH_TCP: {
404 ctf_align(uint32_t)
405 ctf_array_type(uint8_t, tcp_hdr(skb),
406 sizeof(struct tcphdr))
407 break;
408 }
409 case TH_UDP: {
410 ctf_align(uint32_t)
411 ctf_array_type(uint8_t, udp_hdr(skb),
412 sizeof(struct udphdr))
413 break;
414 }
415 case TH_ICMP: {
416 ctf_align(uint32_t)
417 ctf_array_type(uint8_t, icmp_hdr(skb),
418 sizeof(struct icmphdr))
419 break;
420 }
421 default:
422 /*
423 * For any other transport header type,
424 * there is nothing to do.
425 */
426 break;
427 }
428 }
429 )
430 )
431 )
432)
433
434LTTNG_TRACEPOINT_EVENT_INSTANCE(net_dev_template, net_dev_queue,
435
436 TP_PROTO(struct sk_buff *skb),
437
438 TP_ARGS(skb)
439)
440
441LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_template,
442
443 netif_receive_skb,
444
445 net_if_receive_skb,
446
447 TP_PROTO(struct sk_buff *skb),
448
449 TP_ARGS(skb)
450)
451
452LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_template,
453
454 netif_rx,
455
456 net_if_rx,
457
458 TP_PROTO(struct sk_buff *skb),
459
460 TP_ARGS(skb)
461)
462
463/* Trace events for the receive entry points */
464LTTNG_TRACEPOINT_EVENT_CLASS(net_dev_receive_entry_template,
465
466 TP_PROTO(const struct sk_buff *skb),
467
468 TP_ARGS(skb),
469
470 TP_FIELDS(
471 ctf_integer_hex(const void *, skbaddr, skb)
472 )
473)
474
475LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_entry_template,
476
477 napi_gro_frags_entry,
478
479 net_napi_gro_frags_entry,
480
481 TP_PROTO(const struct sk_buff *skb),
482
483 TP_ARGS(skb)
484)
485
486LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_entry_template,
487
488 napi_gro_receive_entry,
489
490 net_napi_gro_receive_entry,
491
492 TP_PROTO(const struct sk_buff *skb),
493
494 TP_ARGS(skb)
495)
496
497LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_entry_template,
498
499 netif_receive_skb_entry,
500
501 net_if_receive_skb_entry,
502
503 TP_PROTO(const struct sk_buff *skb),
504
505 TP_ARGS(skb)
506)
507
508LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_entry_template,
509
510 netif_rx_entry,
511
512 net_if_rx_entry,
513
514 TP_PROTO(const struct sk_buff *skb),
515
516 TP_ARGS(skb)
517)
518
519LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_entry_template,
520
521 netif_rx_ni_entry,
522
523 net_if_rx_ni_entry,
524
525 TP_PROTO(const struct sk_buff *skb),
526
527 TP_ARGS(skb)
528)
529
530#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,19,0))
531
532LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_entry_template,
533
534 netif_receive_skb_list_entry,
535
536 net_if_receive_skb_list_entry,
537
538 TP_PROTO(const struct sk_buff *skb),
539
540 TP_ARGS(skb)
541)
542
543#endif /* kernel > 4.19 */
544
545#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,0,0))
546
547/* Trace events for the receive exit points */
548LTTNG_TRACEPOINT_EVENT_CLASS(net_dev_receive_exit_template,
549
550 TP_PROTO(int ret),
551
552 TP_ARGS(ret),
553
554 TP_FIELDS(
555 ctf_integer(int, ret, ret)
556 )
557)
558
559LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_exit_template,
560
561 napi_gro_frags_exit,
562
563 net_napi_gro_frags_exit,
564
565 TP_PROTO(int ret),
566
567 TP_ARGS(ret)
568)
569
570LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_exit_template,
571
572 napi_gro_receive_exit,
573
574 net_napi_gro_receive_exit,
575
576 TP_PROTO(int ret),
577
578 TP_ARGS(ret)
579)
580
581LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_exit_template,
582
583 netif_receive_skb_exit,
584
585 net_if_receive_skb_exit,
586
587 TP_PROTO(int ret),
588
589 TP_ARGS(ret)
590)
591
592LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_exit_template,
593
594 netif_rx_exit,
595
596 net_if_rx_exit,
597
598 TP_PROTO(int ret),
599
600 TP_ARGS(ret)
601)
602
603LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_exit_template,
604
605 netif_rx_ni_exit,
606
607 net_if_rx_ni_exit,
608
609 TP_PROTO(int ret),
610
611 TP_ARGS(ret)
612)
613
614LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(net_dev_receive_exit_template,
615
616 netif_receive_skb_list_exit,
617
618 net_if_receive_skb_list_exit,
619
620 TP_PROTO(int ret),
621
622 TP_ARGS(ret)
623)
624
625#endif /* kernel > 5.0.0 */
626
627#endif /* LTTNG_TRACE_NET_H */
628
629/* This part must be outside protection */
630#include <lttng/define_trace.h>
This page took 0.028275 seconds and 5 git commands to generate.