xfrm: store and rely on direction to construct offload flags
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>
This commit is contained in:
parent
87e0a94e60
commit
482db2f1dd
@ -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 {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user