tc/actions: introduce support for goto chain action

Allow user to set control action "goto" with filter chain index as
a parameter.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
This commit is contained in:
Jiri Pirko 2017-05-16 19:29:37 +02:00 committed by Stephen Hemminger
parent e67aba5595
commit d19f72f789
11 changed files with 43 additions and 13 deletions

View File

@ -34,7 +34,7 @@ IFE - encapsulate/decapsulate metadata
.ti -8 .ti -8
.IR CONTROL " := { " .IR CONTROL " := { "
.BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " }" .BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " | " goto " " chain " " CHAIN_INDEX " }"
.SH DESCRIPTION .SH DESCRIPTION
The The
.B ife .B ife

View File

@ -82,7 +82,7 @@ pedit - generic packet editor action
.ti -8 .ti -8
.IR CONTROL " := {" .IR CONTROL " := {"
.BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " }" .BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }"
.SH DESCRIPTION .SH DESCRIPTION
The The
.B pedit .B pedit

View File

@ -30,7 +30,7 @@ police - policing action
.ti -8 .ti -8
.IR EXCEEDACT/NOTEXCEEDACT " := { " .IR EXCEEDACT/NOTEXCEEDACT " := { "
.BR pipe " | " ok " | " reclassify " | " drop " | " continue " }" .BR pipe " | " ok " | " reclassify " | " drop " | " continue " | " goto " " chain " " CHAIN_INDEX " }"
.SH DESCRIPTION .SH DESCRIPTION
The The
.B police .B police

View File

@ -26,7 +26,7 @@ vlan - vlan manipulation module
.ti -8 .ti -8
.IR CONTROL " := { " .IR CONTROL " := { "
.BR reclassify " | " pipe " | " drop " | " continue " | " pass " }" .BR reclassify " | " pipe " | " drop " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }"
.SH DESCRIPTION .SH DESCRIPTION
The The
.B vlan .B vlan

View File

@ -30,7 +30,8 @@ explain(void)
fprintf(stderr, "Usage: ... connmark [zone ZONE] [CONTROL] [index <INDEX>]\n"); fprintf(stderr, "Usage: ... connmark [zone ZONE] [CONTROL] [index <INDEX>]\n");
fprintf(stderr, "where :\n" fprintf(stderr, "where :\n"
"\tZONE is the conntrack zone\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 static void

View File

@ -45,7 +45,8 @@ explain(void)
#ifdef CONFIG_GACT_PROB #ifdef CONFIG_GACT_PROB
fprintf(stderr, "Usage: ... gact <ACTION> [RAND] [INDEX]\n"); fprintf(stderr, "Usage: ... gact <ACTION> [RAND] [INDEX]\n");
fprintf(stderr, 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" "\tRAND := random <RANDTYPE> <ACTION> <VAL>\n"
"\tRANDTYPE := netrand | determ\n" "\tRANDTYPE := netrand | determ\n"
"\tVAL : = value not exceeding 10000\n" "\tVAL : = value not exceeding 10000\n"
@ -54,7 +55,8 @@ explain(void)
#else #else
fprintf(stderr, "Usage: ... gact <ACTION> [INDEX]\n"); fprintf(stderr, "Usage: ... gact <ACTION> [INDEX]\n");
fprintf(stderr, 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" "\tINDEX := index value used\n"
"\n"); "\n");
#endif #endif

View File

@ -45,7 +45,8 @@ static void explain(void)
"\t\tCMD:= clear | invert | set <setval>| add <addval> | retain\n" "\t\tCMD:= clear | invert | set <setval>| add <addval> | retain\n"
"\t<LAYERED>:= ip <ipdata> | ip6 <ip6data>\n" "\t<LAYERED>:= ip <ipdata> | ip6 <ip6data>\n"
" \t\t| udp <udpdata> | tcp <tcpdata> | icmp <icmpdata>\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" "\tNOTE: if 'ex' is set, extended functionality will be supported (kernel >= 4.11)\n"
"For Example usage look at the examples directory\n"); "For Example usage look at the examples directory\n");

View File

@ -41,7 +41,8 @@ static void usage(void)
fprintf(stderr, "Where: CONTROL := conform-exceed <EXCEEDACT>[/NOTEXCEEDACT]\n"); fprintf(stderr, "Where: CONTROL := conform-exceed <EXCEEDACT>[/NOTEXCEEDACT]\n");
fprintf(stderr, " Define how to handle packets which exceed (<EXCEEDACT>)\n"); fprintf(stderr, " Define how to handle packets which exceed (<EXCEEDACT>)\n");
fprintf(stderr, " or conform (<NOTEXCEEDACT>) the configured bandwidth limit.\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); 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, "shot") == 0 ||
matches(*argv, "continue") == 0 || matches(*argv, "continue") == 0 ||
matches(*argv, "pass") == 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)) if (parse_action_control(&argc, &argv, &p.action, false))
return -1; return -1;
} else if (strcmp(*argv, "conform-exceed") == 0) { } else if (strcmp(*argv, "conform-exceed") == 0) {

View File

@ -36,7 +36,8 @@ static void skbmod_explain(void)
"\tDMAC := 6 byte Destination MAC address\n" "\tDMAC := 6 byte Destination MAC address\n"
"\tSMAC := optional 6 byte Source MAC address\n" "\tSMAC := optional 6 byte Source MAC address\n"
"\tETYPE := optional 16 bit ethertype\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"); "\tINDEX := skbmod index value to use\n");
} }

View File

@ -32,7 +32,8 @@ static void explain(void)
fprintf(stderr, " vlan modify [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n"); 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, " VLANPROTO is one of 802.1Q or 802.1AD\n");
fprintf(stderr, " with default: 802.1Q\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) static void usage(void)

View File

@ -415,6 +415,8 @@ static const char *action_n2a(int action)
{ {
static char buf[64]; static char buf[64];
if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN))
return "goto";
switch (action) { switch (action) {
case TC_ACT_UNSPEC: case TC_ACT_UNSPEC:
return "continue"; return "continue";
@ -459,6 +461,7 @@ static int action_a2n(char *arg, int *result, bool allow_num)
{"ok", TC_ACT_OK}, {"ok", TC_ACT_OK},
{"reclassify", TC_ACT_RECLASSIFY}, {"reclassify", TC_ACT_RECLASSIFY},
{"pipe", TC_ACT_PIPE}, {"pipe", TC_ACT_PIPE},
{"goto", TC_ACT_GOTO_CHAIN},
{ NULL }, { NULL },
}, *iter; }, *iter;
@ -498,6 +501,22 @@ int parse_action_control(int *argc_p, char ***argv_p,
fprintf(stderr, "Bad action type %s\n", *argv); fprintf(stderr, "Bad action type %s\n", *argv);
return -1; 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(); NEXT_ARG_FWD();
*argc_p = argc; *argc_p = argc;
*argv_p = argv; *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, void print_action_control(FILE *f, const char *prefix,
int action, const char *suffix) 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) int get_linklayer(unsigned int *val, const char *arg)