162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#undef TRACE_SYSTEM
362306a36Sopenharmony_ci#define TRACE_SYSTEM openvswitch
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#if !defined(_TRACE_OPENVSWITCH_H) || defined(TRACE_HEADER_MULTI_READ)
662306a36Sopenharmony_ci#define _TRACE_OPENVSWITCH_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/tracepoint.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "datapath.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciTRACE_EVENT(ovs_do_execute_action,
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci	TP_PROTO(struct datapath *dp, struct sk_buff *skb,
1562306a36Sopenharmony_ci		 struct sw_flow_key *key, const struct nlattr *a, int rem),
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	TP_ARGS(dp, skb, key, a, rem),
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	TP_STRUCT__entry(
2062306a36Sopenharmony_ci		__field(	void *,		dpaddr			)
2162306a36Sopenharmony_ci		__string(	dp_name,	ovs_dp_name(dp)		)
2262306a36Sopenharmony_ci		__string(	dev_name,	skb->dev->name		)
2362306a36Sopenharmony_ci		__field(	void *,		skbaddr			)
2462306a36Sopenharmony_ci		__field(	unsigned int,	len			)
2562306a36Sopenharmony_ci		__field(	unsigned int,	data_len		)
2662306a36Sopenharmony_ci		__field(	unsigned int,	truesize		)
2762306a36Sopenharmony_ci		__field(	u8,		nr_frags		)
2862306a36Sopenharmony_ci		__field(	u16,		gso_size		)
2962306a36Sopenharmony_ci		__field(	u16,		gso_type		)
3062306a36Sopenharmony_ci		__field(	u32,		ovs_flow_hash		)
3162306a36Sopenharmony_ci		__field(	u32,		recirc_id		)
3262306a36Sopenharmony_ci		__field(	void *,		keyaddr			)
3362306a36Sopenharmony_ci		__field(	u16,		key_eth_type		)
3462306a36Sopenharmony_ci		__field(	u8,		key_ct_state		)
3562306a36Sopenharmony_ci		__field(	u8,		key_ct_orig_proto	)
3662306a36Sopenharmony_ci		__field(	u16,		key_ct_zone		)
3762306a36Sopenharmony_ci		__field(	unsigned int,	flow_key_valid		)
3862306a36Sopenharmony_ci		__field(	u8,		action_type		)
3962306a36Sopenharmony_ci		__field(	unsigned int,	action_len		)
4062306a36Sopenharmony_ci		__field(	void *,		action_data		)
4162306a36Sopenharmony_ci		__field(	u8,		is_last			)
4262306a36Sopenharmony_ci	),
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	TP_fast_assign(
4562306a36Sopenharmony_ci		__entry->dpaddr = dp;
4662306a36Sopenharmony_ci		__assign_str(dp_name, ovs_dp_name(dp));
4762306a36Sopenharmony_ci		__assign_str(dev_name, skb->dev->name);
4862306a36Sopenharmony_ci		__entry->skbaddr = skb;
4962306a36Sopenharmony_ci		__entry->len = skb->len;
5062306a36Sopenharmony_ci		__entry->data_len = skb->data_len;
5162306a36Sopenharmony_ci		__entry->truesize = skb->truesize;
5262306a36Sopenharmony_ci		__entry->nr_frags = skb_shinfo(skb)->nr_frags;
5362306a36Sopenharmony_ci		__entry->gso_size = skb_shinfo(skb)->gso_size;
5462306a36Sopenharmony_ci		__entry->gso_type = skb_shinfo(skb)->gso_type;
5562306a36Sopenharmony_ci		__entry->ovs_flow_hash = key->ovs_flow_hash;
5662306a36Sopenharmony_ci		__entry->recirc_id = key->recirc_id;
5762306a36Sopenharmony_ci		__entry->keyaddr = key;
5862306a36Sopenharmony_ci		__entry->key_eth_type = key->eth.type;
5962306a36Sopenharmony_ci		__entry->key_ct_state = key->ct_state;
6062306a36Sopenharmony_ci		__entry->key_ct_orig_proto = key->ct_orig_proto;
6162306a36Sopenharmony_ci		__entry->key_ct_zone = key->ct_zone;
6262306a36Sopenharmony_ci		__entry->flow_key_valid = !(key->mac_proto & SW_FLOW_KEY_INVALID);
6362306a36Sopenharmony_ci		__entry->action_type = nla_type(a);
6462306a36Sopenharmony_ci		__entry->action_len = nla_len(a);
6562306a36Sopenharmony_ci		__entry->action_data = nla_data(a);
6662306a36Sopenharmony_ci		__entry->is_last = nla_is_last(a, rem);
6762306a36Sopenharmony_ci	),
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	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",
7062306a36Sopenharmony_ci		  __entry->dpaddr, __get_str(dp_name), __get_str(dev_name),
7162306a36Sopenharmony_ci		  __entry->skbaddr, __entry->len, __entry->data_len,
7262306a36Sopenharmony_ci		  __entry->truesize, __entry->nr_frags, __entry->gso_size,
7362306a36Sopenharmony_ci		  __entry->gso_type, __entry->ovs_flow_hash,
7462306a36Sopenharmony_ci		  __entry->recirc_id, __entry->keyaddr, __entry->key_eth_type,
7562306a36Sopenharmony_ci		  __entry->key_ct_state, __entry->key_ct_orig_proto,
7662306a36Sopenharmony_ci		  __entry->key_ct_zone,
7762306a36Sopenharmony_ci		  __entry->flow_key_valid,
7862306a36Sopenharmony_ci		  __entry->action_type, __entry->action_len,
7962306a36Sopenharmony_ci		  __entry->action_data, __entry->is_last)
8062306a36Sopenharmony_ci);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciTRACE_EVENT(ovs_dp_upcall,
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	TP_PROTO(struct datapath *dp, struct sk_buff *skb,
8562306a36Sopenharmony_ci		 const struct sw_flow_key *key,
8662306a36Sopenharmony_ci		 const struct dp_upcall_info *upcall_info),
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	TP_ARGS(dp, skb, key, upcall_info),
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	TP_STRUCT__entry(
9162306a36Sopenharmony_ci		__field(	void *,		dpaddr			)
9262306a36Sopenharmony_ci		__string(	dp_name,	ovs_dp_name(dp)		)
9362306a36Sopenharmony_ci		__string(	dev_name,	skb->dev->name		)
9462306a36Sopenharmony_ci		__field(	void *,		skbaddr			)
9562306a36Sopenharmony_ci		__field(	unsigned int,	len			)
9662306a36Sopenharmony_ci		__field(	unsigned int,	data_len		)
9762306a36Sopenharmony_ci		__field(	unsigned int,	truesize		)
9862306a36Sopenharmony_ci		__field(	u8,		nr_frags		)
9962306a36Sopenharmony_ci		__field(	u16,		gso_size		)
10062306a36Sopenharmony_ci		__field(	u16,		gso_type		)
10162306a36Sopenharmony_ci		__field(	u32,		ovs_flow_hash		)
10262306a36Sopenharmony_ci		__field(	u32,		recirc_id		)
10362306a36Sopenharmony_ci		__field(	const void *,	keyaddr			)
10462306a36Sopenharmony_ci		__field(	u16,		key_eth_type		)
10562306a36Sopenharmony_ci		__field(	u8,		key_ct_state		)
10662306a36Sopenharmony_ci		__field(	u8,		key_ct_orig_proto	)
10762306a36Sopenharmony_ci		__field(	u16,		key_ct_zone		)
10862306a36Sopenharmony_ci		__field(	unsigned int,	flow_key_valid		)
10962306a36Sopenharmony_ci		__field(	u8,		upcall_cmd		)
11062306a36Sopenharmony_ci		__field(	u32,		upcall_port		)
11162306a36Sopenharmony_ci		__field(	u16,		upcall_mru		)
11262306a36Sopenharmony_ci	),
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	TP_fast_assign(
11562306a36Sopenharmony_ci		__entry->dpaddr = dp;
11662306a36Sopenharmony_ci		__assign_str(dp_name, ovs_dp_name(dp));
11762306a36Sopenharmony_ci		__assign_str(dev_name, skb->dev->name);
11862306a36Sopenharmony_ci		__entry->skbaddr = skb;
11962306a36Sopenharmony_ci		__entry->len = skb->len;
12062306a36Sopenharmony_ci		__entry->data_len = skb->data_len;
12162306a36Sopenharmony_ci		__entry->truesize = skb->truesize;
12262306a36Sopenharmony_ci		__entry->nr_frags = skb_shinfo(skb)->nr_frags;
12362306a36Sopenharmony_ci		__entry->gso_size = skb_shinfo(skb)->gso_size;
12462306a36Sopenharmony_ci		__entry->gso_type = skb_shinfo(skb)->gso_type;
12562306a36Sopenharmony_ci		__entry->ovs_flow_hash = key->ovs_flow_hash;
12662306a36Sopenharmony_ci		__entry->recirc_id = key->recirc_id;
12762306a36Sopenharmony_ci		__entry->keyaddr = key;
12862306a36Sopenharmony_ci		__entry->key_eth_type = key->eth.type;
12962306a36Sopenharmony_ci		__entry->key_ct_state = key->ct_state;
13062306a36Sopenharmony_ci		__entry->key_ct_orig_proto = key->ct_orig_proto;
13162306a36Sopenharmony_ci		__entry->key_ct_zone = key->ct_zone;
13262306a36Sopenharmony_ci		__entry->flow_key_valid =  !(key->mac_proto & SW_FLOW_KEY_INVALID);
13362306a36Sopenharmony_ci		__entry->upcall_cmd = upcall_info->cmd;
13462306a36Sopenharmony_ci		__entry->upcall_port = upcall_info->portid;
13562306a36Sopenharmony_ci		__entry->upcall_mru = upcall_info->mru;
13662306a36Sopenharmony_ci	),
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	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",
13962306a36Sopenharmony_ci		  __entry->dpaddr, __get_str(dp_name), __get_str(dev_name),
14062306a36Sopenharmony_ci		  __entry->skbaddr, __entry->len, __entry->data_len,
14162306a36Sopenharmony_ci		  __entry->truesize, __entry->nr_frags, __entry->gso_size,
14262306a36Sopenharmony_ci		  __entry->gso_type, __entry->ovs_flow_hash,
14362306a36Sopenharmony_ci		  __entry->recirc_id, __entry->keyaddr, __entry->key_eth_type,
14462306a36Sopenharmony_ci		  __entry->key_ct_state, __entry->key_ct_orig_proto,
14562306a36Sopenharmony_ci		  __entry->key_ct_zone,
14662306a36Sopenharmony_ci		  __entry->flow_key_valid,
14762306a36Sopenharmony_ci		  __entry->upcall_cmd, __entry->upcall_port,
14862306a36Sopenharmony_ci		  __entry->upcall_mru)
14962306a36Sopenharmony_ci);
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci#endif /* _TRACE_OPENVSWITCH_H */
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci/* This part must be outside protection */
15462306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
15562306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH .
15662306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
15762306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE openvswitch_trace
15862306a36Sopenharmony_ci#include <trace/define_trace.h>
159