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 edf43ddf47b00b49ebe404ef2cd091a2cb19a312..2055783e6ee9c33cb8d6ffe12b0f1a61e13a3af3 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 06e0a7492df86bdd84058895678a98a6b56a3cac..8f72f4a9c6ac63792e5f1c74b218ac55fa43e4ea 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 5ebeae996e6327023bfce0307cd6b6a07c0860c2..a9c56ad4533afb0789f32ca327ecd275bae3c1bb 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 f435546c3864053435bee79f869dcc922268eba6..de162592eee0505339f25103611e6bf305dcbce1 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 8dd6d0aca67824e0ba07e43b4828a5b88a0ee43c..481036f6b54e4730ee27fae6236277c64d3eaa1a 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 5db2a2843c66f0c864e562541b6a0952f445be44..a413dc1c209803d6fbc69c3bb7d0524ad7acb2aa 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 7ccdd825d34e401a209831c643511a70f3f3d2bb..6d94fcc3592a95b14d8758731f98641af64f64f0 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 f201e73947fba204a2fe3bb0dc9b7d7d6bffe484..337f2d6d81e42e278b63443d904955e2c6692f03 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 a324f84b1ccdf647fa442ad705057c55fd28c8c8..b52f74610dc7539fd7804403a6ff41b690243df7 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 195bbca9eb0bf859073c574be694e911e07d8f99..203286ab442799a07808bd8f73af9f07b0482cbd 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 604767482ad07ec3607599f6387ff02cc26780ad..f143b7bbaa0d5b00d01d36e9f6eefb54bf677e8f 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 a2404688dd019e3e046f3a7ad9362e76f1bf3576..e3e364cc9a70400be95439ca9c808acc410595af 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 076ad032befb593b476e1b44f73de6e77205a37c..0e16dfda0bd7f43b83dbd3b46de270e7864e154c 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 9756b1ccd34584675f63390841c362294d4623b3..11fb6ec878d6c1179afb0b4e9fa6adaecd0bdf30 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 66dfd15b794647848f4f11e6b471c5ccfbcdcb23..f80ea2cc5f1f4bdee2452c930e3650f79397f3a1 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;