test mbuf attach
[dpdk.git] / app / test-pmd / csumonly.c
index fe19615..0a96b24 100644 (file)
@@ -139,22 +139,23 @@ parse_ipv6(struct rte_ipv6_hdr *ipv6_hdr, struct testpmd_offload_info *info)
 
 /*
  * Parse an ethernet header to fill the ethertype, l2_len, l3_len and
- * ipproto. This function is able to recognize IPv4/IPv6 with one optional vlan
- * header. The l4_len argument is only set in case of TCP (useful for TSO).
+ * ipproto. This function is able to recognize IPv4/IPv6 with optional VLAN
+ * headers. The l4_len argument is only set in case of TCP (useful for TSO).
  */
 static void
 parse_ethernet(struct rte_ether_hdr *eth_hdr, struct testpmd_offload_info *info)
 {
        struct rte_ipv4_hdr *ipv4_hdr;
        struct rte_ipv6_hdr *ipv6_hdr;
+       struct rte_vlan_hdr *vlan_hdr;
 
        info->l2_len = sizeof(struct rte_ether_hdr);
        info->ethertype = eth_hdr->ether_type;
 
-       if (info->ethertype == _htons(RTE_ETHER_TYPE_VLAN)) {
-               struct rte_vlan_hdr *vlan_hdr = (
-                       struct rte_vlan_hdr *)(eth_hdr + 1);
-
+       while (info->ethertype == _htons(RTE_ETHER_TYPE_VLAN) ||
+              info->ethertype == _htons(RTE_ETHER_TYPE_QINQ)) {
+               vlan_hdr = (struct rte_vlan_hdr *)
+                       ((char *)eth_hdr + info->l2_len);
                info->l2_len  += sizeof(struct rte_vlan_hdr);
                info->ethertype = vlan_hdr->eth_proto;
        }
@@ -801,11 +802,12 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
        /* receive a burst of packet */
        nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst,
                                 nb_pkt_per_burst);
-       if (unlikely(nb_rx == 0))
-               return;
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
        fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
 #endif
+       if (unlikely(nb_rx == 0))
+               return;
+
        fs->rx_packets += nb_rx;
        rx_bad_ip_csum = 0;
        rx_bad_l4_csum = 0;