[v2,16/22] net/ixgbe: fix the jumbo frame flag condition
Checks
Commit Message
The jumbo frame uses the 'RTE_ETHER_MAX_LEN' as boundary condition.
If 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 normalize the boundary condition with 'RTE_ETHER_MTU'
and overhead even though current overhead is 18.
Fixes: 59d0ecdbf0e1 ("ethdev: MTU accessors")
Fixes: 95a27b3ba5f5 ("net/ixgbe: enable jumbo frame for VF")
Signed-off-by: Steve Yang <stevex.yang@intel.com>
---
drivers/net/ixgbe/ixgbe_ethdev.c | 2 +-
drivers/net/ixgbe/ixgbe_ethdev.h | 3 +++
drivers/net/ixgbe/ixgbe_pf.c | 2 +-
3 files changed, 5 insertions(+), 2 deletions(-)
Comments
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 16/22] net/ixgbe: fix the jumbo frame flag condition
>
> The jumbo frame uses the 'RTE_ETHER_MAX_LEN' as boundary condition.
> If 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 normalize the boundary condition with 'RTE_ETHER_MTU'
> and overhead even though current overhead is 18.
>
> Fixes: 59d0ecdbf0e1 ("ethdev: MTU accessors")
> Fixes: 95a27b3ba5f5 ("net/ixgbe: enable jumbo frame for VF")
>
> Signed-off-by: Steve Yang <stevex.yang@intel.com>
> ---
> drivers/net/ixgbe/ixgbe_ethdev.c | 2 +- drivers/net/ixgbe/ixgbe_ethdev.h
> | 3 +++
> drivers/net/ixgbe/ixgbe_pf.c | 2 +-
> 3 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> b/drivers/net/ixgbe/ixgbe_ethdev.c
> index d7a1806ab8..fa0f5afd03 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -5173,7 +5173,7 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev,
> uint16_t mtu)
> hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
>
> /* switch to jumbo mode if needed */
> - if (frame_size > RTE_ETHER_MAX_LEN) {
> + if (frame_size > IXGBE_ETH_MAX_LEN) {
> dev->data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> hlreg0 |= IXGBE_HLREG0_JUMBOEN;
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h
> b/drivers/net/ixgbe/ixgbe_ethdev.h
> index 3d35ea791b..a0ce18ca24 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -104,6 +104,9 @@
> /* The overhead from MTU to max frame size. */ #define
> IXGBE_ETH_OVERHEAD (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN)
>
> +/* The max frame size with default MTU */ #define IXGBE_ETH_MAX_LEN
> +(RTE_ETHER_MTU + IXGBE_ETH_OVERHEAD)
> +
> /* bit of VXLAN tunnel type | 7 bits of zeros | 8 bits of zeros*/
> #define IXGBE_FDIR_VXLAN_TUNNEL_TYPE 0x8000
> /* bit of NVGRE tunnel type | 7 bits of zeros | 8 bits of zeros*/ diff --git
> a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c index
> 833863af5a..89698e8470 100644
> --- a/drivers/net/ixgbe/ixgbe_pf.c
> +++ b/drivers/net/ixgbe/ixgbe_pf.c
> @@ -575,7 +575,7 @@ ixgbe_set_vf_lpe(struct rte_eth_dev *dev,
> __rte_unused uint32_t vf, uint32_t *ms
> IXGBE_MHADD_MFS_MASK) >>
> IXGBE_MHADD_MFS_SHIFT;
> if (max_frs < new_mtu) {
> hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
> - if (new_mtu > RTE_ETHER_MAX_LEN) {
> + if (new_mtu > IXGBE_ETH_MAX_LEN) {
> dev->data->dev_conf.rxmode.offloads |=
> DEV_RX_OFFLOAD_JUMBO_FRAME;
> hlreg0 |= IXGBE_HLREG0_JUMBOEN;
> --
> 2.17.1
@@ -5173,7 +5173,7 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
/* switch to jumbo mode if needed */
- if (frame_size > RTE_ETHER_MAX_LEN) {
+ if (frame_size > IXGBE_ETH_MAX_LEN) {
dev->data->dev_conf.rxmode.offloads |=
DEV_RX_OFFLOAD_JUMBO_FRAME;
hlreg0 |= IXGBE_HLREG0_JUMBOEN;
@@ -104,6 +104,9 @@
/* The overhead from MTU to max frame size. */
#define IXGBE_ETH_OVERHEAD (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN)
+/* The max frame size with default MTU */
+#define IXGBE_ETH_MAX_LEN (RTE_ETHER_MTU + IXGBE_ETH_OVERHEAD)
+
/* bit of VXLAN tunnel type | 7 bits of zeros | 8 bits of zeros*/
#define IXGBE_FDIR_VXLAN_TUNNEL_TYPE 0x8000
/* bit of NVGRE tunnel type | 7 bits of zeros | 8 bits of zeros*/
@@ -575,7 +575,7 @@ ixgbe_set_vf_lpe(struct rte_eth_dev *dev, __rte_unused uint32_t vf, uint32_t *ms
IXGBE_MHADD_MFS_MASK) >> IXGBE_MHADD_MFS_SHIFT;
if (max_frs < new_mtu) {
hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
- if (new_mtu > RTE_ETHER_MAX_LEN) {
+ if (new_mtu > IXGBE_ETH_MAX_LEN) {
dev->data->dev_conf.rxmode.offloads |=
DEV_RX_OFFLOAD_JUMBO_FRAME;
hlreg0 |= IXGBE_HLREG0_JUMBOEN;