net: sched: introduce a TRAP control action
authorJiri Pirko <jiri@mellanox.com>
Tue, 6 Jun 2017 12:12:02 +0000 (14:12 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Jun 2017 16:45:23 +0000 (12:45 -0400)
There is need to instruct the HW offloaded path to push certain matched
packets to cpu/kernel for further analysis. So this patch introduces a
new TRAP control action to TC.

For kernel datapath, this action does not make much sense. So with the
same logic as in HW, new TRAP behaves similar to STOLEN. The skb is just
dropped in the datapath (and virtually ejected to an upper level, which
does not exist in case of kernel).

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Yotam Gigi <yotamg@mellanox.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
15 files changed:
include/uapi/linux/pkt_cls.h
net/core/dev.c
net/sched/cls_bpf.c
net/sched/sch_atm.c
net/sched/sch_cbq.c
net/sched/sch_drr.c
net/sched/sch_dsmark.c
net/sched/sch_fq_codel.c
net/sched/sch_hfsc.c
net/sched/sch_htb.c
net/sched/sch_multiq.c
net/sched/sch_prio.c
net/sched/sch_qfq.c
net/sched/sch_sfb.c
net/sched/sch_sfq.c

index edf43dd..2055783 100644 (file)
@@ -37,6 +37,13 @@ enum {
 #define TC_ACT_QUEUED          5
 #define TC_ACT_REPEAT          6
 #define TC_ACT_REDIRECT                7
+#define TC_ACT_TRAP            8 /* For hw path, this means "trap to cpu"
+                                  * and don't further process the frame
+                                  * in hardware. For sw path, this is
+                                  * equivalent of TC_ACT_STOLEN - drop
+                                  * the skb and act like everything
+                                  * is alright.
+                                  */
 
 /* There is a special kind of actions called "extended actions",
  * which need a value parameter. These have a local opcode located in
index 06e0a74..8f72f4a 100644 (file)
@@ -3269,6 +3269,7 @@ sch_handle_egress(struct sk_buff *skb, int *ret, struct net_device *dev)
                return NULL;
        case TC_ACT_STOLEN:
        case TC_ACT_QUEUED:
+       case TC_ACT_TRAP:
                *ret = NET_XMIT_SUCCESS;
                consume_skb(skb);
                return NULL;
@@ -4038,6 +4039,7 @@ sch_handle_ingress(struct sk_buff *skb, struct packet_type **pt_prev, int *ret,
                return NULL;
        case TC_ACT_STOLEN:
        case TC_ACT_QUEUED:
+       case TC_ACT_TRAP:
                consume_skb(skb);
                return NULL;
        case TC_ACT_REDIRECT:
index 5ebeae9..a9c56ad 100644 (file)
@@ -70,6 +70,7 @@ static int cls_bpf_exec_opcode(int code)
        case TC_ACT_OK:
        case TC_ACT_SHOT:
        case TC_ACT_STOLEN:
+       case TC_ACT_TRAP:
        case TC_ACT_REDIRECT:
        case TC_ACT_UNSPEC:
                return code;
index f435546..de16259 100644 (file)
@@ -406,6 +406,7 @@ done:
                switch (result) {
                case TC_ACT_QUEUED:
                case TC_ACT_STOLEN:
+               case TC_ACT_TRAP:
                        __qdisc_drop(skb, to_free);
                        return NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
index 8dd6d0a..481036f 100644 (file)
@@ -254,6 +254,7 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
                switch (result) {
                case TC_ACT_QUEUED:
                case TC_ACT_STOLEN:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return NULL;
index 5db2a28..a413dc1 100644 (file)
@@ -339,6 +339,7 @@ static struct drr_class *drr_classify(struct sk_buff *skb, struct Qdisc *sch,
                switch (result) {
                case TC_ACT_QUEUED:
                case TC_ACT_STOLEN:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return NULL;
index 7ccdd82..6d94fcc 100644 (file)
@@ -243,6 +243,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch,
 #ifdef CONFIG_NET_CLS_ACT
                case TC_ACT_QUEUED:
                case TC_ACT_STOLEN:
+               case TC_ACT_TRAP:
                        __qdisc_drop(skb, to_free);
                        return NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
 
index f201e73..337f2d6 100644 (file)
@@ -103,6 +103,7 @@ static unsigned int fq_codel_classify(struct sk_buff *skb, struct Qdisc *sch,
                switch (result) {
                case TC_ACT_STOLEN:
                case TC_ACT_QUEUED:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return 0;
index a324f84..b52f746 100644 (file)
@@ -1155,6 +1155,7 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
                switch (result) {
                case TC_ACT_QUEUED:
                case TC_ACT_STOLEN:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return NULL;
index 195bbca..203286a 100644 (file)
@@ -238,6 +238,7 @@ static struct htb_class *htb_classify(struct sk_buff *skb, struct Qdisc *sch,
                switch (result) {
                case TC_ACT_QUEUED:
                case TC_ACT_STOLEN:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return NULL;
index 6047674..f143b7b 100644 (file)
@@ -52,6 +52,7 @@ multiq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
        switch (err) {
        case TC_ACT_STOLEN:
        case TC_ACT_QUEUED:
+       case TC_ACT_TRAP:
                *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
        case TC_ACT_SHOT:
                return NULL;
index a240468..e3e364c 100644 (file)
@@ -48,6 +48,7 @@ prio_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
                switch (err) {
                case TC_ACT_STOLEN:
                case TC_ACT_QUEUED:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return NULL;
index 076ad03..0e16dfd 100644 (file)
@@ -726,6 +726,7 @@ static struct qfq_class *qfq_classify(struct sk_buff *skb, struct Qdisc *sch,
                switch (result) {
                case TC_ACT_QUEUED:
                case TC_ACT_STOLEN:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return NULL;
index 9756b1c..11fb6ec 100644 (file)
@@ -266,6 +266,7 @@ static bool sfb_classify(struct sk_buff *skb, struct tcf_proto *fl,
                switch (result) {
                case TC_ACT_STOLEN:
                case TC_ACT_QUEUED:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return false;
index 66dfd15..f80ea2c 100644 (file)
@@ -187,6 +187,7 @@ static unsigned int sfq_classify(struct sk_buff *skb, struct Qdisc *sch,
                switch (result) {
                case TC_ACT_STOLEN:
                case TC_ACT_QUEUED:
+               case TC_ACT_TRAP:
                        *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
                case TC_ACT_SHOT:
                        return 0;