Support PTMU in tunnel mode for packet offload
Subsystems (14)
cover Support PTMU in tunnel mode for packet offload
Hi,
This series refactors the xdo_dev_offload_ok() to be global place for drivers to check if their offload can perform encryption for xmit packets.
Such common place gives us an option to check MTU and PMTU at one place.
Thanks
Leon Romanovsky (5):
xfrm: delay initialization of offload path till its actually requested
xfrm: simplify SA initialization routine
xfrm: rely on XFRM offload
xfrm: provide common xdo_dev_offload_ok callback implementation
xfrm: check for PMTU in tunnel mode for packet offload
Documentation/networking/xfrm_device.rst | 3 +- drivers/net/bonding/bond_main.c | 16 ++----- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 21 --------- .../inline_crypto/ch_ipsec/chcr_ipsec.c | 16 ------- .../net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 21 --------- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 21 --------- .../marvell/octeontx2/nic/cn10k_ipsec.c | 15 ------ .../mellanox/mlx5/core/en_accel/ipsec.c | 16 ------- .../net/ethernet/netronome/nfp/crypto/ipsec.c | 11 ----- drivers/net/netdevsim/ipsec.c | 11 ----- drivers/net/netdevsim/netdevsim.h | 1 - include/net/xfrm.h | 22 ++++++++- net/xfrm/xfrm_device.c | 47 ++++++++++++++----- net/xfrm/xfrm_output.c | 6 ++- net/xfrm/xfrm_state.c | 40 +++++++--------- net/xfrm/xfrm_user.c | 2 +- 16 files changed, 84 insertions(+), 185 deletions(-)
Signature · 1 line
2.48.1
PATCH 1/5 xfrm: delay initialization of offload path till its actually requested
From: Leon Romanovsky <[email protected]>
XFRM offload path is probed even if offload isn't needed at all. Let's make sure that x->type_offload pointer stays NULL for such path to reduce ambiguity.
--- include/net/xfrm.h | 12 +++++++++++- net/xfrm/xfrm_device.c | 14 +++++++++----- net/xfrm/xfrm_state.c | 22 +++++++++------------- net/xfrm/xfrm_user.c | 2 +- 4 files changed, 30 insertions(+), 20 deletions(-)
include/net/xfrm.h +11 -1
@@ -464,6 +464,16 @@ struct xfrm_type_offload {int xfrm_register_type_offload (const struct xfrm_type_offload *type,unsigned short family);void xfrm_unregister_type_offload (const struct xfrm_type_offload *type,unsigned short family); +const struct xfrm_type_offload *xfrm_get_type_offload (u8 proto, +unsigned short family); +static inline void xfrm_put_type_offload (const struct xfrm_type_offload *type) +{ +if (!type) +return ; + +module_put (type->owner); +} +/** * struct xfrm_mode_cbs - XFRM mode callbacks
@@ -1760,7 +1770,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);u32 xfrm_replay_seqhi (struct xfrm_state *x,__be32 net_seq);int xfrm_init_replay (struct xfrm_state *x,struct netlink_ext_ack *extack);u32 xfrm_state_mtu (struct xfrm_state *x,int mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay,bool offload, +int __xfrm_init_state (struct xfrm_state *x,bool init_replay,struct netlink_ext_ack *extack);int xfrm_init_state (struct xfrm_state *x);int xfrm_input (struct sk_buff *skb,int nexthdr,__be32 spi,int encap_type);
net/xfrm/xfrm_device.c +9 -5
@@ -244,11 +244,6 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,xfrm_address_t *daddr;bool is_packet_offload; -if (!x->type_offload) { -NL_SET_ERR_MSG (extack,"Type doesn't support offload" ); -return -EINVAL ; - } -if (xuo->flags & ~(XFRM_OFFLOAD_IPV6 |XFRM_OFFLOAD_INBOUND |XFRM_OFFLOAD_PACKET )) {NL_SET_ERR_MSG (extack,"Unrecognized flags in offload request" );
@@ -310,6 +305,13 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,return -EINVAL ; } + x->type_offload =xfrm_get_type_offload (x->id.proto, x->props.family); +if (!x->type_offload) { +NL_SET_ERR_MSG (extack,"Type doesn't support offload" ); +dev_put (dev); +return -EINVAL ; + } + xso->dev = dev;netdev_tracker_alloc (dev, &xso->dev_tracker,GFP_ATOMIC ); xso->real_dev = dev;
@@ -332,6 +334,8 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,netdev_put (dev, &xso->dev_tracker); xso->type =XFRM_DEV_OFFLOAD_UNSPECIFIED ; +xfrm_put_type_offload (x->type_offload); + x->type_offload =NULL ;/* User explicitly requested packet offload mode and configured * policy in addition to the XFRM state. So be civil to users, * and return an error instead of taking fallback path.
net/xfrm/xfrm_state.c +9 -13
@@ -424,11 +424,12 @@ void xfrm_unregister_type_offload(const struct xfrm_type_offload *type, }EXPORT_SYMBOL (xfrm_unregister_type_offload); -static const struct xfrm_type_offload * -xfrm_get_type_offload (u8 proto,unsigned short family,bool try_load) +const struct xfrm_type_offload *xfrm_get_type_offload (u8 proto, +unsigned short family) {const struct xfrm_type_offload *type =NULL ;struct xfrm_state_afinfo *afinfo; +bool try_load = true; retry: afinfo =xfrm_state_get_afinfo (family);
@@ -456,11 +457,7 @@ xfrm_get_type_offload(u8 proto, unsigned short family, bool try_load)return type; } - -static void xfrm_put_type_offload (const struct xfrm_type_offload *type) -{ -module_put (type->owner); -} +EXPORT_SYMBOL (xfrm_get_type_offload);static const struct xfrm_mode xfrm4_mode_map[XFRM_MODE_MAX ] = { [XFRM_MODE_BEET ] = {
@@ -609,8 +606,6 @@ static void ___xfrm_state_destroy(struct xfrm_state *x)kfree (x->coaddr);kfree (x->replay_esn);kfree (x->preplay_esn); -if (x->type_offload) -xfrm_put_type_offload (x->type_offload);if (x->type) { x->type->destructor (x);xfrm_put_type (x->type);
@@ -784,6 +779,9 @@ void xfrm_dev_state_free(struct xfrm_state *x)struct xfrm_dev_offload *xso = &x->xso;struct net_device *dev =READ_ONCE (xso->dev); +xfrm_put_type_offload (x->type_offload); + x->type_offload =NULL ; +if (dev && dev->xfrmdev_ops) {spin_lock_bh (&xfrm_state_dev_gc_lock);if (!hlist_unhashed (&x->dev_gclist))
@@ -3122,7 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay,bool offload, +int __xfrm_init_state (struct xfrm_state *x,bool init_replay,struct netlink_ext_ack *extack) {const struct xfrm_mode *inner_mode;
@@ -3178,8 +3176,6 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload, goto error; } - x->type_offload =xfrm_get_type_offload (x->id.proto, family, offload); - err = x->type->init_state (x, extack);if (err) goto error;
@@ -3229,7 +3225,7 @@ int xfrm_init_state(struct xfrm_state *x) {int err; - err =__xfrm_init_state (x, true, false,NULL ); + err =__xfrm_init_state (x, true,NULL );if (!err) x->km.state =XFRM_STATE_VALID ;
net/xfrm/xfrm_user.c +1 -1
@@ -907,7 +907,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, goto error; } - err =__xfrm_init_state (x, false, attrs[XFRMA_OFFLOAD_DEV ], extack); + err =__xfrm_init_state (x, false, extack);if (err) goto error;
Signature · 1 line
2.48.1
PATCH 2/5 xfrm: simplify SA initialization routine
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
SA replay mode is initialized differently for user-space and kernel-space users, but the call to xfrm_init_replay() existed in common path with boolean protection. That caused to situation where we have two different function orders.
So let's rewrite the SA initialization flow to have same order for both in-kernel and user-space callers.
--- include/net/xfrm.h | 3 +-- net/xfrm/xfrm_state.c | 22 ++++++++++------------ net/xfrm/xfrm_user.c | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-)
include/net/xfrm.h +1 -2
@@ -1770,8 +1770,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);u32 xfrm_replay_seqhi (struct xfrm_state *x,__be32 net_seq);int xfrm_init_replay (struct xfrm_state *x,struct netlink_ext_ack *extack);u32 xfrm_state_mtu (struct xfrm_state *x,int mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack); +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack);int xfrm_init_state (struct xfrm_state *x);int xfrm_input (struct sk_buff *skb,int nexthdr,__be32 spi,int encap_type);int xfrm_input_resume (struct sk_buff *skb,int nexthdr);
net/xfrm/xfrm_state.c +10 -12
@@ -3120,8 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack) +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack) {const struct xfrm_mode *inner_mode;const struct xfrm_mode *outer_mode;
@@ -3188,12 +3187,6 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay, } x->outer_mode = *outer_mode; -if (init_replay) { - err =xfrm_init_replay (x, extack); -if (err) - goto error; - } -if (x->nat_keepalive_interval) {if (x->dir !=XFRM_SA_DIR_OUT ) {NL_SET_ERR_MSG (extack,"NAT keepalive is only supported for outbound SAs" );
@@ -3225,11 +3218,16 @@ int xfrm_init_state(struct xfrm_state *x) {int err; - err =__xfrm_init_state (x, true,NULL ); -if (!err) - x->km.state =XFRM_STATE_VALID ; + err =__xfrm_init_state (x,NULL ); +if (err) +return err; -return err; + err =xfrm_init_replay (x,NULL ); +if (err) +return err; + + x->km.state =XFRM_STATE_VALID ; +return 0 ; }EXPORT_SYMBOL (xfrm_init_state);
net/xfrm/xfrm_user.c +1 -1
@@ -907,7 +907,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, goto error; } - err =__xfrm_init_state (x, false, extack); + err =__xfrm_init_state (x, extack);if (err) goto error;
Signature · 1 line
2.48.1
PATCH 4/5 xfrm: provide common xdo_dev_offload_ok callback implementation
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Almost all drivers except bond and nsim had same check if device can perform XFRM offload on that specific packet. The check was that packet doesn't have IPv4 options and IPv6 extensions.
In NIC drivers, the IPv4 HELEN comparison was slightly different, but the intent was to check for the same conditions. So let's chose more strict variant as a common base.
--- Documentation/networking/xfrm_device.rst | 3 ++- drivers/net/bonding/bond_main.c | 16 +++++--------- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 21 ------------------- .../inline_crypto/ch_ipsec/chcr_ipsec.c | 16 -------------- .../net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 21 ------------------- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 21 ------------------- .../marvell/octeontx2/nic/cn10k_ipsec.c | 15 ------------- .../mellanox/mlx5/core/en_accel/ipsec.c | 16 -------------- .../net/ethernet/netronome/nfp/crypto/ipsec.c | 11 ---------- drivers/net/netdevsim/ipsec.c | 11 ---------- drivers/net/netdevsim/netdevsim.h | 1 - net/xfrm/xfrm_device.c | 15 +++++++++++++ 12 files changed, 22 insertions(+), 145 deletions(-)
Documentation/networking/xfrm_device.rst +2 -1
@@ -126,7 +126,8 @@ been setup for offload, it first calls into xdo_dev_offload_ok() with the skb and the intended offload state to ask the driver if the offload will serviceable. This can check the packet information to be sure the offload can be supported (e.g. IPv4 or IPv6, no IPv4 options, etc) and -return true of false to signify its support. +return true of false to signify its support. In case driver doesn't implement +this callback, the stack provides reasonable defaults. Crypto offload mode: When ready to send, the driver needs to inspect the Tx packet for the
drivers/net/bonding/bond_main.c +5 -11
@@ -676,22 +676,16 @@ static void bond_ipsec_free_sa(struct xfrm_state *xs)static bool bond_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs) {struct net_device *real_dev; -bool ok = false;rcu_read_lock (); real_dev =bond_ipsec_dev (xs); -if (!real_dev) - goto out; - -if (!real_dev->xfrmdev_ops || - !real_dev->xfrmdev_ops->xdo_dev_offload_ok || -netif_is_bond_master (real_dev)) - goto out; +if (!real_dev ||netif_is_bond_master (real_dev)) { +rcu_read_unlock (); +return false; + } - ok = real_dev->xfrmdev_ops->xdo_dev_offload_ok (skb, xs); -out:rcu_read_unlock (); -return ok; +return true; }/**
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +0 -21
@@ -6538,26 +6538,6 @@ static void cxgb4_xfrm_free_state(struct xfrm_state *x)mutex_unlock (&uld_mutex); } -static bool cxgb4_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *x) -{ -struct adapter *adap =netdev2adap (x->xso.dev); -bool ret = false; - -if (!mutex_trylock (&uld_mutex)) { -dev_dbg (adap->pdev_dev, -"crypto uld critical resource is under use\n" ); -return ret; - } -if (chcr_offload_state (adap,CXGB4_XFRMDEV_OPS )) - goto out_unlock; - - ret = adap->uld[CXGB4_ULD_IPSEC ].xfrmdev_ops->xdo_dev_offload_ok (skb, x); - -out_unlock: -mutex_unlock (&uld_mutex); -return ret; -} -static void cxgb4_advance_esn_state (struct xfrm_state *x) {struct adapter *adap =netdev2adap (x->xso.dev);
@@ -6583,7 +6563,6 @@ static const struct xfrmdev_ops cxgb4_xfrmdev_ops = { .xdo_dev_state_add = cxgb4_xfrm_add_state, .xdo_dev_state_delete = cxgb4_xfrm_del_state, .xdo_dev_state_free = cxgb4_xfrm_free_state, - .xdo_dev_offload_ok = cxgb4_ipsec_offload_ok, .xdo_dev_state_advance_esn = cxgb4_advance_esn_state, };
drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c +0 -16
@@ -71,7 +71,6 @@static LIST_HEAD (uld_ctx_list);static DEFINE_MUTEX (dev_mutex); -static bool ch_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *x);static int ch_ipsec_uld_state_change (void *handle,enum cxgb4_state new_state);static int ch_ipsec_xmit (struct sk_buff *skb,struct net_device *dev);static void *ch_ipsec_uld_add (const struct cxgb4_lld_info *infop);
@@ -85,7 +84,6 @@ static const struct xfrmdev_ops ch_ipsec_xfrmdev_ops = { .xdo_dev_state_add = ch_ipsec_xfrm_add_state, .xdo_dev_state_delete = ch_ipsec_xfrm_del_state, .xdo_dev_state_free = ch_ipsec_xfrm_free_state, - .xdo_dev_offload_ok = ch_ipsec_offload_ok, .xdo_dev_state_advance_esn = ch_ipsec_advance_esn_state, };
@@ -323,20 +321,6 @@ static void ch_ipsec_xfrm_free_state(struct xfrm_state *x)module_put (THIS_MODULE ); } -static bool ch_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *x) -{ -if (x->props.family ==AF_INET ) { -/* Offload with IP options is not supported yet */ -if (ip_hdr (skb)->ihl >5 ) -return false; - }else { -/* Offload with IPv6 extension headers is not support yet */ -if (ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr)) -return false; - } -return true; -} -static void ch_ipsec_advance_esn_state (struct xfrm_state *x) {/* do nothing */
drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +0 -21
@@ -817,30 +817,9 @@ static void ixgbe_ipsec_del_sa(struct xfrm_state *xs) } } -/** -* ixgbe_ipsec_offload_ok - can this packet use the xfrm hw offload -* @skb: current data packet -* @xs: pointer to transformer state struct -**/ -static bool ixgbe_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs) -{ -if (xs->props.family ==AF_INET ) { -/* Offload with IPv4 options is not supported yet */ -if (ip_hdr (skb)->ihl !=5 ) -return false; - }else { -/* Offload with IPv6 extension headers is not support yet */ -if (ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr)) -return false; - } - -return true; -} -static const struct xfrmdev_ops ixgbe_xfrmdev_ops = { .xdo_dev_state_add = ixgbe_ipsec_add_sa, .xdo_dev_state_delete = ixgbe_ipsec_del_sa, - .xdo_dev_offload_ok = ixgbe_ipsec_offload_ok, };/**
drivers/net/ethernet/intel/ixgbevf/ipsec.c +0 -21
@@ -428,30 +428,9 @@ static void ixgbevf_ipsec_del_sa(struct xfrm_state *xs) } } -/** -* ixgbevf_ipsec_offload_ok - can this packet use the xfrm hw offload -* @skb: current data packet -* @xs: pointer to transformer state struct -**/ -static bool ixgbevf_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs) -{ -if (xs->props.family ==AF_INET ) { -/* Offload with IPv4 options is not supported yet */ -if (ip_hdr (skb)->ihl !=5 ) -return false; - }else { -/* Offload with IPv6 extension headers is not support yet */ -if (ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr)) -return false; - } - -return true; -} -static const struct xfrmdev_ops ixgbevf_xfrmdev_ops = { .xdo_dev_state_add = ixgbevf_ipsec_add_sa, .xdo_dev_state_delete = ixgbevf_ipsec_del_sa, - .xdo_dev_offload_ok = ixgbevf_ipsec_offload_ok, };/**
drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c +0 -15
@@ -744,24 +744,9 @@ static void cn10k_ipsec_del_state(struct xfrm_state *x)queue_work (pf->ipsec.sa_workq, &pf->ipsec.sa_work); } -static bool cn10k_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *x) -{ -if (x->props.family ==AF_INET ) { -/* Offload with IPv4 options is not supported yet */ -if (ip_hdr (skb)->ihl >5 ) -return false; - }else { -/* Offload with IPv6 extension headers is not support yet */ -if (ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr)) -return false; - } -return true; -} -static const struct xfrmdev_ops cn10k_ipsec_xfrmdev_ops = { .xdo_dev_state_add = cn10k_ipsec_add_state, .xdo_dev_state_delete = cn10k_ipsec_del_state, - .xdo_dev_offload_ok = cn10k_ipsec_offload_ok, };static void cn10k_ipsec_sa_wq_handler (struct work_struct *work)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +0 -16
@@ -953,21 +953,6 @@ void mlx5e_ipsec_cleanup(struct mlx5e_priv *priv) priv->ipsec =NULL ; } -static bool mlx5e_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *x) -{ -if (x->props.family ==AF_INET ) { -/* Offload with IPv4 options is not supported yet */ -if (ip_hdr (skb)->ihl >5 ) -return false; - }else { -/* Offload with IPv6 extension headers is not support yet */ -if (ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr)) -return false; - } - -return true; -} -static void mlx5e_xfrm_advance_esn_state (struct xfrm_state *x) {struct mlx5e_ipsec_sa_entry *sa_entry =to_ipsec_sa_entry (x);
@@ -1196,7 +1181,6 @@ static const struct xfrmdev_ops mlx5e_ipsec_xfrmdev_ops = { .xdo_dev_state_add = mlx5e_xfrm_add_state, .xdo_dev_state_delete = mlx5e_xfrm_del_state, .xdo_dev_state_free = mlx5e_xfrm_free_state, - .xdo_dev_offload_ok = mlx5e_ipsec_offload_ok, .xdo_dev_state_advance_esn = mlx5e_xfrm_advance_esn_state, .xdo_dev_state_update_stats = mlx5e_xfrm_update_stats,
drivers/net/ethernet/netronome/nfp/crypto/ipsec.c +0 -11
@@ -565,20 +565,9 @@ static void nfp_net_xfrm_del_state(struct xfrm_state *x)xa_erase (&nn->xa_ipsec, x->xso.offload_handle -1 ); } -static bool nfp_net_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *x) -{ -if (x->props.family ==AF_INET ) -/* Offload with IPv4 options is not supported yet */ -return ip_hdr (skb)->ihl ==5 ; - -/* Offload with IPv6 extension headers is not support yet */ -return !(ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr)); -} -static const struct xfrmdev_ops nfp_net_ipsec_xfrmdev_ops = { .xdo_dev_state_add = nfp_net_xfrm_add_state, .xdo_dev_state_delete = nfp_net_xfrm_del_state, - .xdo_dev_offload_ok = nfp_net_ipsec_offload_ok, };void nfp_net_ipsec_init (struct nfp_net *nn)
drivers/net/netdevsim/ipsec.c +0 -11
@@ -217,20 +217,9 @@ static void nsim_ipsec_del_sa(struct xfrm_state *xs) ipsec->count--; } -static bool nsim_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs) -{ -struct netdevsim *ns =netdev_priv (xs->xso.real_dev); -struct nsim_ipsec *ipsec = &ns->ipsec; - - ipsec->ok++; - -return true; -} -static const struct xfrmdev_ops nsim_xfrmdev_ops = { .xdo_dev_state_add = nsim_ipsec_add_sa, .xdo_dev_state_delete = nsim_ipsec_del_sa, - .xdo_dev_offload_ok = nsim_ipsec_offload_ok, };bool nsim_ipsec_tx (struct netdevsim *ns,struct sk_buff *skb)
drivers/net/netdevsim/netdevsim.h +0 -1
@@ -54,7 +54,6 @@ struct nsim_ipsec {struct dentry *pfile;u32 count;u32 tx; -u32 ok; };#define NSIM_MACSEC_MAX_SECY_COUNT 3
net/xfrm/xfrm_device.c +15 -0
@@ -436,6 +436,21 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x)return false; ok: +switch (x->props.family) { +case AF_INET : +/* Check for IPv4 options */ +if (ip_hdr (skb)->ihl !=5 ) +return false; +break ; +case AF_INET6 : +/* Check for IPv6 extensions */ +if (ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr)) +return false; +break ; +default : +break ; + } +if (dev->xfrmdev_ops->xdo_dev_offload_ok)return dev->xfrmdev_ops->xdo_dev_offload_ok (skb, x);
Signature · 1 line
2.48.1
PATCH 5/5 xfrm: check for PMTU in tunnel mode for packet offload
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
In tunnel mode, for the packet offload, there were no PMTU signaling to the upper level about need to fragment the packet. As a solution, call to already existing xfrm[4|6]_tunnel_check_size() to perform that.
--- include/net/xfrm.h | 9 +++++++++ net/xfrm/xfrm_device.c | 10 ++++++++-- net/xfrm/xfrm_output.c | 6 ++++-- 3 files changed, 21 insertions(+), 4 deletions(-)
include/net/xfrm.h +9 -0
@@ -1782,6 +1782,15 @@ int xfrm_trans_queue(struct sk_buff *skb, struct sk_buff *));int xfrm_output_resume (struct sock *sk,struct sk_buff *skb,int err);int xfrm_output (struct sock *sk,struct sk_buff *skb); +int xfrm4_tunnel_check_size (struct sk_buff *skb); +#if IS_ENABLED (CONFIG_IPV6 ) +int xfrm6_tunnel_check_size (struct sk_buff *skb); +#else +static inline int xfrm6_tunnel_check_size (struct sk_buff *skb) +{ +return -EMSGSIZE ; +} +#endif #if IS_ENABLED (CONFIG_NET_PKTGEN )int pktgen_xfrm_outer_mode_output (struct xfrm_state *x,struct sk_buff *skb);
net/xfrm/xfrm_device.c +8 -2
@@ -419,12 +419,12 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x)struct dst_entry *dst =skb_dst (skb);struct xfrm_dst *xdst = (struct xfrm_dst *)dst;struct net_device *dev = x->xso.dev; +bool check_tunnel_size;if (x->xso.type ==XFRM_DEV_OFFLOAD_UNSPECIFIED )return false; -if (x->xso.type ==XFRM_DEV_OFFLOAD_PACKET || - ((dev ==xfrm_dst_path (dst)->dev) && !xdst->child->xfrm)) { +if ((dev ==xfrm_dst_path (dst)->dev) && !xdst->child->xfrm) { mtu =xfrm_state_mtu (x, xdst->child_mtu_cached);if (skb->len <= mtu) goto ok;
@@ -436,16 +436,22 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x)return false; ok: + check_tunnel_size = x->xso.type ==XFRM_DEV_OFFLOAD_PACKET && + x->props.mode ==XFRM_MODE_TUNNEL ;switch (x->props.family) {case AF_INET :/* Check for IPv4 options */ if (ip_hdr (skb)->ihl !=5 )return false; +if (check_tunnel_size &&xfrm4_tunnel_check_size (skb)) +return false;break ;case AF_INET6 :/* Check for IPv6 extensions */ if (ipv6_ext_hdr (ipv6_hdr (skb)->nexthdr))return false; +if (check_tunnel_size &&xfrm6_tunnel_check_size (skb)) +return false;break ;default :break ;
net/xfrm/xfrm_output.c +4 -2
@@ -786,7 +786,7 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb) }EXPORT_SYMBOL_GPL (xfrm_output); -static int xfrm4_tunnel_check_size (struct sk_buff *skb) +int xfrm4_tunnel_check_size (struct sk_buff *skb) {int mtu, ret =0 ;
@@ -812,6 +812,7 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb) out:return ret; } +EXPORT_SYMBOL_GPL (xfrm4_tunnel_check_size);static int xfrm4_extract_output (struct xfrm_state *x,struct sk_buff *skb) {
@@ -834,7 +835,7 @@ static int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb) }#if IS_ENABLED (CONFIG_IPV6 ) -static int xfrm6_tunnel_check_size (struct sk_buff *skb) +int xfrm6_tunnel_check_size (struct sk_buff *skb) {int mtu, ret =0 ;struct dst_entry *dst =skb_dst (skb);
@@ -864,6 +865,7 @@ static int xfrm6_tunnel_check_size(struct sk_buff *skb) out: return ret; } +EXPORT_SYMBOL_GPL (xfrm6_tunnel_check_size);#endif static int xfrm6_extract_output (struct xfrm_state *x,struct sk_buff *skb)
Signature · 1 line
2.48.1
PATCH 3/5 xfrm: rely on XFRM offload
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
After change of initialization of x->type_offload pointer to be valid only for offloaded SAs. There is no need to rely both on x->type_offload and x->xso.type to determine if SA is offloaded or not.
--- net/xfrm/xfrm_device.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
net/xfrm/xfrm_device.c +4 -6
@@ -420,13 +420,11 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x)struct xfrm_dst *xdst = (struct xfrm_dst *)dst;struct net_device *dev = x->xso.dev; -if (!x->type_offload || - (x->xso.type ==XFRM_DEV_OFFLOAD_UNSPECIFIED && x->encap)) +if (x->xso.type ==XFRM_DEV_OFFLOAD_UNSPECIFIED )return false;if (x->xso.type ==XFRM_DEV_OFFLOAD_PACKET || - ((!dev || (dev ==xfrm_dst_path (dst)->dev)) && - !xdst->child->xfrm)) { + ((dev ==xfrm_dst_path (dst)->dev) && !xdst->child->xfrm)) { mtu =xfrm_state_mtu (x, xdst->child_mtu_cached);if (skb->len <= mtu) goto ok;
@@ -438,8 +436,8 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x)return false; ok: -if (dev && dev->xfrmdev_ops && dev->xfrmdev_ops->xdo_dev_offload_ok) -return x->xso.dev->xfrmdev_ops->xdo_dev_offload_ok (skb, x); +if (dev->xfrmdev_ops->xdo_dev_offload_ok) +return dev->xfrmdev_ops->xdo_dev_offload_ok (skb, x);return true; }
Signature · 1 line
2.48.1
Re: [PATCH ipsec-next 1/5] xfrm: delay initialization of offload path till its actually requested
In reply to Leon RomanovskyHi Leon,
Quoted 77 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
XFRM offload path is probed even if offload isn't needed at all. Let's make sure that
x->type_offloadpointer stays NULL for such path to reduce ambiguity.Fixes 9d389d7f84bb ("xfrm: Add a xfrm type offload.")Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 12 +++++++++++- net/xfrm/xfrm_device.c | 14 +++++++++----- net/xfrm/xfrm_state.c | 22 +++++++++------------- net/xfrm/xfrm_user.c | 2 +- 4 files changed, 30 insertions(+), 20 deletions(-)include/net/xfrm.h +11
-1@@ -464,6 +464,16 @@ struct xfrm_type_offload {int xfrm_register_type_offload (const struct xfrm_type_offload *type,unsigned short family);void xfrm_unregister_type_offload (const struct xfrm_type_offload *type,unsigned short family); +const struct xfrm_type_offload *xfrm_get_type_offload (u8 proto, +unsigned short family); +static inline void xfrm_put_type_offload (const struct xfrm_type_offload *type) +{ +if (!type) +return ; + +module_put (type->owner); +} +/** * struct xfrm_mode_cbs - XFRM mode callbacks @@ -1760,7 +1770,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);u32 xfrm_replay_seqhi (struct xfrm_state *x,__be32 net_seq);int xfrm_init_replay (struct xfrm_state *x,struct netlink_ext_ack *extack);u32 xfrm_state_mtu (struct xfrm_state *x,int mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay,bool offload, +int __xfrm_init_state (struct xfrm_state *x,bool init_replay,struct netlink_ext_ack *extack);int xfrm_init_state (struct xfrm_state *x);int xfrm_input (struct sk_buff *skb,int nexthdr,__be32 spi,int encap_type);net/xfrm/xfrm_device.c +7
-5@@ -244,11 +244,6 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,xfrm_address_t *daddr;bool is_packet_offload; -if (!x->type_offload) { -NL_SET_ERR_MSG (extack,"Type doesn't support offload" ); -return -EINVAL ; - } -if (xuo->flags & ~(XFRM_OFFLOAD_IPV6 |XFRM_OFFLOAD_INBOUND |XFRM_OFFLOAD_PACKET )) {NL_SET_ERR_MSG (extack,"Unrecognized flags in offload request" );@@ -310,6 +305,13 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,return -EINVAL ; } + x->type_offload =xfrm_get_type_offload (x->id.proto, x->props.family); +if (!x->type_offload) { +NL_SET_ERR_MSG (extack,"Type doesn't support offload" ); +dev_put (dev); +return -EINVAL ; + } + xso->dev = dev;netdev_tracker_alloc (dev, &xso->dev_tracker,GFP_ATOMIC ); xso->real_dev = dev;
net/xfrm/xfrm_device.c int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, · line 338
Quoted 5 lines
net/xfrm/xfrm_device.c +2
-0@@ -332,6 +334,8 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,netdev_put (dev, &xso->dev_tracker); xso->type =XFRM_DEV_OFFLOAD_UNSPECIFIED ; +xfrm_put_type_offload (x->type_offload); + x->type_offload =NULL ;
We always set type_offload to NULL. Can we move type_offload = NULL in xfrm_put_type_offload() ?
Thanks
-Bharat
Quoted 98 lines
net/xfrm/xfrm_device.c +0
-0/* User explicitly requested packet offload mode and configured * policy in addition to the XFRM state. So be civil to users, * and return an error instead of taking fallback path. net/xfrm/xfrm_state.c +9
-13@@ -424,11 +424,12 @@ void xfrm_unregister_type_offload(const struct xfrm_type_offload *type, }EXPORT_SYMBOL (xfrm_unregister_type_offload); -static const struct xfrm_type_offload * -xfrm_get_type_offload (u8 proto,unsigned short family,bool try_load) +const struct xfrm_type_offload *xfrm_get_type_offload (u8 proto, +unsigned short family) {const struct xfrm_type_offload *type =NULL ;struct xfrm_state_afinfo *afinfo; +bool try_load = true; retry: afinfo =xfrm_state_get_afinfo (family);@@ -456,11 +457,7 @@ xfrm_get_type_offload(u8 proto, unsigned short family, bool try_load)return type; } - -static void xfrm_put_type_offload (const struct xfrm_type_offload *type) -{ -module_put (type->owner); -} +EXPORT_SYMBOL (xfrm_get_type_offload);static const struct xfrm_mode xfrm4_mode_map[XFRM_MODE_MAX ] = { [XFRM_MODE_BEET ] = {@@ -609,8 +606,6 @@ static void ___xfrm_state_destroy(struct xfrm_state *x)kfree (x->coaddr);kfree (x->replay_esn);kfree (x->preplay_esn); -if (x->type_offload) -xfrm_put_type_offload (x->type_offload);if (x->type) { x->type->destructor (x);xfrm_put_type (x->type);@@ -784,6 +779,9 @@ void xfrm_dev_state_free(struct xfrm_state *x)struct xfrm_dev_offload *xso = &x->xso;struct net_device *dev =READ_ONCE (xso->dev); +xfrm_put_type_offload (x->type_offload); + x->type_offload =NULL ; +if (dev && dev->xfrmdev_ops) {spin_lock_bh (&xfrm_state_dev_gc_lock);if (!hlist_unhashed (&x->dev_gclist))@@ -3122,7 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay,bool offload, +int __xfrm_init_state (struct xfrm_state *x,bool init_replay,struct netlink_ext_ack *extack) {const struct xfrm_mode *inner_mode;@@ -3178,8 +3176,6 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload, goto error; } - x->type_offload =xfrm_get_type_offload (x->id.proto, family, offload); - err = x->type->init_state (x, extack);if (err) goto error;@@ -3229,7 +3225,7 @@ int xfrm_init_state(struct xfrm_state *x) {int err; - err =__xfrm_init_state (x, true, false,NULL ); + err =__xfrm_init_state (x, true,NULL );if (!err) x->km.state =XFRM_STATE_VALID ;net/xfrm/xfrm_user.c +1
-2@@ -907,7 +907,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, goto error; } - err =__xfrm_init_state (x, false, attrs[XFRMA_OFFLOAD_DEV ], extack); + err =__xfrm_init_state (x, false, extack);if (err) goto error; --2.48.1
Re: [PATCH ipsec-next 1/5] xfrm: delay initialization of offload path till its actually requested
Quoted 18 lines · Bharat Bhushan
Hi Leon,
Quoted 15 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
XFRM offload path is probed even if offload isn't needed at all. Let's make sure that
x->type_offloadpointer stays NULL for such path to reduce ambiguity.Fixes 9d389d7f84bb ("xfrm: Add a xfrm type offload.")Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 12 +++++++++++- net/xfrm/xfrm_device.c | 14 +++++++++----- net/xfrm/xfrm_state.c | 22 +++++++++------------- net/xfrm/xfrm_user.c | 2 +- 4 files changed, 30 insertions(+), 20 deletions(-)
<...>
Quoted 2 lines
Quoted 2 lines
net/xfrm/xfrm_device.c +2
-0+ x->type_offload =xfrm_get_type_offload (x->id.proto, x->props.family); +if (!x->type_offload) {
<...>
Quoted 5 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ xfrm_put_type_offload(x->type_offload); + x->type_offload = NULL;We always set
type_offloadto NULL. Can we movetype_offload= NULL inxfrm_put_type_offload()?
We can, but it will require change to xfrm_get_type_offload() too, otherwise we will get asymmetrical get/put.
Do you want something like that?
int xfrm_get_type_offload(struct xfrm_state *x);
void xfrm_put_type_offload(struct xfrm_state *x);
Thansk
Quoted 103 lines
Thanks
-BharatQuoted 98 lines
/* User explicitly requested packet offload mode and configured
* policy in addition to the XFRM state. So be civil to users,
* and return an error instead of taking fallback path.net/xfrm/xfrm_state.c +9
-13@@ -424,11 +424,12 @@ void xfrm_unregister_type_offload(const struct xfrm_type_offload *type, }EXPORT_SYMBOL (xfrm_unregister_type_offload); -static const struct xfrm_type_offload * -xfrm_get_type_offload (u8 proto,unsigned short family,bool try_load) +const struct xfrm_type_offload *xfrm_get_type_offload (u8 proto, +unsigned short family) {const struct xfrm_type_offload *type =NULL ;struct xfrm_state_afinfo *afinfo; +bool try_load = true; retry: afinfo =xfrm_state_get_afinfo (family);@@ -456,11 +457,7 @@ xfrm_get_type_offload(u8 proto, unsigned short family, bool try_load)return type; } - -static void xfrm_put_type_offload (const struct xfrm_type_offload *type) -{ -module_put (type->owner); -} +EXPORT_SYMBOL (xfrm_get_type_offload);static const struct xfrm_mode xfrm4_mode_map[XFRM_MODE_MAX ] = { [XFRM_MODE_BEET ] = {@@ -609,8 +606,6 @@ static void ___xfrm_state_destroy(struct xfrm_state *x)kfree (x->coaddr);kfree (x->replay_esn);kfree (x->preplay_esn); -if (x->type_offload) -xfrm_put_type_offload (x->type_offload);if (x->type) { x->type->destructor (x);xfrm_put_type (x->type);@@ -784,6 +779,9 @@ void xfrm_dev_state_free(struct xfrm_state *x)struct xfrm_dev_offload *xso = &x->xso;struct net_device *dev =READ_ONCE (xso->dev); +xfrm_put_type_offload (x->type_offload); + x->type_offload =NULL ; +if (dev && dev->xfrmdev_ops) {spin_lock_bh (&xfrm_state_dev_gc_lock);if (!hlist_unhashed (&x->dev_gclist))@@ -3122,7 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay,bool offload, +int __xfrm_init_state (struct xfrm_state *x,bool init_replay,struct netlink_ext_ack *extack) {const struct xfrm_mode *inner_mode;@@ -3178,8 +3176,6 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload, goto error; } - x->type_offload =xfrm_get_type_offload (x->id.proto, family, offload); - err = x->type->init_state (x, extack);if (err) goto error;@@ -3229,7 +3225,7 @@ int xfrm_init_state(struct xfrm_state *x) {int err; - err =__xfrm_init_state (x, true, false,NULL ); + err =__xfrm_init_state (x, true,NULL );if (!err) x->km.state =XFRM_STATE_VALID ;net/xfrm/xfrm_user.c +1
-2@@ -907,7 +907,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, goto error; } - err =__xfrm_init_state (x, false, attrs[XFRMA_OFFLOAD_DEV ], extack); + err =__xfrm_init_state (x, false, extack);if (err) goto error; --2.48.1
Re: [PATCH ipsec-next 1/5] xfrm: delay initialization of offload path till its actually requested
Quoted 28 lines · Leon Romanovsky
Quoted 18 lines · Bharat Bhushan
Hi Leon,
Quoted 15 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
XFRM offload path is probed even if offload isn't needed at all. Let's make sure that
x->type_offloadpointer stays NULL for such path to reduce ambiguity.Fixes 9d389d7f84bb ("xfrm: Add a xfrm type offload.")Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 12 +++++++++++- net/xfrm/xfrm_device.c | 14 +++++++++----- net/xfrm/xfrm_state.c | 22 +++++++++------------- net/xfrm/xfrm_user.c | 2 +- 4 files changed, 30 insertions(+), 20 deletions(-)<...>
Quoted 2 lines
Quoted 2 lines
net/xfrm/xfrm_device.c +2
-0+ x->type_offload =xfrm_get_type_offload (x->id.proto, x->props.family); +if (!x->type_offload) {<...>
Quoted 8 lines
Quoted 5 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ xfrm_put_type_offload(x->type_offload); + x->type_offload = NULL;We always set
type_offloadto NULL. Can we movetype_offload= NULL inxfrm_put_type_offload()?We can, but it will require change to
xfrm_get_type_offload()too, otherwise we will get asymmetrical get/put.
"x->type_offload = NULL" is always set after the put() function. so I thought that maybe moving "x->type_offload = NULL" to the put() function would simplify.
Yes, get/put will be asymmetric. Maybe setting "x->type_offload" can be done in get/put().
Anyway it is not a major comment. ignore if this does not simplify.
Thanks
-Bharat
Quoted 110 lines
Do you want something like that?
intxfrm_get_type_offload(struct xfrm_state *x);
voidxfrm_put_type_offload(struct xfrm_state *x);Thansk
Quoted 103 lines
Thanks
-BharatQuoted 98 lines
/* User explicitly requested packet offload mode and configured
* policy in addition to the XFRM state. So be civil to users,
* and return an error instead of taking fallback path.net/xfrm/xfrm_state.c +9
-13@@ -424,11 +424,12 @@ void xfrm_unregister_type_offload(const struct xfrm_type_offload *type, }EXPORT_SYMBOL (xfrm_unregister_type_offload); -static const struct xfrm_type_offload * -xfrm_get_type_offload (u8 proto,unsigned short family,bool try_load) +const struct xfrm_type_offload *xfrm_get_type_offload (u8 proto, +unsigned short family) {const struct xfrm_type_offload *type =NULL ;struct xfrm_state_afinfo *afinfo; +bool try_load = true; retry: afinfo =xfrm_state_get_afinfo (family);@@ -456,11 +457,7 @@ xfrm_get_type_offload(u8 proto, unsigned short family, bool try_load)return type; } - -static void xfrm_put_type_offload (const struct xfrm_type_offload *type) -{ -module_put (type->owner); -} +EXPORT_SYMBOL (xfrm_get_type_offload);static const struct xfrm_mode xfrm4_mode_map[XFRM_MODE_MAX ] = { [XFRM_MODE_BEET ] = {@@ -609,8 +606,6 @@ static void ___xfrm_state_destroy(struct xfrm_state *x)kfree (x->coaddr);kfree (x->replay_esn);kfree (x->preplay_esn); -if (x->type_offload) -xfrm_put_type_offload (x->type_offload);if (x->type) { x->type->destructor (x);xfrm_put_type (x->type);@@ -784,6 +779,9 @@ void xfrm_dev_state_free(struct xfrm_state *x)struct xfrm_dev_offload *xso = &x->xso;struct net_device *dev =READ_ONCE (xso->dev); +xfrm_put_type_offload (x->type_offload); + x->type_offload =NULL ; +if (dev && dev->xfrmdev_ops) {spin_lock_bh (&xfrm_state_dev_gc_lock);if (!hlist_unhashed (&x->dev_gclist))@@ -3122,7 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay,bool offload, +int __xfrm_init_state (struct xfrm_state *x,bool init_replay,struct netlink_ext_ack *extack) {const struct xfrm_mode *inner_mode;@@ -3178,8 +3176,6 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload, goto error; } - x->type_offload =xfrm_get_type_offload (x->id.proto, family, offload); - err = x->type->init_state (x, extack);if (err) goto error;@@ -3229,7 +3225,7 @@ int xfrm_init_state(struct xfrm_state *x) {int err; - err =__xfrm_init_state (x, true, false,NULL ); + err =__xfrm_init_state (x, true,NULL );if (!err) x->km.state =XFRM_STATE_VALID ;net/xfrm/xfrm_user.c +1
-2@@ -907,7 +907,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, goto error; } - err =__xfrm_init_state (x, false, attrs[XFRMA_OFFLOAD_DEV ], extack); + err =__xfrm_init_state (x, false, extack);if (err) goto error; --2.48.1
Re: [PATCH ipsec-next 1/5] xfrm: delay initialization of offload path till its actually requested
Quoted 38 lines · Bharat Bhushan
Quoted 28 lines · Leon Romanovsky
Quoted 18 lines · Bharat Bhushan
Hi Leon,
Quoted 15 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
XFRM offload path is probed even if offload isn't needed at all. Let's make sure that
x->type_offloadpointer stays NULL for such path to reduce ambiguity.Fixes 9d389d7f84bb ("xfrm: Add a xfrm type offload.")Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 12 +++++++++++- net/xfrm/xfrm_device.c | 14 +++++++++----- net/xfrm/xfrm_state.c | 22 +++++++++------------- net/xfrm/xfrm_user.c | 2 +- 4 files changed, 30 insertions(+), 20 deletions(-)<...>
Quoted 2 lines
Quoted 2 lines
net/xfrm/xfrm_device.c +2
-0+ x->type_offload =xfrm_get_type_offload (x->id.proto, x->props.family); +if (!x->type_offload) {<...>
Quoted 8 lines
Quoted 5 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ xfrm_put_type_offload(x->type_offload); + x->type_offload = NULL;We always set
type_offloadto NULL. Can we movetype_offload= NULL inxfrm_put_type_offload()?We can, but it will require change to
xfrm_get_type_offload()too, otherwise we will get asymmetrical get/put.
Quoted 6 lines
"
x->type_offload= NULL" is always set after theput()function. so I thought that maybe moving "x->type_offload= NULL" to theput()function would simplify.
Yes, get/put will be asymmetric. Maybe setting "x->type_offload" can be done in get/put().
Anyway it is not a major comment. ignore if this does not simplify.
Thanks, let's wait for other comments. If I need respin the series, I'll change the functions to the proposed below.
Thanks
Quoted 114 lines
Thanks
-BharatQuoted 110 lines
Do you want something like that?
intxfrm_get_type_offload(struct xfrm_state *x);
voidxfrm_put_type_offload(struct xfrm_state *x);Thansk
Quoted 103 lines
Thanks
-BharatQuoted 98 lines
/* User explicitly requested packet offload mode and configured
* policy in addition to the XFRM state. So be civil to users,
* and return an error instead of taking fallback path.net/xfrm/xfrm_state.c +9
-13@@ -424,11 +424,12 @@ void xfrm_unregister_type_offload(const struct xfrm_type_offload *type, }EXPORT_SYMBOL (xfrm_unregister_type_offload); -static const struct xfrm_type_offload * -xfrm_get_type_offload (u8 proto,unsigned short family,bool try_load) +const struct xfrm_type_offload *xfrm_get_type_offload (u8 proto, +unsigned short family) {const struct xfrm_type_offload *type =NULL ;struct xfrm_state_afinfo *afinfo; +bool try_load = true; retry: afinfo =xfrm_state_get_afinfo (family);@@ -456,11 +457,7 @@ xfrm_get_type_offload(u8 proto, unsigned short family, bool try_load)return type; } - -static void xfrm_put_type_offload (const struct xfrm_type_offload *type) -{ -module_put (type->owner); -} +EXPORT_SYMBOL (xfrm_get_type_offload);static const struct xfrm_mode xfrm4_mode_map[XFRM_MODE_MAX ] = { [XFRM_MODE_BEET ] = {@@ -609,8 +606,6 @@ static void ___xfrm_state_destroy(struct xfrm_state *x)kfree (x->coaddr);kfree (x->replay_esn);kfree (x->preplay_esn); -if (x->type_offload) -xfrm_put_type_offload (x->type_offload);if (x->type) { x->type->destructor (x);xfrm_put_type (x->type);@@ -784,6 +779,9 @@ void xfrm_dev_state_free(struct xfrm_state *x)struct xfrm_dev_offload *xso = &x->xso;struct net_device *dev =READ_ONCE (xso->dev); +xfrm_put_type_offload (x->type_offload); + x->type_offload =NULL ; +if (dev && dev->xfrmdev_ops) {spin_lock_bh (&xfrm_state_dev_gc_lock);if (!hlist_unhashed (&x->dev_gclist))@@ -3122,7 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay,bool offload, +int __xfrm_init_state (struct xfrm_state *x,bool init_replay,struct netlink_ext_ack *extack) {const struct xfrm_mode *inner_mode;@@ -3178,8 +3176,6 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload, goto error; } - x->type_offload =xfrm_get_type_offload (x->id.proto, family, offload); - err = x->type->init_state (x, extack);if (err) goto error;@@ -3229,7 +3225,7 @@ int xfrm_init_state(struct xfrm_state *x) {int err; - err =__xfrm_init_state (x, true, false,NULL ); + err =__xfrm_init_state (x, true,NULL );if (!err) x->km.state =XFRM_STATE_VALID ;net/xfrm/xfrm_user.c +1
-2@@ -907,7 +907,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, goto error; } - err =__xfrm_init_state (x, false, attrs[XFRMA_OFFLOAD_DEV ], extack); + err =__xfrm_init_state (x, false, extack);if (err) goto error; --2.48.1
Steffen Klassert
maintainerRe: [PATCH ipsec-next 2/5] xfrm: simplify SA initialization routine
In reply to Leon RomanovskyQuoted 36 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
SA replay mode is initialized differently for user-space and kernel-space users, but the call to
xfrm_init_replay()existed in common path with boolean protection. That caused to situation where we have two different function orders.So let's rewrite the SA initialization flow to have same order for both in-kernel and user-space callers.
Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 3 +-- net/xfrm/xfrm_state.c | 22 ++++++++++------------ net/xfrm/xfrm_user.c | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-)include/net/xfrm.h +1
-2@@ -1770,8 +1770,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);u32 xfrm_replay_seqhi (struct xfrm_state *x,__be32 net_seq);int xfrm_init_replay (struct xfrm_state *x,struct netlink_ext_ack *extack);u32 xfrm_state_mtu (struct xfrm_state *x,int mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack); +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack);int xfrm_init_state (struct xfrm_state *x);int xfrm_input (struct sk_buff *skb,int nexthdr,__be32 spi,int encap_type);int xfrm_input_resume (struct sk_buff *skb,int nexthdr);net/xfrm/xfrm_state.c +0
-0
net/xfrm/xfrm_state.c u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) · line 3123
Quoted 6 lines
net/xfrm/xfrm_state.c +1
-2@@ -3120,8 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack) +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack)
The whole point of having __xfrm_init_state was to sepatate codepaths that need init_replay and those who don't need it. That was a bandaid for something, unfortunately I don't remenber for what.
If we don't need that anymore, maybe we can merge __xfrm_init_state into xfrm_init_state, as it was before.
The rest of the patchset looks OK to me.
Re: [PATCH ipsec-next 2/5] xfrm: simplify SA initialization routine
Quoted 49 lines · Steffen Klassert
Quoted 36 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
SA replay mode is initialized differently for user-space and kernel-space users, but the call to
xfrm_init_replay()existed in common path with boolean protection. That caused to situation where we have two different function orders.So let's rewrite the SA initialization flow to have same order for both in-kernel and user-space callers.
Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 3 +-- net/xfrm/xfrm_state.c | 22 ++++++++++------------ net/xfrm/xfrm_user.c | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-)include/net/xfrm.h +1
-2@@ -1770,8 +1770,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);u32 xfrm_replay_seqhi (struct xfrm_state *x,__be32 net_seq);int xfrm_init_replay (struct xfrm_state *x,struct netlink_ext_ack *extack);u32 xfrm_state_mtu (struct xfrm_state *x,int mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack); +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack);int xfrm_init_state (struct xfrm_state *x);int xfrm_input (struct sk_buff *skb,int nexthdr,__be32 spi,int encap_type);int xfrm_input_resume (struct sk_buff *skb,int nexthdr);net/xfrm/xfrm_state.c +0
-0net/xfrm/xfrm_state.c u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) · line 3123
Quoted 6 lines
net/xfrm/xfrm_state.c +1
-2@@ -3120,8 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack) +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack)The whole point of having
__xfrm_init_statewas to sepatate codepaths that needinit_replayand those who don't need it. That was a bandaid for something, unfortunately I don't remenber for what.
Quoted 3 lines
If we don't need that anymore, maybe we can merge
__xfrm_init_stateintoxfrm_init_state, as it was before.
Main difference between __xfrm_init_state and xfrm_init_state is that latter is called without extack, which doesn't exist in kernel path.
E.g xfrm_init_state(struct xfrm_state *x) vs. __xfrm_init_state(struct xfrm_state *x, struct netlink_ext_ack *extack). So if we merge them, we will need to change all xfrm_init_state()
callers to provide extack == NULL.
IMHO, such churn of changing xfrm_init_state() callers is not worth it for now.
Thanks
Quoted 2 lines
The rest of the patchset looks OK to me.
Steffen Klassert
maintainerRe: [PATCH ipsec-next 2/5] xfrm: simplify SA initialization routine
Quoted 50 lines · Leon Romanovsky
Quoted 49 lines · Steffen Klassert
Quoted 36 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
SA replay mode is initialized differently for user-space and kernel-space users, but the call to
xfrm_init_replay()existed in common path with boolean protection. That caused to situation where we have two different function orders.So let's rewrite the SA initialization flow to have same order for both in-kernel and user-space callers.
Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 3 +-- net/xfrm/xfrm_state.c | 22 ++++++++++------------ net/xfrm/xfrm_user.c | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-)include/net/xfrm.h +1
-2@@ -1770,8 +1770,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);u32 xfrm_replay_seqhi (struct xfrm_state *x,__be32 net_seq);int xfrm_init_replay (struct xfrm_state *x,struct netlink_ext_ack *extack);u32 xfrm_state_mtu (struct xfrm_state *x,int mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack); +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack);int xfrm_init_state (struct xfrm_state *x);int xfrm_input (struct sk_buff *skb,int nexthdr,__be32 spi,int encap_type);int xfrm_input_resume (struct sk_buff *skb,int nexthdr);net/xfrm/xfrm_state.c +0
-0net/xfrm/xfrm_state.c u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) · line 3123
Quoted 6 lines
net/xfrm/xfrm_state.c +1
-2@@ -3120,8 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack) +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack)The whole point of having
__xfrm_init_statewas to sepatate codepaths that needinit_replayand those who don't need it. That was a bandaid for something, unfortunately I don't remenber for what.
Quoted 6 lines
Quoted 3 lines
If we don't need that anymore, maybe we can merge
__xfrm_init_stateintoxfrm_init_state, as it was before.Main difference between
__xfrm_init_stateandxfrm_init_stateis that latter is called without extack, which doesn't exist in kernel path.
That split happened ~ 15 years ago, we did not have extack back than. But I'm also ok with keeping it if extack is a reason for it.
Do you plan to respin, or should I take the patchset as is?
Thanks!
Re: [PATCH ipsec-next 2/5] xfrm: simplify SA initialization routine
Quoted 55 lines · Steffen Klassert
Quoted 54 lines · Leon Romanovsky
Quoted 52 lines · Steffen Klassert
Quoted 36 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
SA replay mode is initialized differently for user-space and kernel-space users, but the call to
xfrm_init_replay()existed in common path with boolean protection. That caused to situation where we have two different function orders.So let's rewrite the SA initialization flow to have same order for both in-kernel and user-space callers.
Signed-off-by Leon Romanovsky <[email protected]>--- include/net/xfrm.h | 3 +-- net/xfrm/xfrm_state.c | 22 ++++++++++------------ net/xfrm/xfrm_user.c | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-)include/net/xfrm.h +1
-2@@ -1770,8 +1770,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);u32 xfrm_replay_seqhi (struct xfrm_state *x,__be32 net_seq);int xfrm_init_replay (struct xfrm_state *x,struct netlink_ext_ack *extack);u32 xfrm_state_mtu (struct xfrm_state *x,int mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack); +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack);int xfrm_init_state (struct xfrm_state *x);int xfrm_input (struct sk_buff *skb,int nexthdr,__be32 spi,int encap_type);int xfrm_input_resume (struct sk_buff *skb,int nexthdr);net/xfrm/xfrm_state.c +0
-0net/xfrm/xfrm_state.c u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) · line 3123
Quoted 6 lines
net/xfrm/xfrm_state.c +1
-2@@ -3120,8 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu) }EXPORT_SYMBOL_GPL (xfrm_state_mtu); -int __xfrm_init_state (struct xfrm_state *x,bool init_replay, -struct netlink_ext_ack *extack) +int __xfrm_init_state (struct xfrm_state *x,struct netlink_ext_ack *extack)The whole point of having
__xfrm_init_statewas to sepatate codepaths that needinit_replayand those who don't need it. That was a bandaid for something, unfortunately I don't remenber for what.If we don't need that anymore, maybe we can merge
__xfrm_init_stateintoxfrm_init_state, as it was before.
Quoted 7 lines
Quoted 2 lines
Main difference between
__xfrm_init_stateandxfrm_init_stateis that latter is called without extack, which doesn't exist in kernel path.That split happened ~ 15 years ago, we did not have extack back than. But I'm also ok with keeping it if extack is a reason for it.
Do you plan to respin, or should I take the patchset as is?
The best way will be if you can take this series as is.
Quoted 2 lines
Thanks!
Re: [PATCH ipsec-next 4/5] xfrm: provide common xdo_dev_offload_ok callback implementation
In reply to Leon RomanovskyQuoted 31 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Almost all drivers except bond and nsim had same check if device can perform XFRM offload on that specific packet. The check was that packet doesn't have IPv4 options and IPv6 extensions.
In NIC drivers, the IPv4 HELEN comparison was slightly different, but the intent was to check for the same conditions. So let's chose more strict variant as a common base.
Signed-off-by Leon Romanovsky <[email protected]>--- Documentation/networking/xfrm_device.rst | 3 ++- drivers/net/bonding/bond_main.c | 16 +++++--------- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 21 ------------------- .../inline_crypto/ch_ipsec/chcr_ipsec.c | 16 -------------- .../net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 21 ------------------- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 21 ------------------- .../marvell/octeontx2/nic/cn10k_ipsec.c | 15 ------------- .../mellanox/mlx5/core/en_accel/ipsec.c | 16 -------------- .../net/ethernet/netronome/nfp/crypto/ipsec.c | 11 ---------- drivers/net/netdevsim/ipsec.c | 11 ---------- drivers/net/netdevsim/netdevsim.h | 1 - net/xfrm/xfrm_device.c | 15 +++++++++++++ 12 files changed, 22 insertions(+), 145 deletions(-)Documentation/networking/xfrm_device.rst +0
-0
Documentation/networking/xfrm_device.rst been setup for offload, it first calls into xdo_dev_offload_ok() with · line 129
Quoted 5 lines
Documentation/networking/xfrm_device.rst +1
-1@@ -126,7 +126,8 @@ been setup for offload, it first calls into xdo_dev_offload_ok() with the skb and the intended offload state to ask the driver if the offload will serviceable. This can check the packet information to be sure the offload can be supported (e.g. IPv4 or IPv6, no IPv4 options, etc) and -return true of false to signify its support. +return true of false to signify its support. In case driver doesn't implement
In this commit, remove the functions cxgb4_ipsec_offload_ok, ch_ipsec_offload_ok, ixgbe_ipsec_offload_ok, ixgbevf_ipsec_offload_ok, cn10k_ipsec_offload_ok, mlx5e_ipsec_offload_ok, nfp_net_ipsec_offload_ok and nsim_ipsec_offload_ok, use the function xfrm_dev_offload_ok to do the same work.
But in the file xfrm_device.rst, "return true or false to signify its support"?
of --> should be "or"
Thanks a lot.
Zhu Yanjun
Quoted 10 lines
Documentation/networking/xfrm_device.rst +1
-0+this callback, the stack provides reasonable defaults. Crypto offload mode: When ready to send, the driver needs to inspect the Tx packet for thedrivers/net/bonding/bond_main.c +0
-0@@ -676,22 +676,16 @@ static void bond_ipsec_free_sa(struct xfrm_state *xs)static bool bond_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs)
Re: [PATCH ipsec-next 4/5] xfrm: provide common xdo_dev_offload_ok callback implementation
Quoted 44 lines · Zhu Yanjun
Quoted 31 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Almost all drivers except bond and nsim had same check if device can perform XFRM offload on that specific packet. The check was that packet doesn't have IPv4 options and IPv6 extensions.
In NIC drivers, the IPv4 HELEN comparison was slightly different, but the intent was to check for the same conditions. So let's chose more strict variant as a common base.
Signed-off-by Leon Romanovsky <[email protected]>--- Documentation/networking/xfrm_device.rst | 3 ++- drivers/net/bonding/bond_main.c | 16 +++++--------- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 21 ------------------- .../inline_crypto/ch_ipsec/chcr_ipsec.c | 16 -------------- .../net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 21 ------------------- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 21 ------------------- .../marvell/octeontx2/nic/cn10k_ipsec.c | 15 ------------- .../mellanox/mlx5/core/en_accel/ipsec.c | 16 -------------- .../net/ethernet/netronome/nfp/crypto/ipsec.c | 11 ---------- drivers/net/netdevsim/ipsec.c | 11 ---------- drivers/net/netdevsim/netdevsim.h | 1 - net/xfrm/xfrm_device.c | 15 +++++++++++++ 12 files changed, 22 insertions(+), 145 deletions(-)Documentation/networking/xfrm_device.rst +0
-0Documentation/networking/xfrm_device.rst been setup for offload, it first calls into xdo_dev_offload_ok() with · line 129
Quoted 5 lines
Documentation/networking/xfrm_device.rst +1
-1@@ -126,7 +126,8 @@ been setup for offload, it first calls into xdo_dev_offload_ok() with the skb and the intended offload state to ask the driver if the offload will serviceable. This can check the packet information to be sure the offload can be supported (e.g. IPv4 or IPv6, no IPv4 options, etc) and -return true of false to signify its support. +return true of false to signify its support. In case driver doesn't implementIn this commit, remove the functions
cxgb4_ipsec_offload_ok,ch_ipsec_offload_ok,ixgbe_ipsec_offload_ok,ixgbevf_ipsec_offload_ok,cn10k_ipsec_offload_ok,mlx5e_ipsec_offload_ok,nfp_net_ipsec_offload_okandnsim_ipsec_offload_ok, use the functionxfrm_dev_offload_okto do the same work.
Quoted 2 lines
But in the file
xfrm_device.rst, "return true or false to signify its support"?
This sentence continued in the xfrm_device.rst: "... In case driver doesn't implement this callback, the stack provides reasonable defaults."
Quoted 5 lines
of --> should be "or"
Thanks a lot.
Reviewed-by Zhu Yanjun <[email protected]>
Thanks
Quoted 12 lines
Zhu Yanjun
Quoted 9 lines
Documentation/networking/xfrm_device.rst +1
-0+this callback, the stack provides reasonable defaults. Crypto offload mode: When ready to send, the driver needs to inspect the Tx packet for thedrivers/net/bonding/bond_main.c +0
-0@@ -676,22 +676,16 @@ static void bond_ipsec_free_sa(struct xfrm_state *xs)static bool bond_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs)
Re: [PATCH ipsec-next 4/5] xfrm: provide common xdo_dev_offload_ok callback implementation
Quoted 44 lines · Leon Romanovsky
Quoted 43 lines · Zhu Yanjun
Quoted 31 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Almost all drivers except bond and nsim had same check if device can perform XFRM offload on that specific packet. The check was that packet doesn't have IPv4 options and IPv6 extensions.
In NIC drivers, the IPv4 HELEN comparison was slightly different, but the intent was to check for the same conditions. So let's chose more strict variant as a common base.
Signed-off-by Leon Romanovsky <[email protected]>--- Documentation/networking/xfrm_device.rst | 3 ++- drivers/net/bonding/bond_main.c | 16 +++++--------- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 21 ------------------- .../inline_crypto/ch_ipsec/chcr_ipsec.c | 16 -------------- .../net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 21 ------------------- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 21 ------------------- .../marvell/octeontx2/nic/cn10k_ipsec.c | 15 ------------- .../mellanox/mlx5/core/en_accel/ipsec.c | 16 -------------- .../net/ethernet/netronome/nfp/crypto/ipsec.c | 11 ---------- drivers/net/netdevsim/ipsec.c | 11 ---------- drivers/net/netdevsim/netdevsim.h | 1 - net/xfrm/xfrm_device.c | 15 +++++++++++++ 12 files changed, 22 insertions(+), 145 deletions(-)Documentation/networking/xfrm_device.rst +0
-0Documentation/networking/xfrm_device.rst been setup for offload, it first calls into xdo_dev_offload_ok() with · line 129
Quoted 5 lines
Documentation/networking/xfrm_device.rst +1
-1@@ -126,7 +126,8 @@ been setup for offload, it first calls into xdo_dev_offload_ok() with the skb and the intended offload state to ask the driver if the offload will serviceable. This can check the packet information to be sure the offload can be supported (e.g. IPv4 or IPv6, no IPv4 options, etc) and -return true of false to signify its support. +return true of false to signify its support. In case driver doesn't implementIn this commit, remove the functions
cxgb4_ipsec_offload_ok,ch_ipsec_offload_ok,ixgbe_ipsec_offload_ok,ixgbevf_ipsec_offload_ok,cn10k_ipsec_offload_ok,mlx5e_ipsec_offload_ok,nfp_net_ipsec_offload_okandnsim_ipsec_offload_ok, use the functionxfrm_dev_offload_okto do the same work.
Quoted 4 lines
Quoted 2 lines
But in the file
xfrm_device.rst, "return true or false to signify its support"?This sentence continued in the
xfrm_device.rst: "... In case driver doesn't implement this callback, the stack provides reasonable defaults."
Got it.
I mean "... and return true of false to signify its support..."
^^
should be "... and return true or false to signify its support..."
^_^
Zhu Yanjun
Quoted 18 lines
Quoted 5 lines
of --> should be "or"
Thanks a lot.
Reviewed-by Zhu Yanjun <[email protected]>Thanks
Quoted 11 lines
Zhu Yanjun
Quoted 9 lines
Documentation/networking/xfrm_device.rst +1
-0+this callback, the stack provides reasonable defaults. Crypto offload mode: When ready to send, the driver needs to inspect the Tx packet for thedrivers/net/bonding/bond_main.c +0
-0@@ -676,22 +676,16 @@ static void bond_ipsec_free_sa(struct xfrm_state *xs)static bool bond_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs)
Signature · 2 lines
Best Regards, Yanjun.Zhu
Re: [PATCH ipsec-next 3/5] xfrm: rely on XFRM offload
In reply to Leon RomanovskyQuoted 4 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
After change of initialization of
x->type_offloadpointer to be valid only for offloaded SAs. There is no need to rely both onx->type_offload
^^^^^^^^
rely on both ??
Thanks a lot.
Zhu Yanjun
Quoted 3 lines
and
x->xso.typeto determine if SA is offloaded or not.Signed-off-by Leon Romanovsky <[email protected]>