xfrm: prepare state offload logic to set mode

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>
This commit is contained in:
Leon Romanovsky 2022-12-12 09:54:04 +02:00 committed by David Ahern
parent dc768a4585
commit bdd19b1ede
2 changed files with 24 additions and 16 deletions

View 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))

View 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 " ]"