
Type: improvement Change-Id: If453321785b04f9c16e8cea36fb1910efaeb2c59 Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
109 lines
2.9 KiB
ReStructuredText
109 lines
2.9 KiB
ReStructuredText
.. _mtu_doc:
|
||
|
||
MTU in VPP
|
||
==========
|
||
|
||
Maximum Transmission Unit is a term used to describe the maximum sized
|
||
“thingy” that can be sent out an interface. It can refer to the maximum
|
||
frame size that a NIC can send. On Ethernet that would include the
|
||
Ethernet header but typically not the IGF. It can refer to the maximum
|
||
packet size, that is, on Ethernet an MTU of 1500, would allow an IPv4
|
||
packet of 1500 bytes, that would result in an Ethernet frame of 1518
|
||
bytes.
|
||
|
||
|
||
VPP allows setting of the physical payload MTU. I.e. not including L2
|
||
overhead. Setting the hardware MTU will program the NIC. This MTU will
|
||
be inherited by all software interfaces.
|
||
|
||
VPP also allows setting of the payload MTU for software interfaces.
|
||
Independently of the MTU set on the hardware. If the software payload
|
||
MTU is set higher than the capability of the NIC, the packet will be
|
||
dropped.
|
||
|
||
In addition VPP supports setting the MTU of individual network layer
|
||
protocols. IPv4, IPv6 or MPLS. For example an IPv4 MTU of 1500 (includes
|
||
the IPv4 header) will fit in a hardware payload MTU of 1500.
|
||
|
||
*Note we might consider changing the hardware payload MTU to hardware
|
||
MTU*. That is, the MTU includes all L2 framing. Then the payload MTU can
|
||
be calculated based on the interface’s configuration. E.g. 802.1q tags
|
||
etc.
|
||
|
||
There are currently no checks or warnings if e.g. the user configures a
|
||
per-protocol MTU larger than the underlying payload MTU. If that happens
|
||
packets will be fragmented or dropped.
|
||
|
||
Data structures
|
||
^^^^^^^^^^^^^^^
|
||
|
||
The hardware payload MTU is stored in the max_packet_bytes variable in
|
||
the vnet_hw_interface_t structure.
|
||
|
||
The software MTU (previously max_l3_packet_bytes) is in
|
||
vnet_sw_interface_t->in mtu[VNET_N_MTU].
|
||
|
||
MTU API
|
||
-------
|
||
|
||
Set physical MTU
|
||
^^^^^^^^^^^^^^^^
|
||
|
||
This API message is used to set the physical MTU. It is currently
|
||
limited to Ethernet interfaces. Note, this programs the NIC.
|
||
|
||
::
|
||
|
||
autoreply define hw_interface_set_mtu
|
||
{
|
||
u32 client_index;
|
||
u32 context;
|
||
u32 sw_if_index;
|
||
u16 mtu;
|
||
};
|
||
|
||
Set the L2 payload MTU
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
:: note
|
||
(not including the L2 header) and per-protocol MTUs
|
||
|
||
This API message sets the L3 payload MTU. E.g. on Ethernet it is the
|
||
maximum size of the Ethernet payload. If a value is left as 0, then the
|
||
default is picked from VNET_MTU_L3.
|
||
|
||
::
|
||
|
||
autoreply define sw_interface_set_mtu
|
||
{
|
||
u32 client_index;
|
||
u32 context;
|
||
u32 sw_if_index;
|
||
/* $$$$ Replace with enum */
|
||
u32 mtu[4]; /* 0 - L3, 1 - IP4, 2 - IP6, 3 - MPLS */
|
||
};
|
||
|
||
Get interface MTU
|
||
^^^^^^^^^^^^^^^^^
|
||
|
||
The various MTUs on an interface can be queried with the
|
||
sw_interface_dump/sw_interface_details calls.
|
||
|
||
::
|
||
|
||
define sw_interface_details
|
||
{
|
||
/* MTU */
|
||
u16 link_mtu;
|
||
|
||
/* Per protocol MTUs */
|
||
u32 mtu[4]; /* 0 - L3, 1 - IP4, 2 - IP6, 3 - MPLS */
|
||
};
|
||
|
||
MTU CLI
|
||
-------
|
||
|
||
::
|
||
|
||
set interface mtu [packet|ip4|ip6|mpls] <value> <interface>
|