kni: calculate MTU from mbuf size

- mbuf_size and mtu are now being calculated according
to the given mb-pool.

- max_mtu is now being set according to the given mtu

the above two changes provide the ability to work with jumbo frames

Signed-off-by: Liron Himi <lironh@marvell.com>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
This commit is contained in:
Liron Himi 2019-03-26 20:40:10 +02:00 committed by Thomas Monjalon
parent 23d5455517
commit ff1e35fb5f
6 changed files with 27 additions and 4 deletions

View File

@ -55,7 +55,8 @@ configuration:
Interface name: kni#
force bind kernel thread to a core : NO
mbuf size: MAX_PACKET_SZ
mbuf size: (rte_pktmbuf_data_room_size(pktmbuf_pool) - RTE_PKTMBUF_HEADROOM)
mtu: (conf.mbuf_size - ETHER_HDR_LEN)
KNI control path is not supported with the PMD, since there is no physical
backend device by default.

View File

@ -187,6 +187,8 @@ The ``struct rte_kni_conf`` structure contains fields which allow the
user to specify the interface name, set the MTU size, set an explicit or
random MAC address and control the affinity of the kernel Rx thread(s)
(both single and multi-threaded modes).
By default the KNI sample example gets the MTU from the matching device,
and in case of KNI PMD it is derived from mbuf buffer length.
The ``struct rte_kni_ops`` structure contains pointers to functions to
handle requests from the ``rte_kni`` kernel module. These functions

View File

@ -54,6 +54,15 @@ New Features
Also, make sure to start the actual text at the margin.
=========================================================
* **Updated KNI module and PMD.**
Updated the KNI kernel module to set the max_mtu according to the given
initial MTU size. Without it, the maximum MTU was 1500.
Updated the KNI PMD driver to set the mbuf_size and MTU based on
the given mb-pool. This provide the ability to pass jumbo frames
if the mb-pool contains suitable buffers' size.
* **Updated Solarflare network PMD.**
Updated the sfc_efx driver including the following changes:

View File

@ -16,9 +16,11 @@
/* Only single queue supported */
#define KNI_MAX_QUEUE_PER_PORT 1
#define MAX_PACKET_SZ 2048
#define MAX_KNI_PORTS 8
#define KNI_ETHER_MTU(mbuf_size) \
((mbuf_size) - ETHER_HDR_LEN) /**< Ethernet MTU. */
#define ETH_KNI_NO_REQUEST_THREAD_ARG "no_request_thread"
static const char * const valid_arguments[] = {
ETH_KNI_NO_REQUEST_THREAD_ARG,
@ -123,11 +125,13 @@ eth_kni_start(struct rte_eth_dev *dev)
struct rte_kni_conf conf;
const char *name = dev->device->name + 4; /* remove net_ */
mb_pool = internals->rx_queues[0].mb_pool;
snprintf(conf.name, RTE_KNI_NAMESIZE, "%s", name);
conf.force_bind = 0;
conf.group_id = port_id;
conf.mbuf_size = MAX_PACKET_SZ;
mb_pool = internals->rx_queues[0].mb_pool;
conf.mbuf_size =
rte_pktmbuf_data_room_size(mb_pool) - RTE_PKTMBUF_HEADROOM;
conf.mtu = KNI_ETHER_MTU(conf.mbuf_size);
internals->kni = rte_kni_alloc(mb_pool, &conf, NULL);
if (internals->kni == NULL) {

View File

@ -114,6 +114,10 @@
#define ndo_change_mtu ndo_change_mtu_rh74
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
#define HAVE_MAX_MTU_PARAM
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
#define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
#endif

View File

@ -459,6 +459,9 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num,
if (dev_info.mtu)
net_dev->mtu = dev_info.mtu;
#ifdef HAVE_MAX_MTU_PARAM
net_dev->max_mtu = net_dev->mtu;
#endif
ret = register_netdev(net_dev);
if (ret) {