| .. _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> |