lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8628FE4E7912BF47A96AE7DD7BAC0AADDDEE42913C@SJEXCHCCR02.corp.ad.broadcom.com>
Date:	Thu, 21 Oct 2010 07:50:01 -0700
From:	"Vladislav Zolotarov" <vladz@...adcom.com>
To:	"Jesse Gross" <jesse@...ira.com>,
	"David Miller" <davem@...emloft.net>
cc:	"netdev@...r.kernel.org" <netdev@...r.kernel.org>,
	"Hao Zheng" <hzheng@...ira.com>,
	"Eilon Greenstein" <eilong@...adcom.com>
Subject: RE: [PATCH v2 11/14] bnx2x: Update bnx2x to use new vlan
 accleration.



> -----Original Message-----
> From: Vladislav Zolotarov
> Sent: Thursday, October 21, 2010 4:03 PM
> To: Vladislav Zolotarov; Jesse Gross; David Miller
> Cc: netdev@...r.kernel.org; Hao Zheng; Eilon Greenstein
> Subject: RE: [PATCH v2 11/14] bnx2x: Update bnx2x to use new vlan
> accleration.
> 
> 
> 
> > -----Original Message-----
> > From: netdev-owner@...r.kernel.org [mailto:netdev-
> > owner@...r.kernel.org] On Behalf Of Vladislav Zolotarov
> > Sent: Thursday, October 21, 2010 3:55 PM
> > To: Jesse Gross; David Miller
> > Cc: netdev@...r.kernel.org; Hao Zheng; Eilon Greenstein
> > Subject: RE: [PATCH v2 11/14] bnx2x: Update bnx2x to use new vlan
> > accleration.
> >
> >
> >
> > > -----Original Message-----
> > > From: netdev-owner@...r.kernel.org [mailto:netdev-
> > > owner@...r.kernel.org] On Behalf Of Jesse Gross
> > > Sent: Thursday, October 21, 2010 1:56 AM
> > > To: David Miller
> > > Cc: netdev@...r.kernel.org; Hao Zheng; Eilon Greenstein
> > > Subject: [PATCH v2 11/14] bnx2x: Update bnx2x to use new vlan
> > > accleration.
> > >
> > > From: Hao Zheng <hzheng@...ira.com>
> > >
> > > Make the bnx2x driver use the new vlan accleration model.
> > >
> > > Signed-off-by: Hao Zheng <hzheng@...ira.com>
> > > Signed-off-by: Jesse Gross <jesse@...ira.com>
> > > CC: Eilon Greenstein <eilong@...adcom.com>
> > > ---
> > >  drivers/net/bnx2x/bnx2x.h         |   10 ------
> > >  drivers/net/bnx2x/bnx2x_cmn.c     |   60 +++++++------------------
> --
> > --
> > > --------
> > >  drivers/net/bnx2x/bnx2x_ethtool.c |   33 ++++++++++----------
> > >  drivers/net/bnx2x/bnx2x_main.c    |    8 -----
> > >  4 files changed, 27 insertions(+), 84 deletions(-)
> > >
> > > diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
> > > index 3bf236b..9571ecf 100644
> > > --- a/drivers/net/bnx2x/bnx2x.h
> > > +++ b/drivers/net/bnx2x/bnx2x.h
> > > @@ -24,10 +24,6 @@
> > >  #define DRV_MODULE_RELDATE      "2010/10/19"
> > >  #define BNX2X_BC_VER            0x040200
> > >
> > > -#if defined(CONFIG_VLAN_8021Q) ||
> defined(CONFIG_VLAN_8021Q_MODULE)
> > > -#define BCM_VLAN			1
> > > -#endif
> > > -
> > >  #define BNX2X_MULTI_QUEUE
> > >
> > >  #define BNX2X_NEW_NAPI
> > > @@ -858,10 +854,6 @@ struct bnx2x {
> > >
> > >  	int			tx_ring_size;
> > >
> > > -#ifdef BCM_VLAN
> > > -	struct vlan_group	*vlgrp;
> > > -#endif
> > > -
> > >  	u32			rx_csum;
> > >  	u32			rx_buf_size;
> > >  /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */
> > > @@ -925,8 +917,6 @@ struct bnx2x {
> > >  #define NO_MCP_FLAG			0x100
> > >  #define DISABLE_MSI_FLAG		0x200
> > >  #define BP_NOMCP(bp)			(bp->flags & NO_MCP_FLAG)
> > > -#define HW_VLAN_TX_FLAG			0x400
> > > -#define HW_VLAN_RX_FLAG			0x800
> > >  #define MF_FUNC_DIS			0x1000
> > >
> > >  	int			pf_num;	/* absolute PF number */
> > > diff --git a/drivers/net/bnx2x/bnx2x_cmn.c
> > > b/drivers/net/bnx2x/bnx2x_cmn.c
> > > index 6905b2e..bc58375 100644
> > > --- a/drivers/net/bnx2x/bnx2x_cmn.c
> > > +++ b/drivers/net/bnx2x/bnx2x_cmn.c
> > > @@ -16,16 +16,13 @@
> > >   */
> > >
> > >  #include <linux/etherdevice.h>
> > > +#include <linux/if_vlan.h>
> > >  #include <linux/ip.h>
> > >  #include <net/ipv6.h>
> > >  #include <net/ip6_checksum.h>
> > >  #include <linux/firmware.h>
> > >  #include "bnx2x_cmn.h"
> > >
> > > -#ifdef BCM_VLAN
> > > -#include <linux/if_vlan.h>
> > > -#endif
> > > -
> > >  #include "bnx2x_init.h"
> > >
> > >
> > > @@ -346,13 +343,6 @@ static void bnx2x_tpa_stop(struct bnx2x *bp,
> > > struct bnx2x_fastpath *fp,
> > >  	if (likely(new_skb)) {
> > >  		/* fix ip xsum and give it to the stack */
> > >  		/* (no need to map the new skb) */
> > > -#ifdef BCM_VLAN
> > > -		int is_vlan_cqe =
> > > -			(le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) &
> > > -			 PARSING_FLAGS_VLAN);
> > > -		int is_not_hwaccel_vlan_cqe =
> > > -			(is_vlan_cqe && (!(bp->flags & HW_VLAN_RX_FLAG)));
> > > -#endif
> > >
> > >  		prefetch(skb);
> > >  		prefetch(((char *)(skb)) + L1_CACHE_BYTES);
> > > @@ -377,28 +367,18 @@ static void bnx2x_tpa_stop(struct bnx2x *bp,
> > > struct bnx2x_fastpath *fp,
> > >  			struct iphdr *iph;
> > >
> > >  			iph = (struct iphdr *)skb->data;
> > > -#ifdef BCM_VLAN
> > > -			/* If there is no Rx VLAN offloading -
> > > -			   take VLAN tag into an account */
> > > -			if (unlikely(is_not_hwaccel_vlan_cqe))
> > > -				iph = (struct iphdr *)((u8 *)iph + VLAN_HLEN);
> > > -#endif
> > >  			iph->check = 0;
> > >  			iph->check = ip_fast_csum((u8 *)iph, iph->ihl);
> > >  		}
> > >
> > >  		if (!bnx2x_fill_frag_skb(bp, fp, skb,
> > >  					 &cqe->fast_path_cqe, cqe_idx)) {
> > > -#ifdef BCM_VLAN
> > > -			if ((bp->vlgrp != NULL) &&
> > > -				(le16_to_cpu(cqe->fast_path_cqe.
> > > -				pars_flags.flags) & PARSING_FLAGS_VLAN))
> > > -				vlan_gro_receive(&fp->napi, bp->vlgrp,
> > > +			if ((le16_to_cpu(cqe->fast_path_cqe.
> > > +			    pars_flags.flags) & PARSING_FLAGS_VLAN))
> > > +				__vlan_hwaccel_put_tag(skb,
> > >  						 le16_to_cpu(cqe->fast_path_cqe.
> > > -							     vlan_tag), skb);
> > > -			else
> > > -#endif
> > > -				napi_gro_receive(&fp->napi, skb);
> > > +							     vlan_tag));
> > > +			napi_gro_receive(&fp->napi, skb);
> > >  		} else {
> > >  			DP(NETIF_MSG_RX_STATUS, "Failed to allocate new
> > > pages"
> > >  			   " - dropping packet!\n");
> > > @@ -633,15 +613,11 @@ reuse_rx:
> > >
> > >  		skb_record_rx_queue(skb, fp->index);
> > >
> > > -#ifdef BCM_VLAN
> > > -		if ((bp->vlgrp != NULL) && (bp->flags & HW_VLAN_RX_FLAG) &&
> > > -		    (le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) &
> > > -		     PARSING_FLAGS_VLAN))
> > > -			vlan_gro_receive(&fp->napi, bp->vlgrp,
> > > -				le16_to_cpu(cqe->fast_path_cqe.vlan_tag), skb);
> > > -		else
> > > -#endif
> > > -			napi_gro_receive(&fp->napi, skb);
> > > +		if (le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) &
> > > +		     PARSING_FLAGS_VLAN)
> > > +			__vlan_hwaccel_put_tag(skb,
> > > +				le16_to_cpu(cqe->fast_path_cqe.vlan_tag));
> > > +		napi_gro_receive(&fp->napi, skb);
> > >
> > >
> > >  next_rx:
> > > @@ -2025,14 +2001,12 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff
> > > *skb, struct net_device *dev)
> > >  	   "sending pkt %u @%p  next_idx %u  bd %u @%p\n",
> > >  	   pkt_prod, tx_buf, fp->tx_pkt_prod, bd_prod, tx_start_bd);
> > >
> > > -#ifdef BCM_VLAN
> > >  	if (vlan_tx_tag_present(skb)) {
> > >  		tx_start_bd->vlan_or_ethertype =
> > >  		    cpu_to_le16(vlan_tx_tag_get(skb));
> > >  		tx_start_bd->bd_flags.as_bitfield |=
> > >  		    (X_ETH_OUTBAND_VLAN <<
> > > ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT);
> > >  	} else
> > > -#endif
> > >  		tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
> > >
> > >  	/* turn on parsing and get a BD */
> > > @@ -2317,18 +2291,6 @@ void bnx2x_tx_timeout(struct net_device
> *dev)
> > >  	schedule_delayed_work(&bp->reset_task, 0);
> > >  }
> > >
> > > -#ifdef BCM_VLAN
> > > -/* called with rtnl_lock */
> > > -void bnx2x_vlan_rx_register(struct net_device *dev,
> > > -				   struct vlan_group *vlgrp)
> > > -{
> > > -	struct bnx2x *bp = netdev_priv(dev);
> > > -
> > > -	bp->vlgrp = vlgrp;
> > > -}
> > > -
> > > -#endif
> > > -
> > >  int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state)
> > >  {
> > >  	struct net_device *dev = pci_get_drvdata(pdev);
> > > diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c
> > > b/drivers/net/bnx2x/bnx2x_ethtool.c
> > > index 54fe061..daefef6 100644
> > > --- a/drivers/net/bnx2x/bnx2x_ethtool.c
> > > +++ b/drivers/net/bnx2x/bnx2x_ethtool.c
> > > @@ -1117,35 +1117,34 @@ static int bnx2x_set_flags(struct
> net_device
> > > *dev, u32 data)
> > >  	int changed = 0;
> > >  	int rc = 0;
> > >
> > > -	if (data & ~(ETH_FLAG_LRO | ETH_FLAG_RXHASH))
> > > -		return -EINVAL;
> > > -
> > >  	if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
> > >  		printk(KERN_ERR "Handling parity error recovery. Try again
> > > later\n");
> > >  		return -EAGAIN;
> > >  	}
> > >
> > > +	if (!(data & ETH_FLAG_RXVLAN))
> > > +		return -EOPNOTSUPP;
> > > +
> > > +	if ((data & ETH_FLAG_LRO) && bp->rx_csum && bp->disable_tpa)
> > > +		return -EINVAL;
> > > +
> > > +	rc = ethtool_op_set_flags(dev, data, ETH_FLAG_LRO |
> > > ETH_FLAG_RXVLAN |
> > > +					ETH_FLAG_TXVLAN | ETH_FLAG_RXHASH);
> > > +	if (rc)
> > > +		return rc;
> > > +
> > >  	/* TPA requires Rx CSUM offloading */
> > >  	if ((data & ETH_FLAG_LRO) && bp->rx_csum) {
> > > -		if (!bp->disable_tpa) {
> > > -			if (!(dev->features & NETIF_F_LRO)) {
> > > -				dev->features |= NETIF_F_LRO;
> > > -				bp->flags |= TPA_ENABLE_FLAG;
> > > -				changed = 1;
> > > -			}
> > > -		} else
> > > -			rc = -EINVAL;
> > > -	} else if (dev->features & NETIF_F_LRO) {
> > > +		if (!(bp->flags & TPA_ENABLE_FLAG)) {
> > > +			bp->flags |= TPA_ENABLE_FLAG;
> > > +			changed = 1;
> > > +		}
> > > +	} else if (bp->flags & TPA_ENABLE_FLAG) {
> > >  		dev->features &= ~NETIF_F_LRO;
> > >  		bp->flags &= ~TPA_ENABLE_FLAG;
> > >  		changed = 1;
> > >  	}
> > >
> > > -	if (data & ETH_FLAG_RXHASH)
> > > -		dev->features |= NETIF_F_RXHASH;
> > > -	else
> > > -		dev->features &= ~NETIF_F_RXHASH;
> > > -
> > >  	if (changed && netif_running(dev)) {
> > >  		bnx2x_nic_unload(bp, UNLOAD_NORMAL);
> > >  		rc = bnx2x_nic_load(bp, LOAD_NORMAL);
> > > diff --git a/drivers/net/bnx2x/bnx2x_main.c
> > > b/drivers/net/bnx2x/bnx2x_main.c
> > > index f22e283..ff99a2f 100644
> > > --- a/drivers/net/bnx2x/bnx2x_main.c
> > > +++ b/drivers/net/bnx2x/bnx2x_main.c
> > > @@ -2371,10 +2371,8 @@ static inline u16 bnx2x_get_cl_flags(struct
> > > bnx2x *bp,
> > >  	flags |= QUEUE_FLG_HC;
> > >  	flags |= IS_MF(bp) ? QUEUE_FLG_OV : 0;
> > >
> > > -#ifdef BCM_VLAN
> > >  	flags |= QUEUE_FLG_VLAN;
> > >  	DP(NETIF_MSG_IFUP, "vlan removal enabled\n");
> > > -#endif
> > >
> > >  	if (!fp->disable_tpa)
> > >  		flags |= QUEUE_FLG_TPA;
> > > @@ -8630,9 +8628,6 @@ static const struct net_device_ops
> > > bnx2x_netdev_ops = {
> > >  	.ndo_do_ioctl		= bnx2x_ioctl,
> > >  	.ndo_change_mtu		= bnx2x_change_mtu,
> > >  	.ndo_tx_timeout		= bnx2x_tx_timeout,
> > > -#ifdef BCM_VLAN
> > > -	.ndo_vlan_rx_register	= bnx2x_vlan_rx_register,
> > > -#endif
> > >  #ifdef CONFIG_NET_POLL_CONTROLLER
> > >  	.ndo_poll_controller	= poll_bnx2x,
> > >  #endif
> > > @@ -8764,9 +8759,7 @@ static int __devinit bnx2x_init_dev(struct
> > > pci_dev *pdev,
> > >  		dev->features |= NETIF_F_HIGHDMA;
> > >  	dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
> > >  	dev->features |= NETIF_F_TSO6;
> > > -#ifdef BCM_VLAN
> > >  	dev->features |= (NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX);
> > > -	bp->flags |= (HW_VLAN_RX_FLAG | HW_VLAN_TX_FLAG);
> > >
> > >  	dev->vlan_features |= NETIF_F_SG;
> > >  	dev->vlan_features |= NETIF_F_HW_CSUM;
> > > @@ -8774,7 +8767,6 @@ static int __devinit bnx2x_init_dev(struct
> > > pci_dev *pdev,
> > >  		dev->vlan_features |= NETIF_F_HIGHDMA;
> > >  	dev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
> > >  	dev->vlan_features |= NETIF_F_TSO6;
> > > -#endif
> > >
> > >  	/* get_port_hwinfo() will set prtad and mmds properly */
> > >  	bp->mdio.prtad = MDIO_PRTAD_NONE;
> > > --
> > > 1.7.1
> >
> > Guys, when I compiled the kernel with these patches without VLAN
> > support (CONFIG_VLAN_8021Q is not set) and tried to send VLAN tagged
> > frames from the remote side to the bnx2x interface the kernel
> panicked.
> >
> > The stack trace got cut with the __netif_receive_skb() on top by the
> > IPKVM and I'll have to connect a serial to get it all. But until I
> > did that maybe somebody will have any ideas anyway...
> >
> > It happens regardless there is HW RX VLAN stripping enabled or not.
> 
> When RX VLAN stripping is enabled we hit the BUG() in the
> vlan_hwaccel_do_receive().:

We hit the same BUG() both when VLAN stripping is disabled. 

Thanks,
vlad

> 
> 
> 
> 
> 
> >
> > Thanks,
> > vlad
> >
> > >
> > > --
> > > To unsubscribe from this list: send the line "unsubscribe netdev"
> in
> > > the body of a message to majordomo@...r.kernel.org
> > > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> >
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe netdev" in
> > the body of a message to majordomo@...r.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ