From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steffen Klassert Subject: Re: [PATCH ipsec-next] xfrm: check for xdo_dev_state_free Date: Thu, 14 Dec 2017 07:20:20 +0100 Message-ID: <20171214062020.wj6iglgcfpu2b7kh@gauss3.secunet.de> References: <1513025842-12064-1-git-send-email-shannon.nelson@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Cc: To: Shannon Nelson Return-path: Received: from a.mx.secunet.com ([62.96.220.36]:57878 "EHLO a.mx.secunet.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750720AbdLNGUd (ORCPT ); Thu, 14 Dec 2017 01:20:33 -0500 Content-Disposition: inline In-Reply-To: <1513025842-12064-1-git-send-email-shannon.nelson@oracle.com> Sender: netdev-owner@vger.kernel.org List-ID: On Mon, Dec 11, 2017 at 12:57:22PM -0800, Shannon Nelson wrote: > The current XFRM code assumes that we've implemented the > xdo_dev_state_free() callback, even if it is meaningless to the driver. > This patch adds a check for it before calling, as done in other APIs, > and is done for the xdo_state_offload_ok() callback. > > Also, we add a check for the required add and delete functions up front > at registration time to be sure both are defined, and complain if not. > > Signed-off-by: Shannon Nelson > --- > include/net/xfrm.h | 3 ++- > net/xfrm/xfrm_device.c | 18 ++++++++++++++---- > 2 files changed, 16 insertions(+), 5 deletions(-) > > diff --git a/include/net/xfrm.h b/include/net/xfrm.h > index e015e16..dfabd04 100644 > --- a/include/net/xfrm.h > +++ b/include/net/xfrm.h > @@ -1891,7 +1891,8 @@ static inline void xfrm_dev_state_free(struct xfrm_state *x) > struct net_device *dev = xso->dev; > > if (dev && dev->xfrmdev_ops) { > - dev->xfrmdev_ops->xdo_dev_state_free(x); > + if (dev->xfrmdev_ops->xdo_dev_state_free) > + dev->xfrmdev_ops->xdo_dev_state_free(x); > xso->dev = NULL; > dev_put(dev); > } > diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c > index 30e5746..0df1cc2 100644 > --- a/net/xfrm/xfrm_device.c > +++ b/net/xfrm/xfrm_device.c > @@ -144,11 +144,21 @@ EXPORT_SYMBOL_GPL(xfrm_dev_offload_ok); > > static int xfrm_dev_register(struct net_device *dev) > { > - if ((dev->features & NETIF_F_HW_ESP) && !dev->xfrmdev_ops) > - return NOTIFY_BAD; > - if ((dev->features & NETIF_F_HW_ESP_TX_CSUM) && > - !(dev->features & NETIF_F_HW_ESP)) > + if (!(dev->features & NETIF_F_HW_ESP)) { > + if (dev->features & NETIF_F_HW_ESP_TX_CSUM) { > + netdev_err(dev, "NETIF_F_HW_ESP_TX_CSUM without NETIF_F_HW_ESP\n"); > + return NOTIFY_BAD; > + } else { > + return NOTIFY_DONE; > + } > + } > + > + if (!(dev->xfrmdev_ops && > + dev->xfrmdev_ops->xdo_dev_state_add && > + dev->xfrmdev_ops->xdo_dev_state_delete)) { > + netdev_err(dev, "add or delete function missing from xfrmdev_ops\n"); Please remove these error printings, this is not relevant for normal users.