root/net/openvswitch/openvswitch_trace.h
/* 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);
                __assign_str(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);
                __assign_str(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>