Ensure rte_net_get_ptype handles truncated packets gracefully by stopping at the last layer it can fully parse.
Signed-off-by: Robin Jarry <[email protected]> --- app/test/test_net_ptype.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/app/test/test_net_ptype.c b/app/test/test_net_ptype.c index cc7026077191..332ace5dd929 100644 --- a/app/test/test_net_ptype.c +++ b/app/test/test_net_ptype.c @@ -163,6 +163,32 @@ static const uint8_t pkt_mpls_arp[] = { 0x00, 0x00, 0x7f, 0x00, 0x00, 0x02, }; +/* Ether()/Dot1Q() -- VLAN header truncated */ +static const uint8_t pkt_vlan_trunc[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x2a, +}; + +/* Ether(type=MPLS) -- MPLS header truncated */ +static const uint8_t pkt_mpls_trunc[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x88, 0x47, 0x00, 0x02, +}; + +/* Ether(type=MPLS)/MPLS(label=42,s=1) -- no payload after label */ +static const uint8_t pkt_mpls_no_payload[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x88, 0x47, 0x00, 0x02, + 0xa1, 0x40, +}; + +/* Ether()/IP() -- IPv4 header truncated */ +static const uint8_t pkt_ipv4_trunc[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x1d, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, +}; + /* Ether()/Dot1AD(vlan=42)/Dot1Q(vlan=43)/IPv6()/TCP() */ static const uint8_t pkt_qinq_ipv6_tcp[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, @@ -279,6 +305,18 @@ test_net_ptype(void) ret |= test_case(pool, pkt_mpls_arp, RTE_PTYPE_L2_ETHER_MPLS, 18, 0, 0); + ret |= test_case(pool, pkt_vlan_trunc, + RTE_PTYPE_L2_ETHER_VLAN, + 14, 0, 0); + ret |= test_case(pool, pkt_mpls_trunc, + RTE_PTYPE_L2_ETHER_MPLS, + 14, 0, 0); + ret |= test_case(pool, pkt_mpls_no_payload, + RTE_PTYPE_L2_ETHER_MPLS, + 18, 0, 0); + ret |= test_case(pool, pkt_ipv4_trunc, + RTE_PTYPE_L2_ETHER, + 14, 0, 0); rte_mempool_free(pool); -- 2.54.0

