[v2,05/22] net/e1000: fix the jumbo frame flag condition for mtu set

Message ID 20201217092312.27033-6-stevex.yang@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series fix rx packets dropped issue |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Steve Yang Dec. 17, 2020, 9:22 a.m. UTC
  The jumbo frame uses the 'RTE_ETHER_MAX_LEN' as boundary condition, but
the Ether overhead is larger than 18 when it supports VLAN tag. That
will cause the jumbo flag rx offload is wrong when MTU size is
'RTE_ETHER_MTU'.

This fix will change the boundary condition with 'RTE_ETHER_MTU' and
overhead.

Fixes: ef990fb56e55 ("net/e1000: convert to new Rx offloads API")

Signed-off-by: Steve Yang <stevex.yang@intel.com>
---
 drivers/net/e1000/e1000_ethdev.h | 2 +-
 drivers/net/e1000/em_ethdev.c    | 5 ++---
 drivers/net/e1000/igb_ethdev.c   | 2 +-
 3 files changed, 4 insertions(+), 5 deletions(-)
  

Comments

Guo, Jia Dec. 18, 2020, 2:42 a.m. UTC | #1
Acked-by: Jeff Guo <jia.guo@intel.com>

> -----Original Message-----
> From: Steve Yang <stevex.yang@intel.com>
> Sent: Thursday, December 17, 2020 5:23 PM
> To: dev@dpdk.org
> Cc: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Xing, Beilei
> <beilei.xing@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>; asomalap@amd.com;
> rahul.lakkireddy@chelsio.com; hemant.agrawal@nxp.com;
> sachin.saxena@oss.nxp.com; Guo, Jia <jia.guo@intel.com>; Wang, Haiyue
> <haiyue.wang@intel.com>; g.singh@nxp.com; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com;
> xavier.huwei@huawei.com; humin29@huawei.com;
> yisen.zhuang@huawei.com; oulijun@huawei.com; Wu, Jingjing
> <jingjing.wu@intel.com>; Yang, Qiming <qiming.yang@intel.com>; Zhang, Qi
> Z <qi.z.zhang@intel.com>; Xu, Rosen <rosen.xu@intel.com>;
> sthotton@marvell.com; srinivasan@marvell.com;
> heinrich.kuhn@netronome.com; hkalra@marvell.com; jerinj@marvell.com;
> ndabilpuram@marvell.com; kirankumark@marvell.com;
> rmody@marvell.com; shshaikh@marvell.com;
> andrew.rybchenko@oktetlabs.ru; mczekaj@marvell.com;
> thomas@monjalon.net; Yigit, Ferruh <ferruh.yigit@intel.com>;
> ivan.boule@6wind.com; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; samuel.gauthier@6wind.com;
> david.marchand@6wind.com; shahafs@mellanox.com;
> stephen@networkplumber.org; maxime.coquelin@redhat.com;
> olivier.matz@6wind.com; lihuisong@huawei.com; shreyansh.jain@nxp.com;
> wei.dai@intel.com; fengchunsong@huawei.com; chenhao164@huawei.com;
> tangchengchang@hisilicon.com; Zhang, Helin <helin.zhang@intel.com>;
> yanglong.wu@intel.com; xiaolong.ye@intel.com; Xu, Ting
> <ting.xu@intel.com>; Li, Xiaoyun <xiaoyun.li@intel.com>; Wei, Dan
> <dan.wei@intel.com>; Pei, Andy <andy.pei@intel.com>;
> vattunuru@marvell.com; skori@marvell.com; sony.chacko@qlogic.com;
> Richardson, Bruce <bruce.richardson@intel.com>; ivan.malov@oktetlabs.ru;
> rad@semihalf.com; slawomir.rosek@semihalf.com;
> kamil.rytarowski@caviumnetworks.com; Zhao1, Wei <wei.zhao1@intel.com>;
> Jiang, JunyuX <junyux.jiang@intel.com>; kumaras@chelsio.com;
> girish.nandibasappa@amd.com; rolf.neugebauer@netronome.com;
> alejandro.lucero@netronome.com; Yang, SteveX <stevex.yang@intel.com>
> Subject: [PATCH v2 05/22] net/e1000: fix the jumbo frame flag condition for
> mtu set
> 
> The jumbo frame uses the 'RTE_ETHER_MAX_LEN' as boundary condition,
> but the Ether overhead is larger than 18 when it supports VLAN tag. That will
> cause the jumbo flag rx offload is wrong when MTU size is 'RTE_ETHER_MTU'.
> 
> This fix will change the boundary condition with 'RTE_ETHER_MTU' and
> overhead.
> 
> Fixes: ef990fb56e55 ("net/e1000: convert to new Rx offloads API")
> 
> Signed-off-by: Steve Yang <stevex.yang@intel.com>
> ---
>  drivers/net/e1000/e1000_ethdev.h | 2 +-
>  drivers/net/e1000/em_ethdev.c    | 5 ++---
>  drivers/net/e1000/igb_ethdev.c   | 2 +-
>  3 files changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/e1000/e1000_ethdev.h
> b/drivers/net/e1000/e1000_ethdev.h
> index 4755a5f333..3b4d9c3ee6 100644
> --- a/drivers/net/e1000/e1000_ethdev.h
> +++ b/drivers/net/e1000/e1000_ethdev.h
> @@ -97,7 +97,7 @@
>   */
>  #define E1000_ETH_OVERHEAD (RTE_ETHER_HDR_LEN +
> RTE_ETHER_CRC_LEN + \
>  				VLAN_TAG_SIZE)
> -
> +#define E1000_ETH_MAX_LEN (RTE_ETHER_MTU + E1000_ETH_OVERHEAD)
>  /*
>   * Maximum number of Ring Descriptors.
>   *
> diff --git a/drivers/net/e1000/em_ethdev.c
> b/drivers/net/e1000/em_ethdev.c index 8ee9422bf4..2036c6e917 100644
> --- a/drivers/net/e1000/em_ethdev.c
> +++ b/drivers/net/e1000/em_ethdev.c
> @@ -1799,8 +1799,7 @@ eth_em_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	if (ret != 0)
>  		return ret;
> 
> -	frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN +
> -		VLAN_TAG_SIZE;
> +	frame_size = mtu + E1000_ETH_OVERHEAD;
> 
>  	/* check that mtu is within the allowed range */
>  	if (mtu < RTE_ETHER_MIN_MTU || frame_size >
> dev_info.max_rx_pktlen) @@ -1816,7 +1815,7 @@ eth_em_mtu_set(struct
> rte_eth_dev *dev, uint16_t mtu)
>  	rctl = E1000_READ_REG(hw, E1000_RCTL);
> 
>  	/* switch to jumbo mode if needed */
> -	if (frame_size > RTE_ETHER_MAX_LEN) {
> +	if (frame_size > E1000_ETH_MAX_LEN) {
>  		dev->data->dev_conf.rxmode.offloads |=
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		rctl |= E1000_RCTL_LPE;
> diff --git a/drivers/net/e1000/igb_ethdev.c
> b/drivers/net/e1000/igb_ethdev.c index 647aa8d995..dfe87508c2 100644
> --- a/drivers/net/e1000/igb_ethdev.c
> +++ b/drivers/net/e1000/igb_ethdev.c
> @@ -4369,7 +4369,7 @@ eth_igb_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
>  	rctl = E1000_READ_REG(hw, E1000_RCTL);
> 
>  	/* switch to jumbo mode if needed */
> -	if (frame_size > RTE_ETHER_MAX_LEN) {
> +	if (frame_size > E1000_ETH_MAX_LEN) {
>  		dev->data->dev_conf.rxmode.offloads |=
>  			DEV_RX_OFFLOAD_JUMBO_FRAME;
>  		rctl |= E1000_RCTL_LPE;
> --
> 2.17.1
  

Patch

diff --git a/drivers/net/e1000/e1000_ethdev.h b/drivers/net/e1000/e1000_ethdev.h
index 4755a5f333..3b4d9c3ee6 100644
--- a/drivers/net/e1000/e1000_ethdev.h
+++ b/drivers/net/e1000/e1000_ethdev.h
@@ -97,7 +97,7 @@ 
  */
 #define E1000_ETH_OVERHEAD (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + \
 				VLAN_TAG_SIZE)
-
+#define E1000_ETH_MAX_LEN (RTE_ETHER_MTU + E1000_ETH_OVERHEAD)
 /*
  * Maximum number of Ring Descriptors.
  *
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index 8ee9422bf4..2036c6e917 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -1799,8 +1799,7 @@  eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	if (ret != 0)
 		return ret;
 
-	frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN +
-		VLAN_TAG_SIZE;
+	frame_size = mtu + E1000_ETH_OVERHEAD;
 
 	/* check that mtu is within the allowed range */
 	if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen)
@@ -1816,7 +1815,7 @@  eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	rctl = E1000_READ_REG(hw, E1000_RCTL);
 
 	/* switch to jumbo mode if needed */
-	if (frame_size > RTE_ETHER_MAX_LEN) {
+	if (frame_size > E1000_ETH_MAX_LEN) {
 		dev->data->dev_conf.rxmode.offloads |=
 			DEV_RX_OFFLOAD_JUMBO_FRAME;
 		rctl |= E1000_RCTL_LPE;
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 647aa8d995..dfe87508c2 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -4369,7 +4369,7 @@  eth_igb_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	rctl = E1000_READ_REG(hw, E1000_RCTL);
 
 	/* switch to jumbo mode if needed */
-	if (frame_size > RTE_ETHER_MAX_LEN) {
+	if (frame_size > E1000_ETH_MAX_LEN) {
 		dev->data->dev_conf.rxmode.offloads |=
 			DEV_RX_OFFLOAD_JUMBO_FRAME;
 		rctl |= E1000_RCTL_LPE;