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]
Date:	Thu, 21 Oct 2010 06:54:39 -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: 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.

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ