]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
xfrm: add packet offload mode to xfrm state
authorLeon Romanovsky <leonro@nvidia.com>
Mon, 12 Dec 2022 07:54:05 +0000 (09:54 +0200)
committerDavid Ahern <dsahern@kernel.org>
Wed, 14 Dec 2022 16:02:29 +0000 (09:02 -0700)
Allow users to configure xfrm states with packet offload type.

Packet offload mode:
  ip xfrm state offload packet dev <if-name> dir <in|out>
Crypto offload mode:
  ip xfrm state offload crypto dev <if-name> dir <in|out>
  ip xfrm state offload dev <if-name> dir <in|out>

The latter variant configures crypto offload mode and is needed
to provide backward compatibility.

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

index 1c59596ab60d819786205ea3c826abe2f75f863e..deb45817aebc087aba2d74fd0596ed07b86613e2 100644 (file)
@@ -895,8 +895,10 @@ void xfrm_xfrma_print(struct rtattr *tb[], __u16 family,
 
                xuo = (struct xfrm_user_offload *)
                        RTA_DATA(tb[XFRMA_OFFLOAD_DEV]);
-               fprintf(fp, "dev %s dir %s", ll_index_to_name(xuo->ifindex),
-                       (xuo->flags & XFRM_OFFLOAD_INBOUND) ? "in" : "out");
+               fprintf(fp, "dev %s dir %s mode %s",
+                       ll_index_to_name(xuo->ifindex),
+                       (xuo->flags & XFRM_OFFLOAD_INBOUND) ? "in" : "out",
+                       (xuo->flags & XFRM_OFFLOAD_PACKET) ? "packet" : "crypto");
                fprintf(fp, "%s", _SL_);
        }
        if (tb[XFRMA_IF_ID]) {
index 6de2d28d3e4db13f3c51300d07f420a5f444b0cb..16c65e23a7e76193e7326e8f79f588188c154542 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 [ crypto | packet ] 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"
@@ -307,7 +307,7 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
        struct xfrm_user_offload xuo = {};
        unsigned int ifindex = 0;
        __u8 dir = 0;
-       bool is_offload = false;
+       bool is_offload = false, is_packet_offload = false;
        __u32 replay_window = 0;
        __u32 seq = 0, oseq = 0, seq_hi = 0, oseq_hi = 0;
        char *idp = NULL;
@@ -425,6 +425,16 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
                                  (void *)&ctx, ctx.sctx.len);
                } else if (strcmp(*argv, "offload") == 0) {
                        NEXT_ARG();
+                       /* If user doesn't provide offload mode, treat it as
+                        * crypto one for the backward compatibility.
+                        */
+                       if (strcmp(*argv, "crypto") == 0)
+                               NEXT_ARG();
+                       else if (strcmp(*argv, "packet") == 0) {
+                               is_packet_offload = true;
+                               NEXT_ARG();
+                       }
+
                        if (strcmp(*argv, "dev") == 0) {
                                NEXT_ARG();
                                ifindex = ll_name_to_index(*argv);
@@ -608,6 +618,8 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
        if (is_offload) {
                xuo.ifindex = ifindex;
                xuo.flags = dir;
+               if (is_packet_offload)
+                       xuo.flags |= XFRM_OFFLOAD_PACKET;
                addattr_l(&req.n, sizeof(req.buf), XFRMA_OFFLOAD_DEV, &xuo,
                          sizeof(xuo));
        }
index 4243a02317f8ca60d3433c702bf30d056bbe2957..a65cfa5f49b85313b7dbf9be211687848c85b97f 100644 (file)
@@ -66,6 +66,7 @@ ip-xfrm \- transform configuration
 .RB "[ " if_id
 .IR IF-ID " ]"
 .RB "[ " offload
+.RB "[ " crypto | packet " ]"
 .RB dev
 .IR DEV "
 .RB dir