]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
tc/actions: introduce support for goto chain action
authorJiri Pirko <jiri@mellanox.com>
Tue, 16 May 2017 17:29:37 +0000 (19:29 +0200)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 22 May 2017 20:31:51 +0000 (13:31 -0700)
Allow user to set control action "goto" with filter chain index as
a parameter.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
man/man8/tc-ife.8
man/man8/tc-pedit.8
man/man8/tc-police.8
man/man8/tc-vlan.8
tc/m_connmark.c
tc/m_gact.c
tc/m_pedit.c
tc/m_police.c
tc/m_skbmod.c
tc/m_vlan.c
tc/tc_util.c

index a8f1f287d1502c2e768a262d7543a7c57b3627c9..24595cc6d615c29f7af49824b781e0bb2bd8aa4a 100644 (file)
@@ -34,7 +34,7 @@ IFE - encapsulate/decapsulate metadata
 
 .ti -8
 .IR CONTROL " := { "
-.BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " }"
+.BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " | " goto " " chain " " CHAIN_INDEX " }"
 .SH DESCRIPTION
 The
 .B ife
index 82d4217bc9589169a6f8601b07cd06909e5a4017..bbd725c4d0ba137147b2e44444fd487131d0c96c 100644 (file)
@@ -82,7 +82,7 @@ pedit - generic packet editor action
 
 .ti -8
 .IR CONTROL " := {"
-.BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " }"
+.BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }"
 .SH DESCRIPTION
 The
 .B pedit
index 620c28813fc7ea958c68128b953df692a2f0a722..bcc5f438825d1d4a79e4b909f8f402b90fe4d0b2 100644 (file)
@@ -30,7 +30,7 @@ police - policing action
 
 .ti -8
 .IR EXCEEDACT/NOTEXCEEDACT " := { "
-.BR pipe " | " ok " | " reclassify " | " drop " | " continue " }"
+.BR pipe " | " ok " | " reclassify " | " drop " | " continue " | " goto " " chain " " CHAIN_INDEX " }"
 .SH DESCRIPTION
 The
 .B police
index af3de1c54e343ed4afa3bde075d18733d62c001a..59c81e86378d0b42a37d76d1d0e6fe9900124d26 100644 (file)
@@ -26,7 +26,7 @@ vlan - vlan manipulation module
 
 .ti -8
 .IR CONTROL " := { "
-.BR reclassify " | " pipe " | " drop " | " continue " | " pass " }"
+.BR reclassify " | " pipe " | " drop " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }"
 .SH DESCRIPTION
 The
 .B vlan
index 3c2274bc0d2afb81f0074b3a133c0dfd1cb332b5..37d7185415490cb4ecdf8e88eba866066d5e3f6f 100644 (file)
@@ -30,7 +30,8 @@ explain(void)
        fprintf(stderr, "Usage: ... connmark [zone ZONE] [CONTROL] [index <INDEX>]\n");
        fprintf(stderr, "where :\n"
                "\tZONE is the conntrack zone\n"
-               "\tCONTROL := reclassify|pipe|drop|continue|ok\n");
+               "\tCONTROL := reclassify | pipe | drop | continue | ok |\n"
+               "\t           goto chain <CHAIN_INDEX>\n");
 }
 
 static void
index 938b6b5f75de6b946137d0ea86003786c90931c9..d95aa117616e85d40aae9da3d332e55c229f98c2 100644 (file)
@@ -45,7 +45,8 @@ explain(void)
 #ifdef CONFIG_GACT_PROB
        fprintf(stderr, "Usage: ... gact <ACTION> [RAND] [INDEX]\n");
        fprintf(stderr,
-               "Where: \tACTION := reclassify | drop | continue | pass | pipe\n"
+               "Where: \tACTION := reclassify | drop | continue | pass | pipe |\n"
+               "       \t          goto chain <CHAIN_INDEX>\n"
                        "\tRAND := random <RANDTYPE> <ACTION> <VAL>\n"
                        "\tRANDTYPE := netrand | determ\n"
                        "\tVAL : = value not exceeding 10000\n"
@@ -54,7 +55,8 @@ explain(void)
 #else
        fprintf(stderr, "Usage: ... gact <ACTION> [INDEX]\n");
        fprintf(stderr,
-               "Where: \tACTION := reclassify | drop | continue | pass | pipe\n"
+               "Where: \tACTION := reclassify | drop | continue | pass | pipe |\n"
+               "       \t          goto chain <CHAIN_INDEX>\n"
                "\tINDEX := index value used\n"
                "\n");
 #endif
index b7d26b4540beba2021512dde4c83bbad09391508..5d89ab1d832ab92266026027d7992f777d3148f7 100644 (file)
@@ -45,7 +45,8 @@ static void explain(void)
                "\t\tCMD:= clear | invert | set <setval>| add <addval> | retain\n"
                "\t<LAYERED>:= ip <ipdata> | ip6 <ip6data>\n"
                " \t\t| udp <udpdata> | tcp <tcpdata> | icmp <icmpdata>\n"
-               "\tCONTROL:= reclassify | pipe | drop | continue | pass\n"
+               "\tCONTROL:= reclassify | pipe | drop | continue | pass |\n"
+               "\t          goto chain <CHAIN_INDEX>\n"
                "\tNOTE: if 'ex' is set, extended functionality will be supported (kernel >= 4.11)\n"
                "For Example usage look at the examples directory\n");
 
index 2b73969de5daffbdce800e5e824c68842aceb6ce..86117db0482ec93486d4b2f79c09cea8ddca90ae 100644 (file)
@@ -41,7 +41,8 @@ static void usage(void)
        fprintf(stderr, "Where: CONTROL := conform-exceed <EXCEEDACT>[/NOTEXCEEDACT]\n");
        fprintf(stderr, "                  Define how to handle packets which exceed (<EXCEEDACT>)\n");
        fprintf(stderr, "                  or conform (<NOTEXCEEDACT>) the configured bandwidth limit.\n");
-       fprintf(stderr, "       EXCEEDACT/NOTEXCEEDACT := { pipe | ok | reclassify | drop | continue }\n");
+       fprintf(stderr, "       EXCEEDACT/NOTEXCEEDACT := { pipe | ok | reclassify | drop | continue |\n");
+       fprintf(stderr, "                                   goto chain <CHAIN_INDEX> }\n");
        exit(-1);
 }
 
@@ -150,7 +151,8 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
                           matches(*argv, "shot") == 0 ||
                           matches(*argv, "continue") == 0 ||
                           matches(*argv, "pass") == 0 ||
-                          matches(*argv, "pipe") == 0) {
+                          matches(*argv, "pipe") == 0 ||
+                          matches(*argv, "goto") == 0) {
                        if (parse_action_control(&argc, &argv, &p.action, false))
                                return -1;
                } else if (strcmp(*argv, "conform-exceed") == 0) {
index 1ccd474309348a2e4d274012ce63924e859c12fc..ba79308ba8354cd716d4d097b204d354b46b8fec 100644 (file)
@@ -36,7 +36,8 @@ static void skbmod_explain(void)
                "\tDMAC := 6 byte Destination MAC address\n"
                "\tSMAC := optional 6 byte Source MAC address\n"
                "\tETYPE := optional 16 bit ethertype\n"
-               "\tCONTROL := reclassify|pipe|drop|continue|ok\n"
+               "\tCONTROL := reclassify | pipe | drop | continue | ok |\n"
+               "\t           goto chain <CHAIN_INDEX>\n"
                "\tINDEX := skbmod index value to use\n");
 }
 
index 2441b06847ecdcc1e95b70725b3074b9c5469d22..cccb4996b05f3f80ebf6faa18917df164e15c8b9 100644 (file)
@@ -32,7 +32,8 @@ static void explain(void)
        fprintf(stderr, "       vlan modify [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n");
        fprintf(stderr, "       VLANPROTO is one of 802.1Q or 802.1AD\n");
        fprintf(stderr, "            with default: 802.1Q\n");
-       fprintf(stderr, "       CONTROL := reclassify | pipe | drop | continue | pass\n");
+       fprintf(stderr, "       CONTROL := reclassify | pipe | drop | continue | pass |\n");
+       fprintf(stderr, "                  goto chain <CHAIN_INDEX>\n");
 }
 
 static void usage(void)
index fd543c5058cc0e0eff85c11bcc4c9261bb93e617..4f7283d047c852985192fcf0d79938d85ed760e2 100644 (file)
@@ -415,6 +415,8 @@ static const char *action_n2a(int action)
 {
        static char buf[64];
 
+       if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN))
+               return "goto";
        switch (action) {
        case TC_ACT_UNSPEC:
                return "continue";
@@ -459,6 +461,7 @@ static int action_a2n(char *arg, int *result, bool allow_num)
                {"ok", TC_ACT_OK},
                {"reclassify", TC_ACT_RECLASSIFY},
                {"pipe", TC_ACT_PIPE},
+               {"goto", TC_ACT_GOTO_CHAIN},
                { NULL },
        }, *iter;
 
@@ -498,6 +501,22 @@ int parse_action_control(int *argc_p, char ***argv_p,
                fprintf(stderr, "Bad action type %s\n", *argv);
                return -1;
        }
+       if (result == TC_ACT_GOTO_CHAIN) {
+               __u32 chain_index;
+
+               NEXT_ARG();
+               if (matches(*argv, "chain") != 0) {
+                       fprintf(stderr, "\"chain index\" expected\n");
+                       return -1;
+               }
+               NEXT_ARG();
+               if (get_u32(&chain_index, *argv, 10) ||
+                   chain_index > TC_ACT_EXT_VAL_MASK) {
+                       fprintf(stderr, "Illegal \"chain index\"\n");
+                       return -1;
+               }
+               result |= chain_index;
+       }
        NEXT_ARG_FWD();
        *argc_p = argc;
        *argv_p = argv;
@@ -605,7 +624,10 @@ int parse_action_control_slash(int *argc_p, char ***argv_p,
 void print_action_control(FILE *f, const char *prefix,
                          int action, const char *suffix)
 {
-       fprintf(f, "%s%s%s", prefix, action_n2a(action), suffix);
+       fprintf(f, "%s%s", prefix, action_n2a(action));
+       if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN))
+               fprintf(f, " chain %u", action & TC_ACT_EXT_VAL_MASK);
+       fprintf(f, "%s", suffix);
 }
 
 int get_linklayer(unsigned int *val, const char *arg)