X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Fcsumonly.c;h=0177284d9cb416bc4d9b7cbec13636dd4c539560;hb=c8557ed434213fe11ecd867819823ea6865311d2;hp=75b24487e72ef6c5a0f3dd666128d5b58ad64378;hpb=295968d1740760337e16b0d7914875c5cac52850;p=dpdk.git diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index 75b24487e7..0177284d9c 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -41,8 +40,12 @@ #include #include #include +#ifdef RTE_LIB_GRO #include +#endif +#ifdef RTE_LIB_GSO #include +#endif #include #include "testpmd.h" @@ -69,7 +72,9 @@ uint16_t geneve_udp_port = RTE_GENEVE_DEFAULT_PORT; /* structure that caches offload info for the current packet */ struct testpmd_offload_info { uint16_t ethertype; +#ifdef RTE_LIB_GSO uint8_t gso_enable; +#endif uint16_t l2_len; uint16_t l3_len; uint16_t l4_len; @@ -481,12 +486,12 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, if (info->ethertype == _htons(RTE_ETHER_TYPE_IPV4)) { ipv4_hdr = l3_hdr; - ol_flags |= PKT_TX_IPV4; + ol_flags |= RTE_MBUF_F_TX_IPV4; if (info->l4_proto == IPPROTO_TCP && tso_segsz) { - ol_flags |= PKT_TX_IP_CKSUM; + ol_flags |= RTE_MBUF_F_TX_IP_CKSUM; } else { if (tx_offloads & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) { - ol_flags |= PKT_TX_IP_CKSUM; + ol_flags |= RTE_MBUF_F_TX_IP_CKSUM; } else { ipv4_hdr->hdr_checksum = 0; ipv4_hdr->hdr_checksum = @@ -494,7 +499,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, } } } else if (info->ethertype == _htons(RTE_ETHER_TYPE_IPV6)) - ol_flags |= PKT_TX_IPV6; + ol_flags |= RTE_MBUF_F_TX_IPV6; else return 0; /* packet type not supported, nothing to do */ @@ -503,7 +508,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, /* do not recalculate udp cksum if it was 0 */ if (udp_hdr->dgram_cksum != 0) { if (tx_offloads & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) { - ol_flags |= PKT_TX_UDP_CKSUM; + ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; } else { udp_hdr->dgram_cksum = 0; udp_hdr->dgram_cksum = @@ -511,22 +516,26 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, info->ethertype); } } +#ifdef RTE_LIB_GSO if (info->gso_enable) - ol_flags |= PKT_TX_UDP_SEG; + ol_flags |= RTE_MBUF_F_TX_UDP_SEG; +#endif } else if (info->l4_proto == IPPROTO_TCP) { tcp_hdr = (struct rte_tcp_hdr *)((char *)l3_hdr + info->l3_len); if (tso_segsz) - ol_flags |= PKT_TX_TCP_SEG; + ol_flags |= RTE_MBUF_F_TX_TCP_SEG; else if (tx_offloads & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) { - ol_flags |= PKT_TX_TCP_CKSUM; + ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; } else { tcp_hdr->cksum = 0; tcp_hdr->cksum = get_udptcp_checksum(l3_hdr, tcp_hdr, info->ethertype); } +#ifdef RTE_LIB_GSO if (info->gso_enable) - ol_flags |= PKT_TX_TCP_SEG; + ol_flags |= RTE_MBUF_F_TX_TCP_SEG; +#endif } else if (info->l4_proto == IPPROTO_SCTP) { sctp_hdr = (struct rte_sctp_hdr *) ((char *)l3_hdr + info->l3_len); @@ -534,7 +543,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, * offloaded */ if ((tx_offloads & RTE_ETH_TX_OFFLOAD_SCTP_CKSUM) && ((ipv4_hdr->total_length & 0x3) == 0)) { - ol_flags |= PKT_TX_SCTP_CKSUM; + ol_flags |= RTE_MBUF_F_TX_SCTP_CKSUM; } else { sctp_hdr->cksum = 0; /* XXX implement CRC32c, example available in @@ -557,14 +566,14 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info, if (info->outer_ethertype == _htons(RTE_ETHER_TYPE_IPV4)) { ipv4_hdr->hdr_checksum = 0; - ol_flags |= PKT_TX_OUTER_IPV4; + ol_flags |= RTE_MBUF_F_TX_OUTER_IPV4; if (tx_offloads & RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM) - ol_flags |= PKT_TX_OUTER_IP_CKSUM; + ol_flags |= RTE_MBUF_F_TX_OUTER_IP_CKSUM; else ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr); } else - ol_flags |= PKT_TX_OUTER_IPV6; + ol_flags |= RTE_MBUF_F_TX_OUTER_IPV6; if (info->outer_l4_proto != IPPROTO_UDP) return ol_flags; @@ -573,7 +582,7 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info, ((char *)outer_l3_hdr + info->outer_l3_len); if (tso_enabled) - ol_flags |= PKT_TX_TCP_SEG; + ol_flags |= RTE_MBUF_F_TX_TCP_SEG; /* Skip SW outer UDP checksum generation if HW supports it */ if (tx_offloads & RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM) { @@ -584,7 +593,7 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info, udp_hdr->dgram_cksum = rte_ipv6_phdr_cksum(ipv6_hdr, ol_flags); - ol_flags |= PKT_TX_OUTER_UDP_CKSUM; + ol_flags |= RTE_MBUF_F_TX_OUTER_UDP_CKSUM; return ol_flags; } @@ -787,7 +796,7 @@ pkt_copy_split(const struct rte_mbuf *pkt) * * The testpmd command line for this forward engine sets the flags * TESTPMD_TX_OFFLOAD_* in ports[tx_port].tx_ol_flags. They control - * wether a checksum must be calculated in software or in hardware. The + * whether a checksum must be calculated in software or in hardware. The * IP, UDP, TCP and SCTP flags always concern the inner layer. The * OUTER_IP is only useful for tunnel packets. */ @@ -795,16 +804,20 @@ static void pkt_burst_checksum_forward(struct fwd_stream *fs) { struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; +#ifdef RTE_LIB_GSO struct rte_mbuf *gso_segments[GSO_MAX_PKT_BURST]; struct rte_gso_ctx *gso_ctx; +#endif struct rte_mbuf **tx_pkts_burst; struct rte_port *txp; struct rte_mbuf *m, *p; struct rte_ether_hdr *eth_hdr; void *l3_hdr = NULL, *outer_l3_hdr = NULL; /* can be IPv4 or IPv6 */ +#ifdef RTE_LIB_GRO void **gro_ctx; uint16_t gro_pkts_num; uint8_t gro_enable; +#endif uint16_t nb_rx; uint16_t nb_tx; uint16_t nb_prep; @@ -817,8 +830,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) uint32_t rx_bad_outer_l4_csum; uint32_t rx_bad_outer_ip_csum; struct testpmd_offload_info info; - uint16_t nb_segments = 0; - int ret; uint64_t start_tsc = 0; @@ -836,15 +847,19 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) rx_bad_l4_csum = 0; rx_bad_outer_l4_csum = 0; rx_bad_outer_ip_csum = 0; +#ifdef RTE_LIB_GRO gro_enable = gro_ports[fs->rx_port].enable; +#endif txp = &ports[fs->tx_port]; tx_offloads = txp->dev_conf.txmode.offloads; memset(&info, 0, sizeof(info)); info.tso_segsz = txp->tso_segsz; info.tunnel_tso_segsz = txp->tunnel_tso_segsz; +#ifdef RTE_LIB_GSO if (gso_ports[fs->tx_port].enable) info.gso_enable = 1; +#endif for (i = 0; i < nb_rx; i++) { if (likely(i < nb_rx - 1)) @@ -855,17 +870,17 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) info.is_tunnel = 0; info.pkt_len = rte_pktmbuf_pkt_len(m); tx_ol_flags = m->ol_flags & - (IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF); + (RTE_MBUF_F_INDIRECT | RTE_MBUF_F_EXTERNAL); rx_ol_flags = m->ol_flags; /* Update the L3/L4 checksum error packet statistics */ - if ((rx_ol_flags & PKT_RX_IP_CKSUM_MASK) == PKT_RX_IP_CKSUM_BAD) + if ((rx_ol_flags & RTE_MBUF_F_RX_IP_CKSUM_MASK) == RTE_MBUF_F_RX_IP_CKSUM_BAD) rx_bad_ip_csum += 1; - if ((rx_ol_flags & PKT_RX_L4_CKSUM_MASK) == PKT_RX_L4_CKSUM_BAD) + if ((rx_ol_flags & RTE_MBUF_F_RX_L4_CKSUM_MASK) == RTE_MBUF_F_RX_L4_CKSUM_BAD) rx_bad_l4_csum += 1; - if (rx_ol_flags & PKT_RX_OUTER_L4_CKSUM_BAD) + if (rx_ol_flags & RTE_MBUF_F_RX_OUTER_L4_CKSUM_BAD) rx_bad_outer_l4_csum += 1; - if (rx_ol_flags & PKT_RX_OUTER_IP_CKSUM_BAD) + if (rx_ol_flags & RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD) rx_bad_outer_ip_csum += 1; /* step 1: dissect packet, parsing optional vlan, ip4/ip6, vxlan @@ -888,26 +903,26 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) ((char *)l3_hdr + info.l3_len); parse_gtp(udp_hdr, &info); if (info.is_tunnel) { - tx_ol_flags |= PKT_TX_TUNNEL_GTP; + tx_ol_flags |= RTE_MBUF_F_TX_TUNNEL_GTP; goto tunnel_update; } parse_vxlan_gpe(udp_hdr, &info); if (info.is_tunnel) { tx_ol_flags |= - PKT_TX_TUNNEL_VXLAN_GPE; + RTE_MBUF_F_TX_TUNNEL_VXLAN_GPE; goto tunnel_update; } parse_vxlan(udp_hdr, &info, m->packet_type); if (info.is_tunnel) { tx_ol_flags |= - PKT_TX_TUNNEL_VXLAN; + RTE_MBUF_F_TX_TUNNEL_VXLAN; goto tunnel_update; } parse_geneve(udp_hdr, &info); if (info.is_tunnel) { tx_ol_flags |= - PKT_TX_TUNNEL_GENEVE; + RTE_MBUF_F_TX_TUNNEL_GENEVE; goto tunnel_update; } } else if (info.l4_proto == IPPROTO_GRE) { @@ -917,14 +932,14 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) ((char *)l3_hdr + info.l3_len); parse_gre(gre_hdr, &info); if (info.is_tunnel) - tx_ol_flags |= PKT_TX_TUNNEL_GRE; + tx_ol_flags |= RTE_MBUF_F_TX_TUNNEL_GRE; } else if (info.l4_proto == IPPROTO_IPIP) { void *encap_ip_hdr; encap_ip_hdr = (char *)l3_hdr + info.l3_len; parse_encap_ip(encap_ip_hdr, &info); if (info.is_tunnel) - tx_ol_flags |= PKT_TX_TUNNEL_IPIP; + tx_ol_flags |= RTE_MBUF_F_TX_TUNNEL_IPIP; } } @@ -950,7 +965,7 @@ tunnel_update: if (info.is_tunnel == 1) { tx_ol_flags |= process_outer_cksums(outer_l3_hdr, &info, tx_offloads, - !!(tx_ol_flags & PKT_TX_TCP_SEG)); + !!(tx_ol_flags & RTE_MBUF_F_TX_TCP_SEG)); } /* step 3: fill the mbuf meta data (flags and header lengths) */ @@ -1014,7 +1029,7 @@ tunnel_update: "l4_proto=%d l4_len=%d flags=%s\n", info.l2_len, rte_be_to_cpu_16(info.ethertype), info.l3_len, info.l4_proto, info.l4_len, buf); - if (rx_ol_flags & PKT_RX_LRO) + if (rx_ol_flags & RTE_MBUF_F_RX_LRO) printf("rx: m->lro_segsz=%u\n", m->tso_segsz); if (info.is_tunnel == 1) printf("rx: outer_l2_len=%d outer_ethertype=%x " @@ -1035,17 +1050,17 @@ tunnel_update: RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM) || (tx_offloads & RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM) || - (tx_ol_flags & PKT_TX_OUTER_IPV6)) + (tx_ol_flags & RTE_MBUF_F_TX_OUTER_IPV6)) printf("tx: m->outer_l2_len=%d " "m->outer_l3_len=%d\n", m->outer_l2_len, m->outer_l3_len); if (info.tunnel_tso_segsz != 0 && - (m->ol_flags & PKT_TX_TCP_SEG)) + (m->ol_flags & RTE_MBUF_F_TX_TCP_SEG)) printf("tx: m->tso_segsz=%d\n", m->tso_segsz); } else if (info.tso_segsz != 0 && - (m->ol_flags & PKT_TX_TCP_SEG)) + (m->ol_flags & RTE_MBUF_F_TX_TCP_SEG)) printf("tx: m->tso_segsz=%d\n", m->tso_segsz); rte_get_tx_ol_flag_list(m->ol_flags, buf, sizeof(buf)); printf("tx: flags=%s", buf); @@ -1053,6 +1068,7 @@ tunnel_update: } } +#ifdef RTE_LIB_GRO if (unlikely(gro_enable)) { if (gro_flush_cycles == GRO_DEFAULT_FLUSH_CYCLES) { nb_rx = rte_gro_reassemble_burst(pkts_burst, nb_rx, @@ -1074,13 +1090,17 @@ tunnel_update: } } } +#endif + +#ifdef RTE_LIB_GSO + if (gso_ports[fs->tx_port].enable != 0) { + uint16_t nb_segments = 0; - if (gso_ports[fs->tx_port].enable == 0) - tx_pkts_burst = pkts_burst; - else { gso_ctx = &(current_fwd_lcore()->gso_ctx); gso_ctx->gso_size = gso_max_segment_size; for (i = 0; i < nb_rx; i++) { + int ret; + ret = rte_gso_segment(pkts_burst[i], gso_ctx, &gso_segments[nb_segments], GSO_MAX_PKT_BURST - nb_segments); @@ -1102,7 +1122,9 @@ tunnel_update: tx_pkts_burst = gso_segments; nb_rx = nb_segments; - } + } else +#endif + tx_pkts_burst = pkts_burst; nb_prep = rte_eth_tx_prepare(fs->tx_port, fs->tx_queue, tx_pkts_burst, nb_rx);