Commit 742b8cce authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

drop_monitor: extend by passing cookie from driver

If driver passed along the cookie, push it through Netlink.
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 85b0589e
...@@ -6,17 +6,20 @@ ...@@ -6,17 +6,20 @@
#include <linux/ktime.h> #include <linux/ktime.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <net/flow_offload.h>
/** /**
* struct net_dm_hw_metadata - Hardware-supplied packet metadata. * struct net_dm_hw_metadata - Hardware-supplied packet metadata.
* @trap_group_name: Hardware trap group name. * @trap_group_name: Hardware trap group name.
* @trap_name: Hardware trap name. * @trap_name: Hardware trap name.
* @input_dev: Input netdevice. * @input_dev: Input netdevice.
* @fa_cookie: Flow action user cookie.
*/ */
struct net_dm_hw_metadata { struct net_dm_hw_metadata {
const char *trap_group_name; const char *trap_group_name;
const char *trap_name; const char *trap_name;
struct net_device *input_dev; struct net_device *input_dev;
const struct flow_action_cookie *fa_cookie;
}; };
#if IS_ENABLED(CONFIG_NET_DROP_MONITOR) #if IS_ENABLED(CONFIG_NET_DROP_MONITOR)
......
...@@ -92,6 +92,7 @@ enum net_dm_attr { ...@@ -92,6 +92,7 @@ enum net_dm_attr {
NET_DM_ATTR_HW_TRAP_COUNT, /* u32 */ NET_DM_ATTR_HW_TRAP_COUNT, /* u32 */
NET_DM_ATTR_SW_DROPS, /* flag */ NET_DM_ATTR_SW_DROPS, /* flag */
NET_DM_ATTR_HW_DROPS, /* flag */ NET_DM_ATTR_HW_DROPS, /* flag */
NET_DM_ATTR_FLOW_ACTION_COOKIE, /* binary */
__NET_DM_ATTR_MAX, __NET_DM_ATTR_MAX,
NET_DM_ATTR_MAX = __NET_DM_ATTR_MAX - 1 NET_DM_ATTR_MAX = __NET_DM_ATTR_MAX - 1
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <net/drop_monitor.h> #include <net/drop_monitor.h>
#include <net/genetlink.h> #include <net/genetlink.h>
#include <net/netevent.h> #include <net/netevent.h>
#include <net/flow_offload.h>
#include <trace/events/skb.h> #include <trace/events/skb.h>
#include <trace/events/napi.h> #include <trace/events/napi.h>
...@@ -700,6 +701,13 @@ static void net_dm_packet_work(struct work_struct *work) ...@@ -700,6 +701,13 @@ static void net_dm_packet_work(struct work_struct *work)
net_dm_packet_report(skb); net_dm_packet_report(skb);
} }
static size_t
net_dm_flow_action_cookie_size(const struct net_dm_hw_metadata *hw_metadata)
{
return hw_metadata->fa_cookie ?
nla_total_size(hw_metadata->fa_cookie->cookie_len) : 0;
}
static size_t static size_t
net_dm_hw_packet_report_size(size_t payload_len, net_dm_hw_packet_report_size(size_t payload_len,
const struct net_dm_hw_metadata *hw_metadata) const struct net_dm_hw_metadata *hw_metadata)
...@@ -717,6 +725,8 @@ net_dm_hw_packet_report_size(size_t payload_len, ...@@ -717,6 +725,8 @@ net_dm_hw_packet_report_size(size_t payload_len,
nla_total_size(strlen(hw_metadata->trap_name) + 1) + nla_total_size(strlen(hw_metadata->trap_name) + 1) +
/* NET_DM_ATTR_IN_PORT */ /* NET_DM_ATTR_IN_PORT */
net_dm_in_port_size() + net_dm_in_port_size() +
/* NET_DM_ATTR_FLOW_ACTION_COOKIE */
net_dm_flow_action_cookie_size(hw_metadata) +
/* NET_DM_ATTR_TIMESTAMP */ /* NET_DM_ATTR_TIMESTAMP */
nla_total_size(sizeof(u64)) + nla_total_size(sizeof(u64)) +
/* NET_DM_ATTR_ORIG_LEN */ /* NET_DM_ATTR_ORIG_LEN */
...@@ -762,6 +772,12 @@ static int net_dm_hw_packet_report_fill(struct sk_buff *msg, ...@@ -762,6 +772,12 @@ static int net_dm_hw_packet_report_fill(struct sk_buff *msg,
goto nla_put_failure; goto nla_put_failure;
} }
if (hw_metadata->fa_cookie &&
nla_put(msg, NET_DM_ATTR_FLOW_ACTION_COOKIE,
hw_metadata->fa_cookie->cookie_len,
hw_metadata->fa_cookie->cookie))
goto nla_put_failure;
if (nla_put_u64_64bit(msg, NET_DM_ATTR_TIMESTAMP, if (nla_put_u64_64bit(msg, NET_DM_ATTR_TIMESTAMP,
ktime_to_ns(skb->tstamp), NET_DM_ATTR_PAD)) ktime_to_ns(skb->tstamp), NET_DM_ATTR_PAD))
goto nla_put_failure; goto nla_put_failure;
...@@ -794,11 +810,12 @@ static int net_dm_hw_packet_report_fill(struct sk_buff *msg, ...@@ -794,11 +810,12 @@ static int net_dm_hw_packet_report_fill(struct sk_buff *msg,
static struct net_dm_hw_metadata * static struct net_dm_hw_metadata *
net_dm_hw_metadata_clone(const struct net_dm_hw_metadata *hw_metadata) net_dm_hw_metadata_clone(const struct net_dm_hw_metadata *hw_metadata)
{ {
const struct flow_action_cookie *fa_cookie;
struct net_dm_hw_metadata *n_hw_metadata; struct net_dm_hw_metadata *n_hw_metadata;
const char *trap_group_name; const char *trap_group_name;
const char *trap_name; const char *trap_name;
n_hw_metadata = kmalloc(sizeof(*hw_metadata), GFP_ATOMIC); n_hw_metadata = kzalloc(sizeof(*hw_metadata), GFP_ATOMIC);
if (!n_hw_metadata) if (!n_hw_metadata)
return NULL; return NULL;
...@@ -812,12 +829,25 @@ net_dm_hw_metadata_clone(const struct net_dm_hw_metadata *hw_metadata) ...@@ -812,12 +829,25 @@ net_dm_hw_metadata_clone(const struct net_dm_hw_metadata *hw_metadata)
goto free_trap_group; goto free_trap_group;
n_hw_metadata->trap_name = trap_name; n_hw_metadata->trap_name = trap_name;
if (hw_metadata->fa_cookie) {
size_t cookie_size = sizeof(*fa_cookie) +
hw_metadata->fa_cookie->cookie_len;
fa_cookie = kmemdup(hw_metadata->fa_cookie, cookie_size,
GFP_ATOMIC);
if (!fa_cookie)
goto free_trap_name;
n_hw_metadata->fa_cookie = fa_cookie;
}
n_hw_metadata->input_dev = hw_metadata->input_dev; n_hw_metadata->input_dev = hw_metadata->input_dev;
if (n_hw_metadata->input_dev) if (n_hw_metadata->input_dev)
dev_hold(n_hw_metadata->input_dev); dev_hold(n_hw_metadata->input_dev);
return n_hw_metadata; return n_hw_metadata;
free_trap_name:
kfree(trap_name);
free_trap_group: free_trap_group:
kfree(trap_group_name); kfree(trap_group_name);
free_hw_metadata: free_hw_metadata:
...@@ -830,6 +860,7 @@ net_dm_hw_metadata_free(const struct net_dm_hw_metadata *hw_metadata) ...@@ -830,6 +860,7 @@ net_dm_hw_metadata_free(const struct net_dm_hw_metadata *hw_metadata)
{ {
if (hw_metadata->input_dev) if (hw_metadata->input_dev)
dev_put(hw_metadata->input_dev); dev_put(hw_metadata->input_dev);
kfree(hw_metadata->fa_cookie);
kfree(hw_metadata->trap_name); kfree(hw_metadata->trap_name);
kfree(hw_metadata->trap_group_name); kfree(hw_metadata->trap_group_name);
kfree(hw_metadata); kfree(hw_metadata);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment