[PATCH] net/rte_net: fix inner L2 length for tunneled Ethernet packets

Andrew Rybchenko andrew.rybchenko at oktetlabs.ru
Mon Aug 11 13:22:36 CEST 2025


On 8/11/25 13:13, Khadem Ullah wrote:
> Hi Andrew,
> You are right, but I haven't found any other reference to the specific 
> usage of the definition i.e. in correspondence with vxlan_decap,
> tunneled offload API and in mbuf packet type .
> According to tunnel offload API, vxlan encap/decap action, the inner 
> header represents the original header
> while the outer represents the encapsulated ones.
> if performed vxlan_decap, it will decapped the outermost and the inner 
> header will remain the original header.
> 
> Please also check tunnel offload api in https://doc.dpdk.org/ 
> guides-20.11/prog_guide/rte_flow.html <https://doc.dpdk.org/ 
> guides-20.11/prog_guide/rte_flow.html>
> 
> Tunnel Offload API provides hardware independent, unified model to 
> offload tunneled traffic. Key model elements are:
> 
>   *
> 
>     apply matches to both outer and inner packet headers during entire
>     offload procedure;
> 
>   *
> 
>     restore outer header of partially offloaded packet;
> 
>   *
> 
>     model is implemented as a set of helper functions.
> 
> 
> E.g., the following two rules (tunnel offload) with  tunnel match and 
> give the innermost packet.
> |||flow create 0 ingress group 0 tunnel_set 1 pattern eth / ipv4 / udp 
> dst is 4789 / vxlan / end actions jump group 1 / end ||flow create 0 
> ingress group 1 tunnel_match 1 pattern eth / ipv4 / udp dst is 4789 / 
> vxlan / eth / ipv4 / end actions queue index 3 / end|
> 
> |pkt = Ether(dst='24:aa:aa:aa:aa:11',src='50:bb:bb:bb:bb:22')/IP()/ 
> UDP(dport=4789,sport=4789)/VXLAN(vni=10)/|
> |Ether(dst='24:cc:cc:cc:cc:33',src='50:dd:dd:dd:dd:44')/IP()/ UDP()
> 
> |
> image.png
> The outer headers were decapsulated and the inner header was redirected 
> to queue 3.
> 
> Incase of two tunneled packets, the outermost tunnel is stripped and the 
> packet from the inner tunnel onward is forwarded to queue 3.
> 
> You can also check  (Action: VXLAN_DECAP) that performs a decapsulation 
> action by stripping
> 
> all headers of the VXLAN tunnel network overlay from the matched flow.
> 
> So, according to vxlan_decap and tunnel offload api, the inner header 
> information must be the information of the innermost not the outmost.
> 
> and then the following would be correct in testpmd:
>   92-bytes VXLAN packet size= (14-byte outer Ethernet header + 20-byte 
> outer IP header + 8-byte outer UDP header + 8-byte VXLAN header )+
> 
>   (14-byte inner Ethernet header + 20-byte inner IP header  + 8-byte 
> inner UDP)

I'm sorry, it is all very interesting, but I don't understand how it is
related to inner_l2_len definition discussion.

Also, please, stop top posting.


> On Mon, Aug 11, 2025 at 2:39 PM Andrew Rybchenko 
> <andrew.rybchenko at oktetlabs.ru <mailto:andrew.rybchenko at oktetlabs.ru>> 
> wrote:
> 
>     On 8/1/25 14:28, Khadem Ullah wrote:
>      > Hi Andrew,
>      >
>      > Thanks for your feedback.
>      >
>      > Please check mbuf packet types and the following test case:
>      > https://doc.dpdk.org/dts-20.02/test_plans/
>     uni_pkt_test_plan.html#test-case-vxlan-tunnel-packet-type-detect
>     <https://doc.dpdk.org/dts-20.02/test_plans/
>     uni_pkt_test_plan.html#test-case-vxlan-tunnel-packet-type-detect>
>      > sendp([Ether()/IP()/UDP()/Vxlan()/Ether()/IP(frag=5)/Raw('\0'*40)],
>      > iface=txItf)
>      >
>      > (outer) L2 type: ETHER
>      > (outer) L3 type: IPV4_EXT_UNKNOWN
>      > (outer) L4 type: Unknown
>      > Tunnel type: GRENAT
>      > Inner L2 type: ETHER
>      > Inner L3 type: IPV4_EXT_UNKNOWN
>      > Inner L4 type: L4_FRAG
>      >
>      >
>      > union {
>      >          uint32_t packet_type; /**< L2/L3/L4 and tunnel
>     information. */
>      >          __extension__
>      >          struct {
>      >            uint8_t l2_type:4;   /**< (Outer) L2 type. */
>      >            uint8_t l3_type:4;   /**< (Outer) L3 type. */
>      >            uint8_t l4_type:4;   /**< (Outer) L4 type. */
>      >            uint8_t tun_type:4;  /**< Tunnel type. */
>      >            union {
>      >              uint8_t inner_esp_next_proto;
>      >              /**< ESP next protocol type, valid if
>      >               * RTE_PTYPE_TUNNEL_ESP tunnel type is set
>      >               * on both Tx and Rx.
>      >               */
>      >              __extension__
>      >              struct {
>      >                uint8_t inner_l2_type:4;
>      >                /**< Inner L2 type. */
>      >                uint8_t inner_l3_type:4;
>      >                /**< Inner L3 type. */
>      >              };
>      >            };
>      >            uint8_t inner_l4_type:4; /**< Inner L4 type. */
>      >          };
>      >        };
>      >
>      >
>      > Based on the above, it seems that inner_l2_len have to the length
>     of Ether.
> 
> 
>     Why?
> 
>      > Ther might need to be some correspondent between both fields to
>     potray the same information.
>      > Or, the inner_l2_type and inner_l2_len are completly different ?
> 
>     Definition says that it is different.
> 
>      >
>      > Best Regards,
>      > Khadem
> 
> 
> 
> -- 
> Engr. Khadem Ullah,
> Software Engineer,
> Dreambig Semiconductor Inc
> https://dreambigsemi.com/ <https://dreambigsemi.com/>



More information about the dev mailing list