1c4ab7b56SAaron Conole /* SPDX-License-Identifier: GPL-2.0 */
2c4ab7b56SAaron Conole #undef TRACE_SYSTEM
3c4ab7b56SAaron Conole #define TRACE_SYSTEM openvswitch
4c4ab7b56SAaron Conole 
5c4ab7b56SAaron Conole #if !defined(_TRACE_OPENVSWITCH_H) || defined(TRACE_HEADER_MULTI_READ)
6c4ab7b56SAaron Conole #define _TRACE_OPENVSWITCH_H
7c4ab7b56SAaron Conole 
8c4ab7b56SAaron Conole #include <linux/tracepoint.h>
9c4ab7b56SAaron Conole 
10c4ab7b56SAaron Conole #include "datapath.h"
11c4ab7b56SAaron Conole 
12c4ab7b56SAaron Conole TRACE_EVENT(ovs_do_execute_action,
13c4ab7b56SAaron Conole 
14c4ab7b56SAaron Conole 	TP_PROTO(struct datapath *dp, struct sk_buff *skb,
15c4ab7b56SAaron Conole 		 struct sw_flow_key *key, const struct nlattr *a, int rem),
16c4ab7b56SAaron Conole 
17c4ab7b56SAaron Conole 	TP_ARGS(dp, skb, key, a, rem),
18c4ab7b56SAaron Conole 
19c4ab7b56SAaron Conole 	TP_STRUCT__entry(
20c4ab7b56SAaron Conole 		__field(	void *,		dpaddr			)
21c4ab7b56SAaron Conole 		__string(	dp_name,	ovs_dp_name(dp)		)
22c4ab7b56SAaron Conole 		__string(	dev_name,	skb->dev->name		)
23c4ab7b56SAaron Conole 		__field(	void *,		skbaddr			)
24c4ab7b56SAaron Conole 		__field(	unsigned int,	len			)
25c4ab7b56SAaron Conole 		__field(	unsigned int,	data_len		)
26c4ab7b56SAaron Conole 		__field(	unsigned int,	truesize		)
27c4ab7b56SAaron Conole 		__field(	u8,		nr_frags		)
28c4ab7b56SAaron Conole 		__field(	u16,		gso_size		)
29c4ab7b56SAaron Conole 		__field(	u16,		gso_type		)
30c4ab7b56SAaron Conole 		__field(	u32,		ovs_flow_hash		)
31c4ab7b56SAaron Conole 		__field(	u32,		recirc_id		)
32c4ab7b56SAaron Conole 		__field(	void *,		keyaddr			)
33c4ab7b56SAaron Conole 		__field(	u16,		key_eth_type		)
34c4ab7b56SAaron Conole 		__field(	u8,		key_ct_state		)
35c4ab7b56SAaron Conole 		__field(	u8,		key_ct_orig_proto	)
36c4ab7b56SAaron Conole 		__field(	u16,		key_ct_zone		)
37c4ab7b56SAaron Conole 		__field(	unsigned int,	flow_key_valid		)
38c4ab7b56SAaron Conole 		__field(	u8,		action_type		)
39c4ab7b56SAaron Conole 		__field(	unsigned int,	action_len		)
40c4ab7b56SAaron Conole 		__field(	void *,		action_data		)
41c4ab7b56SAaron Conole 		__field(	u8,		is_last			)
42c4ab7b56SAaron Conole 	),
43c4ab7b56SAaron Conole 
44c4ab7b56SAaron Conole 	TP_fast_assign(
45c4ab7b56SAaron Conole 		__entry->dpaddr = dp;
46*2c92ca84SSteven Rostedt (Google) 		__assign_str(dp_name);
47*2c92ca84SSteven Rostedt (Google) 		__assign_str(dev_name);
48c4ab7b56SAaron Conole 		__entry->skbaddr = skb;
49c4ab7b56SAaron Conole 		__entry->len = skb->len;
50c4ab7b56SAaron Conole 		__entry->data_len = skb->data_len;
51c4ab7b56SAaron Conole 		__entry->truesize = skb->truesize;
52c4ab7b56SAaron Conole 		__entry->nr_frags = skb_shinfo(skb)->nr_frags;
53c4ab7b56SAaron Conole 		__entry->gso_size = skb_shinfo(skb)->gso_size;
54c4ab7b56SAaron Conole 		__entry->gso_type = skb_shinfo(skb)->gso_type;
55c4ab7b56SAaron Conole 		__entry->ovs_flow_hash = key->ovs_flow_hash;
56c4ab7b56SAaron Conole 		__entry->recirc_id = key->recirc_id;
57c4ab7b56SAaron Conole 		__entry->keyaddr = key;
58c4ab7b56SAaron Conole 		__entry->key_eth_type = key->eth.type;
59c4ab7b56SAaron Conole 		__entry->key_ct_state = key->ct_state;
60c4ab7b56SAaron Conole 		__entry->key_ct_orig_proto = key->ct_orig_proto;
61c4ab7b56SAaron Conole 		__entry->key_ct_zone = key->ct_zone;
62c4ab7b56SAaron Conole 		__entry->flow_key_valid = !(key->mac_proto & SW_FLOW_KEY_INVALID);
63c4ab7b56SAaron Conole 		__entry->action_type = nla_type(a);
64c4ab7b56SAaron Conole 		__entry->action_len = nla_len(a);
65c4ab7b56SAaron Conole 		__entry->action_data = nla_data(a);
66c4ab7b56SAaron Conole 		__entry->is_last = nla_is_last(a, rem);
67c4ab7b56SAaron Conole 	),
68c4ab7b56SAaron Conole 
69c4ab7b56SAaron Conole 	TP_printk("dpaddr=%p dp_name=%s dev=%s skbaddr=%p len=%u data_len=%u truesize=%u nr_frags=%d gso_size=%d gso_type=%#x ovs_flow_hash=0x%08x recirc_id=0x%08x keyaddr=%p eth_type=0x%04x ct_state=%02x ct_orig_proto=%02x ct_Zone=%04x flow_key_valid=%d action_type=%u action_len=%u action_data=%p is_last=%d",
70c4ab7b56SAaron Conole 		  __entry->dpaddr, __get_str(dp_name), __get_str(dev_name),
71c4ab7b56SAaron Conole 		  __entry->skbaddr, __entry->len, __entry->data_len,
72c4ab7b56SAaron Conole 		  __entry->truesize, __entry->nr_frags, __entry->gso_size,
73c4ab7b56SAaron Conole 		  __entry->gso_type, __entry->ovs_flow_hash,
74c4ab7b56SAaron Conole 		  __entry->recirc_id, __entry->keyaddr, __entry->key_eth_type,
75c4ab7b56SAaron Conole 		  __entry->key_ct_state, __entry->key_ct_orig_proto,
76c4ab7b56SAaron Conole 		  __entry->key_ct_zone,
77c4ab7b56SAaron Conole 		  __entry->flow_key_valid,
78c4ab7b56SAaron Conole 		  __entry->action_type, __entry->action_len,
79c4ab7b56SAaron Conole 		  __entry->action_data, __entry->is_last)
80c4ab7b56SAaron Conole );
81c4ab7b56SAaron Conole 
82c4ab7b56SAaron Conole TRACE_EVENT(ovs_dp_upcall,
83c4ab7b56SAaron Conole 
84c4ab7b56SAaron Conole 	TP_PROTO(struct datapath *dp, struct sk_buff *skb,
85c4ab7b56SAaron Conole 		 const struct sw_flow_key *key,
86c4ab7b56SAaron Conole 		 const struct dp_upcall_info *upcall_info),
87c4ab7b56SAaron Conole 
88c4ab7b56SAaron Conole 	TP_ARGS(dp, skb, key, upcall_info),
89c4ab7b56SAaron Conole 
90c4ab7b56SAaron Conole 	TP_STRUCT__entry(
91c4ab7b56SAaron Conole 		__field(	void *,		dpaddr			)
92c4ab7b56SAaron Conole 		__string(	dp_name,	ovs_dp_name(dp)		)
93c4ab7b56SAaron Conole 		__string(	dev_name,	skb->dev->name		)
94c4ab7b56SAaron Conole 		__field(	void *,		skbaddr			)
95c4ab7b56SAaron Conole 		__field(	unsigned int,	len			)
96c4ab7b56SAaron Conole 		__field(	unsigned int,	data_len		)
97c4ab7b56SAaron Conole 		__field(	unsigned int,	truesize		)
98c4ab7b56SAaron Conole 		__field(	u8,		nr_frags		)
99c4ab7b56SAaron Conole 		__field(	u16,		gso_size		)
100c4ab7b56SAaron Conole 		__field(	u16,		gso_type		)
101c4ab7b56SAaron Conole 		__field(	u32,		ovs_flow_hash		)
102c4ab7b56SAaron Conole 		__field(	u32,		recirc_id		)
103c4ab7b56SAaron Conole 		__field(	const void *,	keyaddr			)
104c4ab7b56SAaron Conole 		__field(	u16,		key_eth_type		)
105c4ab7b56SAaron Conole 		__field(	u8,		key_ct_state		)
106c4ab7b56SAaron Conole 		__field(	u8,		key_ct_orig_proto	)
107c4ab7b56SAaron Conole 		__field(	u16,		key_ct_zone		)
108c4ab7b56SAaron Conole 		__field(	unsigned int,	flow_key_valid		)
109c4ab7b56SAaron Conole 		__field(	u8,		upcall_cmd		)
110c4ab7b56SAaron Conole 		__field(	u32,		upcall_port		)
111c4ab7b56SAaron Conole 		__field(	u16,		upcall_mru		)
112c4ab7b56SAaron Conole 	),
113c4ab7b56SAaron Conole 
114c4ab7b56SAaron Conole 	TP_fast_assign(
115c4ab7b56SAaron Conole 		__entry->dpaddr = dp;
116*2c92ca84SSteven Rostedt (Google) 		__assign_str(dp_name);
117*2c92ca84SSteven Rostedt (Google) 		__assign_str(dev_name);
118c4ab7b56SAaron Conole 		__entry->skbaddr = skb;
119c4ab7b56SAaron Conole 		__entry->len = skb->len;
120c4ab7b56SAaron Conole 		__entry->data_len = skb->data_len;
121c4ab7b56SAaron Conole 		__entry->truesize = skb->truesize;
122c4ab7b56SAaron Conole 		__entry->nr_frags = skb_shinfo(skb)->nr_frags;
123c4ab7b56SAaron Conole 		__entry->gso_size = skb_shinfo(skb)->gso_size;
124c4ab7b56SAaron Conole 		__entry->gso_type = skb_shinfo(skb)->gso_type;
125c4ab7b56SAaron Conole 		__entry->ovs_flow_hash = key->ovs_flow_hash;
126c4ab7b56SAaron Conole 		__entry->recirc_id = key->recirc_id;
127c4ab7b56SAaron Conole 		__entry->keyaddr = key;
128c4ab7b56SAaron Conole 		__entry->key_eth_type = key->eth.type;
129c4ab7b56SAaron Conole 		__entry->key_ct_state = key->ct_state;
130c4ab7b56SAaron Conole 		__entry->key_ct_orig_proto = key->ct_orig_proto;
131c4ab7b56SAaron Conole 		__entry->key_ct_zone = key->ct_zone;
132c4ab7b56SAaron Conole 		__entry->flow_key_valid =  !(key->mac_proto & SW_FLOW_KEY_INVALID);
133c4ab7b56SAaron Conole 		__entry->upcall_cmd = upcall_info->cmd;
134c4ab7b56SAaron Conole 		__entry->upcall_port = upcall_info->portid;
135c4ab7b56SAaron Conole 		__entry->upcall_mru = upcall_info->mru;
136c4ab7b56SAaron Conole 	),
137c4ab7b56SAaron Conole 
138c4ab7b56SAaron Conole 	TP_printk("dpaddr=%p dp_name=%s dev=%s skbaddr=%p len=%u data_len=%u truesize=%u nr_frags=%d gso_size=%d gso_type=%#x ovs_flow_hash=0x%08x recirc_id=0x%08x keyaddr=%p eth_type=0x%04x ct_state=%02x ct_orig_proto=%02x ct_zone=%04x flow_key_valid=%d upcall_cmd=%u upcall_port=%u upcall_mru=%u",
139c4ab7b56SAaron Conole 		  __entry->dpaddr, __get_str(dp_name), __get_str(dev_name),
140c4ab7b56SAaron Conole 		  __entry->skbaddr, __entry->len, __entry->data_len,
141c4ab7b56SAaron Conole 		  __entry->truesize, __entry->nr_frags, __entry->gso_size,
142c4ab7b56SAaron Conole 		  __entry->gso_type, __entry->ovs_flow_hash,
143c4ab7b56SAaron Conole 		  __entry->recirc_id, __entry->keyaddr, __entry->key_eth_type,
144c4ab7b56SAaron Conole 		  __entry->key_ct_state, __entry->key_ct_orig_proto,
145c4ab7b56SAaron Conole 		  __entry->key_ct_zone,
146c4ab7b56SAaron Conole 		  __entry->flow_key_valid,
147c4ab7b56SAaron Conole 		  __entry->upcall_cmd, __entry->upcall_port,
148c4ab7b56SAaron Conole 		  __entry->upcall_mru)
149c4ab7b56SAaron Conole );
150c4ab7b56SAaron Conole 
151c4ab7b56SAaron Conole #endif /* _TRACE_OPENVSWITCH_H */
152c4ab7b56SAaron Conole 
153c4ab7b56SAaron Conole /* This part must be outside protection */
154c4ab7b56SAaron Conole #undef TRACE_INCLUDE_PATH
155c4ab7b56SAaron Conole #define TRACE_INCLUDE_PATH .
156c4ab7b56SAaron Conole #undef TRACE_INCLUDE_FILE
157c4ab7b56SAaron Conole #define TRACE_INCLUDE_FILE openvswitch_trace
158c4ab7b56SAaron Conole #include <trace/define_trace.h>
159