Message ID | 20240812182317.1962756-1-wangfe@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | xfrm: add SA information to the offloaded packet | expand |
On Mon, Aug 12, 2024 at 11:23:17AM -0700, Feng Wang wrote: > From: wangfe <wangfe@google.com> > > In packet offload mode, append Security Association (SA) information > to each packet, replicating the crypto offload implementation. > The XFRM_XMIT flag is set to enable packet to be returned immediately > from the validate_xmit_xfrm function, thus aligning with the existing > code path for packet offload mode. Please explain in the commit message _why_ we need that change. Thanks!
Hi Steffen, I have added the reason why SA info is needed in the commit message. The new patch is https://patchwork.kernel.org/project/netdevbpf/patch/20240822200252.472298-1-wangfe@google.com/ Thanks for your review. Feng On Sun, Aug 18, 2024 at 11:06 PM Steffen Klassert <steffen.klassert@secunet.com> wrote: > > On Mon, Aug 12, 2024 at 11:23:17AM -0700, Feng Wang wrote: > > From: wangfe <wangfe@google.com> > > > > In packet offload mode, append Security Association (SA) information > > to each packet, replicating the crypto offload implementation. > > The XFRM_XMIT flag is set to enable packet to be returned immediately > > from the validate_xmit_xfrm function, thus aligning with the existing > > code path for packet offload mode. > > Please explain in the commit message _why_ we need that change. > > Thanks!
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index e5722c95b8bb..a12588e7b060 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c @@ -706,6 +706,8 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb) struct xfrm_state *x = skb_dst(skb)->xfrm; int family; int err; + struct xfrm_offload *xo; + struct sec_path *sp; family = (x->xso.type != XFRM_DEV_OFFLOAD_PACKET) ? x->outer_mode.family : skb_dst(skb)->ops->family; @@ -728,6 +730,25 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb) kfree_skb(skb); return -EHOSTUNREACH; } + sp = secpath_set(skb); + if (!sp) { + XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); + kfree_skb(skb); + return -ENOMEM; + } + + sp->olen++; + sp->xvec[sp->len++] = x; + xfrm_state_hold(x); + + xo = xfrm_offload(skb); + if (!xo) { + secpath_reset(skb); + XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); + kfree_skb(skb); + return -EINVAL; + } + xo->flags |= XFRM_XMIT; return xfrm_output_resume(sk, skb, 0); }