Derive max_rx_pktlen and max_mtu from the actual TPACKET ring frame size rather than the static RTE_ETHER_MAX_LEN (1518). This allows jumbo frame support when the user specifies a larger framesz devarg at vdev creation time, for example:
--vdev=net_af_packet0,iface=eth0,framesz=9216 The advertised capabilities now accurately reflect what the configured ring can handle, avoiding both false limitations with large frames and false promises with small ones. Since the ethdev layer now validates mtu <= max_mtu before calling the PMD callback, convert the data_size bounds check in eth_dev_mtu_set() from a runtime error to RTE_ASSERT(). Signed-off-by: Xavier Guillaume <[email protected]> --- drivers/net/af_packet/rte_eth_af_packet.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c index b04987aaf7..e132dc387b 100644 --- a/drivers/net/af_packet/rte_eth_af_packet.c +++ b/drivers/net/af_packet/rte_eth_af_packet.c @@ -402,7 +402,10 @@ eth_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->if_index = internals->if_index; dev_info->max_mac_addrs = 1; - dev_info->max_rx_pktlen = RTE_ETHER_MAX_LEN; + dev_info->max_rx_pktlen = internals->req.tp_frame_size - + TPACKET2_HDRLEN + sizeof(struct sockaddr_ll); + dev_info->max_mtu = dev_info->max_rx_pktlen - + RTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN; dev_info->max_rx_queues = (uint16_t)internals->nb_queues; dev_info->max_tx_queues = (uint16_t)internals->nb_queues; dev_info->min_rx_bufsize = 0; @@ -624,8 +627,8 @@ eth_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) unsigned int data_size = internals->req.tp_frame_size - TPACKET2_HDRLEN + sizeof(struct sockaddr_ll); - if (mtu > data_size) - return -EINVAL; + /* ethdev layer validates mtu <= max_mtu before calling this */ + RTE_ASSERT(mtu <= data_size); s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) -- 2.34.1

