Commit 63cfd210 authored by Huanhuan Wang's avatar Huanhuan Wang Committed by Jakub Kicinski

nfp: fix incorrect pointer deference when offloading IPsec with bonding

There are two pointers in struct xfrm_dev_offload, *dev, *real_dev.
The *dev points whether bonding interface or real interface, if
bonding IPsec offload is used, it points bonding interface; if not,
it points real interface. And *real_dev always points real interface.
So nfp should always use real_dev instead of dev.

Prior to this change the system becomes unresponsive when offloading
IPsec for a device which is a lower device to a bonding device.

Fixes: 859a497f ("nfp: implement xfrm callbacks and expose ipsec offload feature to upper layer")
CC: stable@vger.kernel.org
Signed-off-by: default avatarHuanhuan Wang <huanhuan.wang@corigine.com>
Acked-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarLouis Peens <louis.peens@corigine.com>
Link: https://lore.kernel.org/r/20230420140125.38521-1-louis.peens@corigine.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 461bb5b9
...@@ -269,7 +269,7 @@ static void set_sha2_512hmac(struct nfp_ipsec_cfg_add_sa *cfg, int *trunc_len) ...@@ -269,7 +269,7 @@ static void set_sha2_512hmac(struct nfp_ipsec_cfg_add_sa *cfg, int *trunc_len)
static int nfp_net_xfrm_add_state(struct xfrm_state *x, static int nfp_net_xfrm_add_state(struct xfrm_state *x,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net_device *netdev = x->xso.dev; struct net_device *netdev = x->xso.real_dev;
struct nfp_ipsec_cfg_mssg msg = {}; struct nfp_ipsec_cfg_mssg msg = {};
int i, key_len, trunc_len, err = 0; int i, key_len, trunc_len, err = 0;
struct nfp_ipsec_cfg_add_sa *cfg; struct nfp_ipsec_cfg_add_sa *cfg;
...@@ -513,7 +513,7 @@ static void nfp_net_xfrm_del_state(struct xfrm_state *x) ...@@ -513,7 +513,7 @@ static void nfp_net_xfrm_del_state(struct xfrm_state *x)
.cmd = NFP_IPSEC_CFG_MSSG_INV_SA, .cmd = NFP_IPSEC_CFG_MSSG_INV_SA,
.sa_idx = x->xso.offload_handle - 1, .sa_idx = x->xso.offload_handle - 1,
}; };
struct net_device *netdev = x->xso.dev; struct net_device *netdev = x->xso.real_dev;
struct nfp_net *nn; struct nfp_net *nn;
int err; int err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment