To unify packet types among all PMDs, bit masks of packet type for
'ol_flags' are replaced by unified packet type.
To avoid breaking ABI compatibility, all the changes would be
enabled by RTE_UNIFIED_PKT_TYPE, which is disabled by default.

Signed-off-by: Helin Zhang <helin.zhang at intel.com>
Signed-off-by: Jijiang Liu <jijiang.liu at intel.com>
---
 app/test-pmd/csumonly.c |  14 ++++
 app/test-pmd/rxonly.c   | 183 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 197 insertions(+)

v2 changes:
* Used redefined packet types and enlarged packet_type field in mbuf.

v4 changes:
* Added printing logs of packet types of each received packet in rxonly mode.

v5 changes:
* Re-worded the commit logs.

v6 changes:
* Disabled the code changes for unified packet type by default, to
  avoid breaking ABI compatibility.

diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index c180ff2..43ab6f8 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -202,8 +202,14 @@ parse_ethernet(struct ether_hdr *eth_hdr, struct 
testpmd_offload_info *info)

 /* Parse a vxlan header */
 static void
+#ifdef RTE_UNIFIED_PKT_TYPE
+parse_vxlan(struct udp_hdr *udp_hdr,
+           struct testpmd_offload_info *info,
+           uint32_t pkt_type)
+#else
 parse_vxlan(struct udp_hdr *udp_hdr, struct testpmd_offload_info *info,
        uint64_t mbuf_olflags)
+#endif
 {
        struct ether_hdr *eth_hdr;

@@ -211,8 +217,12 @@ parse_vxlan(struct udp_hdr *udp_hdr, struct 
testpmd_offload_info *info,
         * (rfc7348) or that the rx offload flag is set (i40e only
         * currently) */
        if (udp_hdr->dst_port != _htons(4789) &&
+#ifdef RTE_UNIFIED_PKT_TYPE
+               RTE_ETH_IS_TUNNEL_PKT(pkt_type) == 0)
+#else
                (mbuf_olflags & (PKT_RX_TUNNEL_IPV4_HDR |
                        PKT_RX_TUNNEL_IPV6_HDR)) == 0)
+#endif
                return;

        info->is_tunnel = 1;
@@ -549,7 +559,11 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
                                struct udp_hdr *udp_hdr;
                                udp_hdr = (struct udp_hdr *)((char *)l3_hdr +
                                        info.l3_len);
+#ifdef RTE_UNIFIED_PKT_TYPE
+                               parse_vxlan(udp_hdr, &info, m->packet_type);
+#else
                                parse_vxlan(udp_hdr, &info, m->ol_flags);
+#endif
                        } else if (info.l4_proto == IPPROTO_GRE) {
                                struct simple_gre_hdr *gre_hdr;
                                gre_hdr = (struct simple_gre_hdr *)
diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c
index ac56090..e6767be 100644
--- a/app/test-pmd/rxonly.c
+++ b/app/test-pmd/rxonly.c
@@ -91,7 +91,11 @@ pkt_burst_receive(struct fwd_stream *fs)
        uint64_t ol_flags;
        uint16_t nb_rx;
        uint16_t i, packet_type;
+#ifdef RTE_UNIFIED_PKT_TYPE
+       uint16_t is_encapsulation;
+#else
        uint64_t is_encapsulation;
+#endif

 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
        uint64_t start_tsc;
@@ -135,8 +139,12 @@ pkt_burst_receive(struct fwd_stream *fs)
                ol_flags = mb->ol_flags;
                packet_type = mb->packet_type;

+#ifdef RTE_UNIFIED_PKT_TYPE
+               is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type);
+#else
                is_encapsulation = ol_flags & (PKT_RX_TUNNEL_IPV4_HDR |
                                PKT_RX_TUNNEL_IPV6_HDR);
+#endif

                print_ether_addr("  src=", &eth_hdr->s_addr);
                print_ether_addr(" - dst=", &eth_hdr->d_addr);
@@ -160,6 +168,177 @@ pkt_burst_receive(struct fwd_stream *fs)
                }
                if (ol_flags & PKT_RX_VLAN_PKT)
                        printf(" - VLAN tci=0x%x", mb->vlan_tci);
+#ifdef RTE_UNIFIED_PKT_TYPE
+               if (mb->packet_type) {
+                       uint32_t ptype;
+
+                       /* (outer) L2 packet type */
+                       ptype = mb->packet_type & RTE_PTYPE_L2_MASK;
+                       switch (ptype) {
+                       case RTE_PTYPE_L2_MAC:
+                               printf(" - (outer) L2 type: MAC");
+                               break;
+                       case RTE_PTYPE_L2_MAC_TIMESYNC:
+                               printf(" - (outer) L2 type: MAC Timesync");
+                               break;
+                       case RTE_PTYPE_L2_ARP:
+                               printf(" - (outer) L2 type: ARP");
+                               break;
+                       case RTE_PTYPE_L2_LLDP:
+                               printf(" - (outer) L2 type: LLDP");
+                               break;
+                       default:
+                               printf(" - (outer) L2 type: Unknown");
+                               break;
+                       }
+
+                       /* (outer) L3 packet type */
+                       ptype = mb->packet_type & RTE_PTYPE_L3_MASK;
+                       switch (ptype) {
+                       case RTE_PTYPE_L3_IPV4:
+                               printf(" - (outer) L3 type: IPV4");
+                               break;
+                       case RTE_PTYPE_L3_IPV4_EXT:
+                               printf(" - (outer) L3 type: IPV4_EXT");
+                               break;
+                       case RTE_PTYPE_L3_IPV6:
+                               printf(" - (outer) L3 type: IPV6");
+                               break;
+                       case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN:
+                               printf(" - (outer) L3 type: IPV4_EXT_UNKNOWN");
+                               break;
+                       case RTE_PTYPE_L3_IPV6_EXT:
+                               printf(" - (outer) L3 type: IPV6_EXT");
+                               break;
+                       case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN:
+                               printf(" - (outer) L3 type: IPV6_EXT_UNKNOWN");
+                               break;
+                       default:
+                               printf(" - (outer) L3 type: Unknown");
+                               break;
+                       }
+
+                       /* (outer) L4 packet type */
+                       ptype = mb->packet_type & RTE_PTYPE_L4_MASK;
+                       switch (ptype) {
+                       case RTE_PTYPE_L4_TCP:
+                               printf(" - (outer) L4 type: TCP");
+                               break;
+                       case RTE_PTYPE_L4_UDP:
+                               printf(" - (outer) L4 type: UDP");
+                               break;
+                       case RTE_PTYPE_L4_FRAG:
+                               printf(" - (outer) L4 type: L4_FRAG");
+                               break;
+                       case RTE_PTYPE_L4_SCTP:
+                               printf(" - (outer) L4 type: SCTP");
+                               break;
+                       case RTE_PTYPE_L4_ICMP:
+                               printf(" - (outer) L4 type: ICMP");
+                               break;
+                       case RTE_PTYPE_L4_NONFRAG:
+                               printf(" - (outer) L4 type: L4_NONFRAG");
+                               break;
+                       default:
+                               printf(" - (outer) L4 type: Unknown");
+                               break;
+                       }
+
+                       /* packet tunnel type */
+                       ptype = mb->packet_type & RTE_PTYPE_TUNNEL_MASK;
+                       switch (ptype) {
+                       case RTE_PTYPE_TUNNEL_IP:
+                               printf(" - Tunnel type: IP");
+                               break;
+                       case RTE_PTYPE_TUNNEL_GRE:
+                               printf(" - Tunnel type: GRE");
+                               break;
+                       case RTE_PTYPE_TUNNEL_VXLAN:
+                               printf(" - Tunnel type: VXLAN");
+                               break;
+                       case RTE_PTYPE_TUNNEL_NVGRE:
+                               printf(" - Tunnel type: NVGRE");
+                               break;
+                       case RTE_PTYPE_TUNNEL_GENEVE:
+                               printf(" - Tunnel type: GENEVE");
+                               break;
+                       case RTE_PTYPE_TUNNEL_GRENAT:
+                               printf(" - Tunnel type: GRENAT");
+                               break;
+                       default:
+                               printf(" - Tunnel type: Unkown");
+                               break;
+                       }
+
+                       /* inner L2 packet type */
+                       ptype = mb->packet_type & RTE_PTYPE_INNER_L2_MASK;
+                       switch (ptype) {
+                       case RTE_PTYPE_INNER_L2_MAC:
+                               printf(" - Inner L2 type: MAC");
+                               break;
+                       case RTE_PTYPE_INNER_L2_MAC_VLAN:
+                               printf(" - Inner L2 type: MAC_VLAN");
+                               break;
+                       default:
+                               printf(" - Inner L2 type: Unknown");
+                               break;
+                       }
+
+                       /* inner L3 packet type */
+                       ptype = mb->packet_type & RTE_PTYPE_INNER_INNER_L3_MASK;
+                       switch (ptype) {
+                       case RTE_PTYPE_INNER_L3_IPV4:
+                               printf(" - Inner L3 type: IPV4");
+                               break;
+                       case RTE_PTYPE_INNER_L3_IPV4_EXT:
+                               printf(" - Inner L3 type: IPV4_EXT");
+                               break;
+                       case RTE_PTYPE_INNER_L3_IPV6:
+                               printf(" - Inner L3 type: IPV6");
+                               break;
+                       case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
+                               printf(" - Inner L3 type: IPV4_EXT_UNKNOWN");
+                               break;
+                       case RTE_PTYPE_INNER_L3_IPV6_EXT:
+                               printf(" - Inner L3 type: IPV6_EXT");
+                               break;
+                       case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
+                               printf(" - Inner L3 type: IPV6_EXT_UNKOWN");
+                               break;
+                       default:
+                               printf(" - Inner L3 type: Unkown");
+                               break;
+                       }
+
+                       /* inner L4 packet type */
+                       ptype = mb->packet_type & RTE_PTYPE_INNER_L4_MASK;
+                       switch (ptype) {
+                       case RTE_PTYPE_INNER_L4_TCP:
+                               printf(" - Inner L4 type: TCP");
+                               break;
+                       case RTE_PTYPE_INNER_L4_UDP:
+                               printf(" - Inner L4 type: UDP");
+                               break;
+                       case RTE_PTYPE_INNER_L4_FRAG:
+                               printf(" - Inner L4 type: L4_FRAG");
+                               break;
+                       case RTE_PTYPE_INNER_L4_SCTP:
+                               printf(" - Inner L4 type: SCTP");
+                               break;
+                       case RTE_PTYPE_INNER_L4_ICMP:
+                               printf(" - Inner L4 type: ICMP");
+                               break;
+                       case RTE_PTYPE_INNER_L4_NONFRAG:
+                               printf(" - Inner L4 type: L4_NONFRAG");
+                               break;
+                       default:
+                               printf(" - Inner L4 type: Unknown");
+                               break;
+                       }
+                       printf("\n");
+               } else
+                       printf("Unknown packet type\n");
+#endif /* RTE_UNIFIED_PKT_TYPE */
                if (is_encapsulation) {
                        struct ipv4_hdr *ipv4_hdr;
                        struct ipv6_hdr *ipv6_hdr;
@@ -173,7 +352,11 @@ pkt_burst_receive(struct fwd_stream *fs)
                        l2_len  = sizeof(struct ether_hdr);

                         /* Do not support ipv4 option field */
+#ifdef RTE_UNIFIED_PKT_TYPE
+                       if (RTE_ETH_IS_IPV4_HDR(packet_type)) {
+#else
                        if (ol_flags & PKT_RX_TUNNEL_IPV4_HDR) {
+#endif
                                l3_len = sizeof(struct ipv4_hdr);
                                ipv4_hdr = (struct ipv4_hdr *) 
(rte_pktmbuf_mtod(mb,
                                                unsigned char *) + l2_len);
-- 
1.9.3

Reply via email to