net: sched: add helpers to handle extended actions
authorJiri Pirko <jiri@mellanox.com>
Tue, 2 May 2017 08:12:00 +0000 (10:12 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 May 2017 19:33:54 +0000 (15:33 -0400)
Jump is now the only one using value action opcode. This is going to
change soon. So introduce helpers to work with this. Convert TC_ACT_JUMP.

This also fixes the TC_ACT_JUMP check, which is incorrectly done as a
bit check, not a value check.

Fixes: e0ee84ded796 ("net sched actions: Complete the JUMPX opcode")
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/pkt_cls.h
net/sched/act_api.c

index f1129e383b2a47ad96890e06355ccb6223332c2b..d613be3b3239e476d728ffa323347ef42e97eaec 100644 (file)
@@ -37,7 +37,20 @@ enum {
 #define TC_ACT_QUEUED          5
 #define TC_ACT_REPEAT          6
 #define TC_ACT_REDIRECT                7
-#define TC_ACT_JUMP            0x10000000
+
+/* There is a special kind of actions called "extended actions",
+ * which need a value parameter. These have a local opcode located in
+ * the highest nibble, starting from 1. The rest of the bits
+ * are used to carry the value. These two parts together make
+ * a combined opcode.
+ */
+#define __TC_ACT_EXT_SHIFT 28
+#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT)
+#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1)
+#define TC_ACT_EXT_CMP(combined, opcode) \
+       (((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode)
+
+#define TC_ACT_JUMP __TC_ACT_EXT(1)
 
 /* Action type identifiers*/
 enum {
index 7f2cd702bb2772655e60960f7986319c17730170..a90e8f355c00e9a39b4a17403b6c7459b6ea9c2f 100644 (file)
@@ -453,7 +453,7 @@ repeat:
                if (ret == TC_ACT_REPEAT)
                        goto repeat;    /* we need a ttl - JHS */
 
-               if (ret & TC_ACT_JUMP) {
+               if (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) {
                        jmp_prgcnt = ret & TCA_ACT_MAX_PRIO_MASK;
                        if (!jmp_prgcnt || (jmp_prgcnt > nr_actions)) {
                                /* faulty opcode, stop pipeline */