/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM openvswitch

#if !defined(_TRACE_OPENVSWITCH_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_OPENVSWITCH_H

#include <linux/tracepoint.h>

#include "datapath.h"

TRACE_EVENT(ovs_do_execute_action,

	TP_PROTO(struct datapath *dp, struct sk_buff *skb,
		 struct sw_flow_key *key, const struct nlattr *a, int rem),

	TP_ARGS(dp, skb, key, a, rem),

	TP_STRUCT__entry(
		__field(	void *,		dpaddr			)
		__string(	dp_name,	ovs_dp_name(dp)		)
		__string(	dev_name,	skb->dev->name		)
		__field(	void *,		skbaddr			)
		__field(	unsigned int,	len			)
		__field(	unsigned int,	data_len		)
		__field(	unsigned int,	truesize		)
		__field(	u8,		nr_frags		)
		__field(	u16,		gso_size		)
		__field(	u16,		gso_type		)
		__field(	u32,		ovs_flow_hash		)
		__field(	u32,		recirc_id		)
		__field(	void *,		keyaddr			)
		__field(	u16,		key_eth_type		)
		__field(	u8,		key_ct_state		)
		__field(	u8,		key_ct_orig_proto	)
		__field(	u16,		key_ct_zone		)
		__field(	unsigned int,	flow_key_valid		)
		__field(	u8,		action_type		)
		__field(	unsigned int,	action_len		)
		__field(	void *,		action_data		)
		__field(	u8,		is_last			)
	),

	TP_fast_assign(
		__entry->dpaddr = dp;
		__assign_str(dp_name, ovs_dp_name(dp));
		__assign_str(dev_name, skb->dev->name);
		__entry->skbaddr = skb;
		__entry->len = skb->len;
		__entry->data_len = skb->data_len;
		__entry->truesize = skb->truesize;
		__entry->nr_frags = skb_shinfo(skb)->nr_frags;
		__entry->gso_size = skb_shinfo(skb)->gso_size;
		__entry->gso_type = skb_shinfo(skb)->gso_type;
		__entry->ovs_flow_hash = key->ovs_flow_hash;
		__entry->recirc_id = key->recirc_id;
		__entry->keyaddr = key;
		__entry->key_eth_type = key->eth.type;
		__entry->key_ct_state = key->ct_state;
		__entry->key_ct_orig_proto = key->ct_orig_proto;
		__entry->key_ct_zone = key->ct_zone;
		__entry->flow_key_valid = !(key->mac_proto & SW_FLOW_KEY_INVALID);
		__entry->action_type = nla_type(a);
		__entry->action_len = nla_len(a);
		__entry->action_data = nla_data(a);
		__entry->is_last = nla_is_last(a, rem);
	),

	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",
		  __entry->dpaddr, __get_str(dp_name), __get_str(dev_name),
		  __entry->skbaddr, __entry->len, __entry->data_len,
		  __entry->truesize, __entry->nr_frags, __entry->gso_size,
		  __entry->gso_type, __entry->ovs_flow_hash,
		  __entry->recirc_id, __entry->keyaddr, __entry->key_eth_type,
		  __entry->key_ct_state, __entry->key_ct_orig_proto,
		  __entry->key_ct_zone,
		  __entry->flow_key_valid,
		  __entry->action_type, __entry->action_len,
		  __entry->action_data, __entry->is_last)
);

TRACE_EVENT(ovs_dp_upcall,

	TP_PROTO(struct datapath *dp, struct sk_buff *skb,
		 const struct sw_flow_key *key,
		 const struct dp_upcall_info *upcall_info),

	TP_ARGS(dp, skb, key, upcall_info),

	TP_STRUCT__entry(
		__field(	void *,		dpaddr			)
		__string(	dp_name,	ovs_dp_name(dp)		)
		__string(	dev_name,	skb->dev->name		)
		__field(	void *,		skbaddr			)
		__field(	unsigned int,	len			)
		__field(	unsigned int,	data_len		)
		__field(	unsigned int,	truesize		)
		__field(	u8,		nr_frags		)
		__field(	u16,		gso_size		)
		__field(	u16,		gso_type		)
		__field(	u32,		ovs_flow_hash		)
		__field(	u32,		recirc_id		)
		__field(	const void *,	keyaddr			)
		__field(	u16,		key_eth_type		)
		__field(	u8,		key_ct_state		)
		__field(	u8,		key_ct_orig_proto	)
		__field(	u16,		key_ct_zone		)
		__field(	unsigned int,	flow_key_valid		)
		__field(	u8,		upcall_cmd		)
		__field(	u32,		upcall_port		)
		__field(	u16,		upcall_mru		)
	),

	TP_fast_assign(
		__entry->dpaddr = dp;
		__assign_str(dp_name, ovs_dp_name(dp));
		__assign_str(dev_name, skb->dev->name);
		__entry->skbaddr = skb;
		__entry->len = skb->len;
		__entry->data_len = skb->data_len;
		__entry->truesize = skb->truesize;
		__entry->nr_frags = skb_shinfo(skb)->nr_frags;
		__entry->gso_size = skb_shinfo(skb)->gso_size;
		__entry->gso_type = skb_shinfo(skb)->gso_type;
		__entry->ovs_flow_hash = key->ovs_flow_hash;
		__entry->recirc_id = key->recirc_id;
		__entry->keyaddr = key;
		__entry->key_eth_type = key->eth.type;
		__entry->key_ct_state = key->ct_state;
		__entry->key_ct_orig_proto = key->ct_orig_proto;
		__entry->key_ct_zone = key->ct_zone;
		__entry->flow_key_valid =  !(key->mac_proto & SW_FLOW_KEY_INVALID);
		__entry->upcall_cmd = upcall_info->cmd;
		__entry->upcall_port = upcall_info->portid;
		__entry->upcall_mru = upcall_info->mru;
	),

	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",
		  __entry->dpaddr, __get_str(dp_name), __get_str(dev_name),
		  __entry->skbaddr, __entry->len, __entry->data_len,
		  __entry->truesize, __entry->nr_frags, __entry->gso_size,
		  __entry->gso_type, __entry->ovs_flow_hash,
		  __entry->recirc_id, __entry->keyaddr, __entry->key_eth_type,
		  __entry->key_ct_state, __entry->key_ct_orig_proto,
		  __entry->key_ct_zone,
		  __entry->flow_key_valid,
		  __entry->upcall_cmd, __entry->upcall_port,
		  __entry->upcall_mru)
);

#endif /* _TRACE_OPENVSWITCH_H */

/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE openvswitch_trace
#include <trace/define_trace.h>
