xfrm: store and rely on direction to construct offload flags
authorLeon Romanovsky <leonro@nvidia.com>
Thu, 5 May 2022 10:06:41 +0000 (13:06 +0300)
committerSteffen Klassert <steffen.klassert@secunet.com>
Fri, 6 May 2022 06:31:04 +0000 (08:31 +0200)
XFRM state doesn't need anything from flags except to understand
direction, so store it separately. For future patches, such change
will allow us to reuse xfrm_dev_offload for policy offload too, which
has three possible directions instead of two.

Reviewed-by: Raed Salem <raeds@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
include/net/xfrm.h
net/xfrm/xfrm_device.c
net/xfrm/xfrm_user.c

index bb20278..45422f7 100644 (file)
@@ -126,12 +126,18 @@ struct xfrm_state_walk {
        struct xfrm_address_filter *filter;
 };
 
+enum {
+       XFRM_DEV_OFFLOAD_IN = 1,
+       XFRM_DEV_OFFLOAD_OUT,
+};
+
 struct xfrm_dev_offload {
        struct net_device       *dev;
        netdevice_tracker       dev_tracker;
        struct net_device       *real_dev;
        unsigned long           offload_handle;
        u8                      flags;
+       u8                      dir : 2;
 };
 
 struct xfrm_mode {
index 6e4d3cb..c818afc 100644 (file)
@@ -117,7 +117,7 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur
 
        sp = skb_sec_path(skb);
        x = sp->xvec[sp->len - 1];
-       if (xo->flags & XFRM_GRO || x->xso.flags & XFRM_OFFLOAD_INBOUND)
+       if (xo->flags & XFRM_GRO || x->xso.dir == XFRM_DEV_OFFLOAD_IN)
                return skb;
 
        /* This skb was already validated on the upper/virtual dev */
@@ -267,10 +267,16 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
        /* Don't forward bit that is not implemented */
        xso->flags = xuo->flags & ~XFRM_OFFLOAD_IPV6;
 
+       if (xuo->flags & XFRM_OFFLOAD_INBOUND)
+               xso->dir = XFRM_DEV_OFFLOAD_IN;
+       else
+               xso->dir = XFRM_DEV_OFFLOAD_OUT;
+
        err = dev->xfrmdev_ops->xdo_dev_state_add(x);
        if (err) {
                xso->flags = 0;
                xso->dev = NULL;
+               xso->dir = 0;
                xso->real_dev = NULL;
                dev_put_track(dev, &xso->dev_tracker);
 
index 7217c57..6a58fec 100644 (file)
@@ -852,7 +852,8 @@ static int copy_user_offload(struct xfrm_dev_offload *xso, struct sk_buff *skb)
        xuo = nla_data(attr);
        memset(xuo, 0, sizeof(*xuo));
        xuo->ifindex = xso->dev->ifindex;
-       xuo->flags = xso->flags;
+       if (xso->dir == XFRM_DEV_OFFLOAD_IN)
+               xuo->flags = XFRM_OFFLOAD_INBOUND;
 
        return 0;
 }