Not all callers want parse_action_control*() to advance the
arguments. For instance act_parse_police() does the argument
advancing itself.

Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control 
actions")
Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
---

Technically, even though this implements different approach, it is v2 of:

http://www.spinics.net/lists/netdev/msg468479.html

 tc/m_bpf.c        |  1 +
 tc/m_connmark.c   |  1 +
 tc/m_csum.c       |  1 +
 tc/m_gact.c       | 10 +++++-----
 tc/m_ife.c        |  1 +
 tc/m_mirred.c     |  4 +++-
 tc/m_nat.c        |  1 +
 tc/m_pedit.c      |  1 +
 tc/m_sample.c     |  1 +
 tc/m_skbedit.c    |  1 +
 tc/m_skbmod.c     |  1 +
 tc/m_tunnel_key.c |  1 +
 tc/m_vlan.c       |  1 +
 tc/tc_util.c      |  1 -
 14 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/tc/m_bpf.c b/tc/m_bpf.c
index 1c1f71cd..576f69cc 100644
--- a/tc/m_bpf.c
+++ b/tc/m_bpf.c
@@ -129,6 +129,7 @@ opt_bpf:
 
        parse_action_control_dflt(&argc, &argv, &parm.action,
                                  false, TC_ACT_PIPE);
+       NEXT_ARG_FWD();
 
        if (argc) {
                if (matches(*argv, "index") == 0) {
diff --git a/tc/m_connmark.c b/tc/m_connmark.c
index 37d71854..47c7a8c2 100644
--- a/tc/m_connmark.c
+++ b/tc/m_connmark.c
@@ -82,6 +82,7 @@ parse_connmark(struct action_util *a, int *argc_p, char 
***argv_p, int tca_id,
        }
 
        parse_action_control_dflt(&argc, &argv, &sel.action, false, 
TC_ACT_PIPE);
+       NEXT_ARG_FWD();
 
        if (argc) {
                if (matches(*argv, "index") == 0) {
diff --git a/tc/m_csum.c b/tc/m_csum.c
index 7b156734..e1352c08 100644
--- a/tc/m_csum.c
+++ b/tc/m_csum.c
@@ -124,6 +124,7 @@ parse_csum(struct action_util *a, int *argc_p,
        }
 
        parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
+       NEXT_ARG_FWD();
 
        if (argc) {
                if (matches(*argv, "index") == 0) {
diff --git a/tc/m_gact.c b/tc/m_gact.c
index e7d91dab..b30b0420 100644
--- a/tc/m_gact.c
+++ b/tc/m_gact.c
@@ -87,14 +87,13 @@ parse_gact(struct action_util *a, int *argc_p, char 
***argv_p,
        if (argc < 0)
                return -1;
 
-
-       if (matches(*argv, "gact") == 0) {
-               argc--;
-               argv++;
-       } else if (parse_action_control(&argc, &argv, &p.action, false) == -1) {
+       if (matches(*argv, "gact") != 0 &&
+               parse_action_control(&argc, &argv, &p.action, false) == -1) {
                usage();        /* does not return */
        }
 
+       NEXT_ARG_FWD();
+
 #ifdef CONFIG_GACT_PROB
        if (argc > 0) {
                if (matches(*argv, "random") == 0) {
@@ -114,6 +113,7 @@ parse_gact(struct action_util *a, int *argc_p, char 
***argv_p,
                        if (parse_action_control(&argc, &argv,
                                                 &pp.paction, false) == -1)
                                usage();
+                       NEXT_ARG_FWD();
                        if (get_u16(&pp.pval, *argv, 10)) {
                                fprintf(stderr,
                                        "Illegal probability val 0x%x\n",
diff --git a/tc/m_ife.c b/tc/m_ife.c
index 205efc9f..4647f6a6 100644
--- a/tc/m_ife.c
+++ b/tc/m_ife.c
@@ -159,6 +159,7 @@ static int parse_ife(struct action_util *a, int *argc_p, 
char ***argv_p,
 
        parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/m_mirred.c b/tc/m_mirred.c
index 3870d3a4..aa7ce6d9 100644
--- a/tc/m_mirred.c
+++ b/tc/m_mirred.c
@@ -202,8 +202,10 @@ parse_direction(struct action_util *a, int *argc_p, char 
***argv_p,
        }
 
 
-       if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR)
+       if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) {
                parse_action_control(&argc, &argv, &p.action, false);
+               NEXT_ARG_FWD();
+       }
 
        if (argc) {
                if (iok && matches(*argv, "index") == 0) {
diff --git a/tc/m_nat.c b/tc/m_nat.c
index 1e4ff51f..f5de4d4c 100644
--- a/tc/m_nat.c
+++ b/tc/m_nat.c
@@ -116,6 +116,7 @@ parse_nat(struct action_util *a, int *argc_p, char 
***argv_p, int tca_id, struct
 
        parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/m_pedit.c b/tc/m_pedit.c
index 26549eee..dc57f14a 100644
--- a/tc/m_pedit.c
+++ b/tc/m_pedit.c
@@ -672,6 +672,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char 
***argv_p, int tca_id,
 
        parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, 
TC_ACT_OK);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/m_sample.c b/tc/m_sample.c
index ff5ee6bd..31774c0e 100644
--- a/tc/m_sample.c
+++ b/tc/m_sample.c
@@ -100,6 +100,7 @@ static int parse_sample(struct action_util *a, int *argc_p, 
char ***argv_p,
 
        parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c
index aa374fcb..c41a7bb0 100644
--- a/tc/m_skbedit.c
+++ b/tc/m_skbedit.c
@@ -123,6 +123,7 @@ parse_skbedit(struct action_util *a, int *argc_p, char 
***argv_p, int tca_id,
        parse_action_control_dflt(&argc, &argv, &sel.action,
                                  false, TC_ACT_PIPE);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c
index 561b73fb..bc268dfd 100644
--- a/tc/m_skbmod.c
+++ b/tc/m_skbmod.c
@@ -124,6 +124,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, 
char ***argv_p,
 
        parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
index 1cdd0356..2dc91879 100644
--- a/tc/m_tunnel_key.c
+++ b/tc/m_tunnel_key.c
@@ -175,6 +175,7 @@ static int parse_tunnel_key(struct action_util *a, int 
*argc_p, char ***argv_p,
        parse_action_control_dflt(&argc, &argv, &parm.action,
                                  false, TC_ACT_PIPE);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/m_vlan.c b/tc/m_vlan.c
index 161759fd..edae0d1e 100644
--- a/tc/m_vlan.c
+++ b/tc/m_vlan.c
@@ -131,6 +131,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, 
char ***argv_p,
        parse_action_control_dflt(&argc, &argv, &parm.action,
                                  false, TC_ACT_PIPE);
 
+       NEXT_ARG_FWD();
        if (argc) {
                if (matches(*argv, "index") == 0) {
                        NEXT_ARG();
diff --git a/tc/tc_util.c b/tc/tc_util.c
index 18879056..ee9a70aa 100644
--- a/tc/tc_util.c
+++ b/tc/tc_util.c
@@ -586,7 +586,6 @@ static int __parse_action_control(int *argc_p, char 
***argv_p, int *result_p,
                }
                result |= jump_cnt;
        }
-       NEXT_ARG_FWD();
        *argc_p = argc;
        *argv_p = argv;
        *result_p = result;
-- 
2.13.6

Reply via email to