Skip to content

Commit 742b8cc

Browse files
jpirkodavem330
authored andcommitted
drop_monitor: extend by passing cookie from driver
If driver passed along the cookie, push it through Netlink. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 85b0589 commit 742b8cc

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

include/net/drop_monitor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66
#include <linux/ktime.h>
77
#include <linux/netdevice.h>
88
#include <linux/skbuff.h>
9+
#include <net/flow_offload.h>
910

1011
/**
1112
* struct net_dm_hw_metadata - Hardware-supplied packet metadata.
1213
* @trap_group_name: Hardware trap group name.
1314
* @trap_name: Hardware trap name.
1415
* @input_dev: Input netdevice.
16+
* @fa_cookie: Flow action user cookie.
1517
*/
1618
struct net_dm_hw_metadata {
1719
const char *trap_group_name;
1820
const char *trap_name;
1921
struct net_device *input_dev;
22+
const struct flow_action_cookie *fa_cookie;
2023
};
2124

2225
#if IS_ENABLED(CONFIG_NET_DROP_MONITOR)

include/uapi/linux/net_dropmon.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ enum net_dm_attr {
9292
NET_DM_ATTR_HW_TRAP_COUNT, /* u32 */
9393
NET_DM_ATTR_SW_DROPS, /* flag */
9494
NET_DM_ATTR_HW_DROPS, /* flag */
95+
NET_DM_ATTR_FLOW_ACTION_COOKIE, /* binary */
9596

9697
__NET_DM_ATTR_MAX,
9798
NET_DM_ATTR_MAX = __NET_DM_ATTR_MAX - 1

net/core/drop_monitor.c

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <net/drop_monitor.h>
3030
#include <net/genetlink.h>
3131
#include <net/netevent.h>
32+
#include <net/flow_offload.h>
3233

3334
#include <trace/events/skb.h>
3435
#include <trace/events/napi.h>
@@ -700,6 +701,13 @@ static void net_dm_packet_work(struct work_struct *work)
700701
net_dm_packet_report(skb);
701702
}
702703

704+
static size_t
705+
net_dm_flow_action_cookie_size(const struct net_dm_hw_metadata *hw_metadata)
706+
{
707+
return hw_metadata->fa_cookie ?
708+
nla_total_size(hw_metadata->fa_cookie->cookie_len) : 0;
709+
}
710+
703711
static size_t
704712
net_dm_hw_packet_report_size(size_t payload_len,
705713
const struct net_dm_hw_metadata *hw_metadata)
@@ -717,6 +725,8 @@ net_dm_hw_packet_report_size(size_t payload_len,
717725
nla_total_size(strlen(hw_metadata->trap_name) + 1) +
718726
/* NET_DM_ATTR_IN_PORT */
719727
net_dm_in_port_size() +
728+
/* NET_DM_ATTR_FLOW_ACTION_COOKIE */
729+
net_dm_flow_action_cookie_size(hw_metadata) +
720730
/* NET_DM_ATTR_TIMESTAMP */
721731
nla_total_size(sizeof(u64)) +
722732
/* NET_DM_ATTR_ORIG_LEN */
@@ -762,6 +772,12 @@ static int net_dm_hw_packet_report_fill(struct sk_buff *msg,
762772
goto nla_put_failure;
763773
}
764774

775+
if (hw_metadata->fa_cookie &&
776+
nla_put(msg, NET_DM_ATTR_FLOW_ACTION_COOKIE,
777+
hw_metadata->fa_cookie->cookie_len,
778+
hw_metadata->fa_cookie->cookie))
779+
goto nla_put_failure;
780+
765781
if (nla_put_u64_64bit(msg, NET_DM_ATTR_TIMESTAMP,
766782
ktime_to_ns(skb->tstamp), NET_DM_ATTR_PAD))
767783
goto nla_put_failure;
@@ -794,11 +810,12 @@ static int net_dm_hw_packet_report_fill(struct sk_buff *msg,
794810
static struct net_dm_hw_metadata *
795811
net_dm_hw_metadata_clone(const struct net_dm_hw_metadata *hw_metadata)
796812
{
813+
const struct flow_action_cookie *fa_cookie;
797814
struct net_dm_hw_metadata *n_hw_metadata;
798815
const char *trap_group_name;
799816
const char *trap_name;
800817

801-
n_hw_metadata = kmalloc(sizeof(*hw_metadata), GFP_ATOMIC);
818+
n_hw_metadata = kzalloc(sizeof(*hw_metadata), GFP_ATOMIC);
802819
if (!n_hw_metadata)
803820
return NULL;
804821

@@ -812,12 +829,25 @@ net_dm_hw_metadata_clone(const struct net_dm_hw_metadata *hw_metadata)
812829
goto free_trap_group;
813830
n_hw_metadata->trap_name = trap_name;
814831

832+
if (hw_metadata->fa_cookie) {
833+
size_t cookie_size = sizeof(*fa_cookie) +
834+
hw_metadata->fa_cookie->cookie_len;
835+
836+
fa_cookie = kmemdup(hw_metadata->fa_cookie, cookie_size,
837+
GFP_ATOMIC);
838+
if (!fa_cookie)
839+
goto free_trap_name;
840+
n_hw_metadata->fa_cookie = fa_cookie;
841+
}
842+
815843
n_hw_metadata->input_dev = hw_metadata->input_dev;
816844
if (n_hw_metadata->input_dev)
817845
dev_hold(n_hw_metadata->input_dev);
818846

819847
return n_hw_metadata;
820848

849+
free_trap_name:
850+
kfree(trap_name);
821851
free_trap_group:
822852
kfree(trap_group_name);
823853
free_hw_metadata:
@@ -830,6 +860,7 @@ net_dm_hw_metadata_free(const struct net_dm_hw_metadata *hw_metadata)
830860
{
831861
if (hw_metadata->input_dev)
832862
dev_put(hw_metadata->input_dev);
863+
kfree(hw_metadata->fa_cookie);
833864
kfree(hw_metadata->trap_name);
834865
kfree(hw_metadata->trap_group_name);
835866
kfree(hw_metadata);

0 commit comments

Comments
 (0)