vlib_thread_main_t *tm = vlib_get_thread_main ();
vnet_sw_interface_t *sw = vnet_get_sw_interface (vnm, xd->sw_if_index);
vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, xd->hw_if_index);
+ u16 buf_sz = vlib_buffer_get_default_data_size (vm);
vnet_hw_if_caps_change_t caps = {};
struct rte_eth_dev_info dev_info;
struct rte_eth_conf conf = {};
if (xd->conf.disable_multi_seg == 0)
{
txo |= DEV_TX_OFFLOAD_MULTI_SEGS;
- rxo |= DEV_RX_OFFLOAD_JUMBO_FRAME | DEV_RX_OFFLOAD_SCATTER;
+ rxo |= DEV_RX_OFFLOAD_SCATTER;
+#if RTE_VERSION < RTE_VERSION_NUM(21, 11, 0, 0)
+ rxo |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+#endif
}
if (xd->conf.enable_lro)
}
}
+#if RTE_VERSION < RTE_VERSION_NUM(21, 11, 0, 0)
if (rxo & DEV_RX_OFFLOAD_JUMBO_FRAME)
- conf.rxmode.max_rx_pkt_len =
- clib_min (ETHERNET_MAX_PACKET_BYTES, dev_info.max_rx_pktlen);
-
- rv = rte_eth_dev_configure (xd->port_id, xd->conf.n_rx_queues,
- xd->conf.n_tx_queues, &conf);
-
- if (rv < 0)
{
- dpdk_device_error (xd, "rte_eth_dev_configure", rv);
- goto error;
+ conf.rxmode.max_rx_pkt_len = dev_info.max_rx_pktlen;
+ xd->max_supported_frame_size = dev_info.max_rx_pktlen;
+ mtu = xd->max_supported_frame_size - xd->driver_frame_overhead;
}
-
- rte_eth_dev_get_mtu (xd->port_id, &mtu);
- dpdk_log_debug ("[%u] device default mtu %u", xd->port_id, mtu);
-
- hi->max_supported_packet_bytes = mtu;
- if (hi->max_packet_bytes > mtu)
+ else
{
- vnet_hw_interface_set_mtu (vnm, xd->hw_if_index, mtu);
+ mtu = 1500;
+ xd->max_supported_frame_size = mtu + xd->driver_frame_overhead;
}
+#else
+ if (xd->conf.disable_multi_seg)
+ xd->max_supported_frame_size = clib_min (dev_info.max_rx_pktlen, buf_sz);
else
+ xd->max_supported_frame_size = dev_info.max_rx_pktlen;
+#endif
+
+ mtu = clib_min (xd->max_supported_frame_size - xd->driver_frame_overhead,
+ ethernet_main.default_mtu);
+ mtu = mtu + hi->frame_overhead - xd->driver_frame_overhead;
+
+#if RTE_VERSION >= RTE_VERSION_NUM(21, 11, 0, 0)
+ conf.rxmode.mtu = mtu;
+#endif
+
+retry:
+ rv = rte_eth_dev_configure (xd->port_id, xd->conf.n_rx_queues,
+ xd->conf.n_tx_queues, &conf);
+ if (rv < 0 && conf.intr_conf.rxq)
{
- rte_eth_dev_set_mtu (xd->port_id, hi->max_packet_bytes);
- dpdk_log_debug ("[%u] port mtu set to %u", xd->port_id,
- hi->max_packet_bytes);
+ conf.intr_conf.rxq = 0;
+ goto retry;
}
+#if RTE_VERSION < RTE_VERSION_NUM(21, 11, 0, 0)
+ rte_eth_dev_set_mtu (xd->port_id, mtu);
+#endif
+
+ hi->max_frame_size = 0;
+ vnet_hw_interface_set_max_frame_size (vnm, xd->hw_if_index,
+ mtu + hi->frame_overhead);
+ dpdk_log_debug ("[%u] mtu %u max_frame_size %u max max_frame_size %u "
+ "driver_frame_overhead %u",
+ xd->port_id, mtu, hi->max_frame_size,
+ xd->max_supported_frame_size, xd->driver_frame_overhead);
+
vec_validate_aligned (xd->tx_queues, xd->conf.n_tx_queues - 1,
CLIB_CACHE_LINE_BYTES);
for (j = 0; j < xd->conf.n_tx_queues; j++)