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

Reply via email to