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+
703711static size_t
704712net_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,
794810static struct net_dm_hw_metadata *
795811net_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 );
821851free_trap_group :
822852 kfree (trap_group_name );
823853free_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