]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
xfrm: prepare state offload logic to set mode
authorLeon Romanovsky <leonro@nvidia.com>
Mon, 12 Dec 2022 07:54:04 +0000 (09:54 +0200)
committerDavid Ahern <dsahern@kernel.org>
Wed, 14 Dec 2022 16:02:05 +0000 (09:02 -0700)
The offload in xfrm state requires to provide device and direction
in order to activate it. However, in the help section, device and
direction were displayed as an optional.

As a preparation to addition of packet offload, let's fix the help
section and refactor the code to be more clear.

Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
ip/xfrm_state.c
man/man8/ip-xfrm.8

index b2294d9fe58f01bef9e596bebaab1286242470ce..6de2d28d3e4db13f3c51300d07f420a5f444b0cb 100644 (file)
@@ -61,7 +61,7 @@ static void usage(void)
                "        [ replay-seq-hi SEQ ] [ replay-oseq-hi SEQ ]\n"
                "        [ flag FLAG-LIST ] [ sel SELECTOR ] [ LIMIT-LIST ] [ encap ENCAP ]\n"
                "        [ coa ADDR[/PLEN] ] [ ctx CTX ] [ extra-flag EXTRA-FLAG-LIST ]\n"
-               "        [ offload [dev DEV] dir DIR ]\n"
+               "        [ offload dev DEV dir DIR ]\n"
                "        [ output-mark OUTPUT-MARK [ mask MASK ] ]\n"
                "        [ if_id IF_ID ] [ tfcpad LENGTH ]\n"
                "Usage: ip xfrm state allocspi ID [ mode MODE ] [ mark MARK [ mask MASK ] ]\n"
@@ -267,7 +267,7 @@ static int xfrm_state_extra_flag_parse(__u32 *extra_flags, int *argcp, char ***a
        return 0;
 }
 
-static int xfrm_offload_dir_parse(__u8 *dir, int *argcp, char ***argvp)
+static bool xfrm_offload_dir_parse(__u8 *dir, int *argcp, char ***argvp)
 {
        int argc = *argcp;
        char **argv = *argvp;
@@ -277,12 +277,12 @@ static int xfrm_offload_dir_parse(__u8 *dir, int *argcp, char ***argvp)
        else if (strcmp(*argv, "out") == 0)
                *dir = 0;
        else
-               invarg("DIR value is invalid", *argv);
+               return false;
 
        *argcp = argc;
        *argvp = argv;
 
-       return 0;
+       return true;
 }
 
 static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
@@ -424,24 +424,27 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
                        addattr_l(&req.n, sizeof(req.buf), XFRMA_SEC_CTX,
                                  (void *)&ctx, ctx.sctx.len);
                } else if (strcmp(*argv, "offload") == 0) {
-                       is_offload = true;
                        NEXT_ARG();
                        if (strcmp(*argv, "dev") == 0) {
                                NEXT_ARG();
                                ifindex = ll_name_to_index(*argv);
-                               if (!ifindex) {
-                                       invarg("value after \"offload dev\" is invalid", *argv);
-                                       is_offload = false;
-                               }
-                               NEXT_ARG();
-                       }
+                               if (!ifindex)
+                                       invarg("Invalid device name", *argv);
+                       } else
+                               invarg("Missing dev keyword", *argv);
+
+                       NEXT_ARG();
                        if (strcmp(*argv, "dir") == 0) {
+                               bool is_dir;
+
                                NEXT_ARG();
-                               xfrm_offload_dir_parse(&dir, &argc, &argv);
-                       } else {
-                               invarg("value after \"offload dir\" is invalid", *argv);
-                               is_offload = false;
-                       }
+                               is_dir = xfrm_offload_dir_parse(&dir, &argc,
+                                                               &argv);
+                               if (!is_dir)
+                                       invarg("DIR value is invalid", *argv);
+                       } else
+                               invarg("Missing DIR keyword", *argv);
+                       is_offload = true;
                } else if (strcmp(*argv, "output-mark") == 0) {
                        NEXT_ARG();
                        if (get_u32(&output_mark.v, *argv, 0))
index bf725cabb82d6d604bd043e5eeeac23322ae1eab..4243a02317f8ca60d3433c702bf30d056bbe2957 100644 (file)
@@ -65,6 +65,11 @@ ip-xfrm \- transform configuration
 .IR MASK " ] ]"
 .RB "[ " if_id
 .IR IF-ID " ]"
+.RB "[ " offload
+.RB dev
+.IR DEV "
+.RB dir
+.IR DIR " ]"
 .RB "[ " tfcpad
 .IR LENGTH " ]"