app: replace some offload flags with packet type

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

Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
This commit is contained in:
Helin Zhang 2015-07-10 00:31:32 +08:00 committed by Thomas Monjalon
parent 429df3803a
commit 9e972be2b7
4 changed files with 214 additions and 2 deletions

@ -459,20 +459,33 @@ app_main_loop_rx_metadata(void) {
signature = RTE_MBUF_METADATA_UINT32_PTR(m, 0);
key = RTE_MBUF_METADATA_UINT8_PTR(m, 32);
#ifdef RTE_NEXT_ABI
if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
#else
if (m->ol_flags & PKT_RX_IPV4_HDR) {
#endif
ip_hdr = (struct ipv4_hdr *)
&m_data[sizeof(struct ether_hdr)];
ip_dst = ip_hdr->dst_addr;
k32 = (uint32_t *) key;
k32[0] = ip_dst & 0xFFFFFF00;
#ifdef RTE_NEXT_ABI
} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
#else
} else {
#endif
ipv6_hdr = (struct ipv6_hdr *)
&m_data[sizeof(struct ether_hdr)];
ipv6_dst = ipv6_hdr->dst_addr;
memcpy(key, ipv6_dst, 16);
#ifdef RTE_NEXT_ABI
} else
continue;
#else
}
#endif
*signature = test_hash(key, 0, 0);
}

@ -202,8 +202,14 @@ parse_ethernet(struct ether_hdr *eth_hdr, struct testpmd_offload_info *info)
/* Parse a vxlan header */
static void
#ifdef RTE_NEXT_ABI
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_NEXT_ABI
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_NEXT_ABI
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 *)

@ -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_NEXT_ABI
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_NEXT_ABI
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);
@ -163,6 +171,177 @@ pkt_burst_receive(struct fwd_stream *fs)
if (ol_flags & PKT_RX_QINQ_PKT)
printf(" - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x",
mb->vlan_tci, mb->vlan_tci_outer);
#ifdef RTE_NEXT_ABI
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_ETHER:
printf(" - (outer) L2 type: ETHER");
break;
case RTE_PTYPE_L2_ETHER_TIMESYNC:
printf(" - (outer) L2 type: ETHER_Timesync");
break;
case RTE_PTYPE_L2_ETHER_ARP:
printf(" - (outer) L2 type: ETHER_ARP");
break;
case RTE_PTYPE_L2_ETHER_LLDP:
printf(" - (outer) L2 type: ETHER_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: Unknown");
break;
}
/* inner L2 packet type */
ptype = mb->packet_type & RTE_PTYPE_INNER_L2_MASK;
switch (ptype) {
case RTE_PTYPE_INNER_L2_ETHER:
printf(" - Inner L2 type: ETHER");
break;
case RTE_PTYPE_INNER_L2_ETHER_VLAN:
printf(" - Inner L2 type: ETHER_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_UNKNOWN");
break;
default:
printf(" - Inner L3 type: Unknown");
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_NEXT_ABI */
if (is_encapsulation) {
struct ipv4_hdr *ipv4_hdr;
struct ipv6_hdr *ipv6_hdr;
@ -176,7 +355,11 @@ pkt_burst_receive(struct fwd_stream *fs)
l2_len = sizeof(struct ether_hdr);
/* Do not support ipv4 option field */
#ifdef RTE_NEXT_ABI
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 = rte_pktmbuf_mtod_offset(mb,
struct ipv4_hdr *,

@ -273,19 +273,21 @@ nomore_mbuf:
if (ipv4) {
pkt->vlan_tci = ETHER_TYPE_IPv4;
pkt->l3_len = sizeof(struct ipv4_hdr);
#ifndef RTE_NEXT_ABI
if (vlan_enabled)
pkt->ol_flags = PKT_RX_IPV4_HDR | PKT_RX_VLAN_PKT;
else
pkt->ol_flags = PKT_RX_IPV4_HDR;
#endif
} else {
pkt->vlan_tci = ETHER_TYPE_IPv6;
pkt->l3_len = sizeof(struct ipv6_hdr);
#ifndef RTE_NEXT_ABI
if (vlan_enabled)
pkt->ol_flags = PKT_RX_IPV6_HDR | PKT_RX_VLAN_PKT;
else
pkt->ol_flags = PKT_RX_IPV6_HDR;
#endif
}
pkts_burst[nb_pkt] = pkt;