@@ -81,9 +81,10 @@
#endif
static void explain(void)
{
- fprintf(stderr, "Usage: ... simple STRING\n"
- "STRING being an arbitrary string\n"
- "example: \"simple blah\"\n");
+ fprintf(stderr, "Usage:... simple [sdata STRING] [CONTROL] [index INDEX]\n");
+ fprintf(stderr, "\tSTRING being an arbitrary string\n"
+ "\tCONTROL := reclassify|pipe|drop|continue|ok\n"
+ "\tINDEX := optional index value used\n");
}
static void usage(void)
@@ -99,56 +100,85 @@ parse_simple(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
struct tc_defact sel = {};
int argc = *argc_p;
char **argv = *argv_p;
- int ok = 0;
+ int ok = 0, maybe_bind = 0;
struct rtattr *tail;
char *simpdata = NULL;
-
while (argc > 0) {
if (matches(*argv, "simple") == 0) {
NEXT_ARG();
+ } else if (matches(*argv, "sdata") == 0) {
+ NEXT_ARG();
+ ok += 1;
simpdata = *argv;
- ok = 1;
argc--;
argv++;
- break;
} else if (matches(*argv, "help") == 0) {
usage();
} else {
break;
}
-
}
- if (!ok) {
- explain();
- return -1;
+ if (argc) {
+ if (matches(*argv, "reclassify") == 0) {
+ sel.action = TC_ACT_RECLASSIFY;
+ argc--;
+ argv++;
+ } else if (matches(*argv, "pipe") == 0) {
+ sel.action = TC_ACT_PIPE;
+ argc--;
+ argv++;
+ } else if (matches(*argv, "drop") == 0 ||
+ matches(*argv, "shot") == 0) {
+ sel.action = TC_ACT_SHOT;
+ argc--;
+ argv++;
+ } else if (matches(*argv, "continue") == 0) {
+ sel.action = TC_ACT_UNSPEC;
+ argc--;
+ argv++;
+ } else if (matches(*argv, "pass") == 0 ||
+ matches(*argv, "ok") == 0) {
+ sel.action = TC_ACT_OK;
+ argc--;
+ argv++;
+ }
}
if (argc) {
if (matches(*argv, "index") == 0) {
NEXT_ARG();
if (get_u32(&sel.index, *argv, 10)) {
- fprintf(stderr, "simple: Illegal \"index\"\n");
+ fprintf(stderr, "simple: Illegal \"index\"\n",
+ *argv);
return -1;
}
+ ok += 1;
argc--;
argv++;
}
}
- if (strlen(simpdata) > (SIMP_MAX_DATA - 1)) {
+ if (!ok) {
+ explain();
+ return -1;
+ }
+
+ if (simpdata && (strlen(simpdata) > (SIMP_MAX_DATA - 1))) {
fprintf(stderr, "simple: Illegal string len %zu <%s>\n",
strlen(simpdata), simpdata);
return -1;
}
+
sel.action = TC_ACT_PIPE;
tail = NLMSG_TAIL(n);
addattr_l(n, MAX_MSG, tca_id, NULL, 0);
addattr_l(n, MAX_MSG, TCA_DEF_PARMS, &sel, sizeof(sel));
- addattr_l(n, MAX_MSG, TCA_DEF_DATA, simpdata, SIMP_MAX_DATA);
+ if (simpdata)
+ addattr_l(n, MAX_MSG, TCA_DEF_DATA, simpdata, SIMP_MAX_DATA);
tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
*argc_p = argc;