OSDN Git Service

net/sched: add sample action to the hardware intermediate representation
authorPieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Sat, 4 May 2019 11:46:16 +0000 (04:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 6 May 2019 04:49:23 +0000 (21:49 -0700)
Add sample action to the hardware intermediate representation model which
would subsequently allow it to be used by drivers for offload.

Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/flow_offload.h
net/sched/cls_api.c

index d035183..9a6c89b 100644 (file)
@@ -118,6 +118,7 @@ enum flow_action_id {
        FLOW_ACTION_MARK,
        FLOW_ACTION_WAKE,
        FLOW_ACTION_QUEUE,
+       FLOW_ACTION_SAMPLE,
 };
 
 /* This is mirroring enum pedit_header_type definition for easy mapping between
@@ -157,6 +158,12 @@ struct flow_action_entry {
                        u32             index;
                        u8              vf;
                } queue;
+               struct {                                /* FLOW_ACTION_SAMPLE */
+                       struct psample_group    *psample_group;
+                       u32                     rate;
+                       u32                     trunc_size;
+                       bool                    truncate;
+               } sample;
        };
 };
 
index 263c2ec..f8ee2d7 100644 (file)
@@ -37,6 +37,7 @@
 #include <net/tc_act/tc_tunnel_key.h>
 #include <net/tc_act/tc_csum.h>
 #include <net/tc_act/tc_gact.h>
+#include <net/tc_act/tc_sample.h>
 #include <net/tc_act/tc_skbedit.h>
 
 extern const struct nla_policy rtm_tca_policy[TCA_MAX + 1];
@@ -3257,6 +3258,13 @@ int tc_setup_flow_action(struct flow_action *flow_action,
                } else if (is_tcf_skbedit_mark(act)) {
                        entry->id = FLOW_ACTION_MARK;
                        entry->mark = tcf_skbedit_mark(act);
+               } else if (is_tcf_sample(act)) {
+                       entry->id = FLOW_ACTION_SAMPLE;
+                       entry->sample.psample_group =
+                               tcf_sample_psample_group(act);
+                       entry->sample.trunc_size = tcf_sample_trunc_size(act);
+                       entry->sample.truncate = tcf_sample_truncate(act);
+                       entry->sample.rate = tcf_sample_rate(act);
                } else {
                        goto err_out;
                }