ixgbe: fix dropping packets from unsupported Tx queues
[dpdk.git] / drivers / net / bonding / rte_eth_bond_pmd.c
index 839ba90..8961a67 100644 (file)
@@ -39,6 +39,7 @@
 #include <rte_tcp.h>
 #include <rte_udp.h>
 #include <rte_ip.h>
+#include <rte_ip_frag.h>
 #include <rte_devargs.h>
 #include <rte_kvargs.h>
 #include <rte_dev.h>
@@ -170,6 +171,7 @@ bond_ethdev_rx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
                         * mode and packet address does not match. */
                        if (unlikely(hdr->ether_type == ether_type_slow_be ||
                                !collecting || (!promisc &&
+                                       !is_multicast_ether_addr(&hdr->d_addr) &&
                                        !is_same_ether_addr(&bond_mac, &hdr->d_addr)))) {
 
                                if (hdr->ether_type == ether_type_slow_be) {
@@ -479,7 +481,7 @@ ether_hash(struct ether_hdr *eth_hdr)
 static inline uint32_t
 ipv4_hash(struct ipv4_hdr *ipv4_hdr)
 {
-       return (ipv4_hdr->src_addr ^ ipv4_hdr->dst_addr);
+       return ipv4_hdr->src_addr ^ ipv4_hdr->dst_addr;
 }
 
 static inline uint32_t
@@ -552,17 +554,20 @@ xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count)
 
                l3hash = ipv4_hash(ipv4_hdr);
 
-               ip_hdr_offset = (ipv4_hdr->version_ihl & IPV4_HDR_IHL_MASK) *
-                               IPV4_IHL_MULTIPLIER;
-
-               if (ipv4_hdr->next_proto_id == IPPROTO_TCP) {
-                       tcp_hdr = (struct tcp_hdr *)((char *)ipv4_hdr +
-                                       ip_hdr_offset);
-                       l4hash = HASH_L4_PORTS(tcp_hdr);
-               } else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) {
-                       udp_hdr = (struct udp_hdr *)((char *)ipv4_hdr +
-                                       ip_hdr_offset);
-                       l4hash = HASH_L4_PORTS(udp_hdr);
+               /* there is no L4 header in fragmented packet */
+               if (likely(rte_ipv4_frag_pkt_is_fragmented(ipv4_hdr) == 0)) {
+                       ip_hdr_offset = (ipv4_hdr->version_ihl & IPV4_HDR_IHL_MASK) *
+                                       IPV4_IHL_MULTIPLIER;
+
+                       if (ipv4_hdr->next_proto_id == IPPROTO_TCP) {
+                               tcp_hdr = (struct tcp_hdr *)((char *)ipv4_hdr +
+                                               ip_hdr_offset);
+                               l4hash = HASH_L4_PORTS(tcp_hdr);
+                       } else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) {
+                               udp_hdr = (struct udp_hdr *)((char *)ipv4_hdr +
+                                               ip_hdr_offset);
+                               l4hash = HASH_L4_PORTS(udp_hdr);
+                       }
                }
        } else if  (rte_cpu_to_be_16(ETHER_TYPE_IPv6) == proto) {
                struct ipv6_hdr *ipv6_hdr = (struct ipv6_hdr *)
@@ -1445,7 +1450,7 @@ slave_add(struct bond_dev_private *internals,
 
        /* If slave device doesn't support interrupts then we need to enabled
         * polling to monitor link status */
-       if (!(slave_eth_dev->data->dev_flags & RTE_PCI_DRV_INTR_LSC)) {
+       if (!(slave_eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)) {
                slave_details->link_status_poll_enabled = 1;
 
                if (!internals->link_status_polling_enabled) {
@@ -1815,16 +1820,11 @@ bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
                stats->opackets += slave_stats.opackets;
                stats->ibytes += slave_stats.ibytes;
                stats->obytes += slave_stats.obytes;
+               stats->imissed += slave_stats.imissed;
                stats->ierrors += slave_stats.ierrors;
                stats->oerrors += slave_stats.oerrors;
                stats->imcasts += slave_stats.imcasts;
                stats->rx_nombuf += slave_stats.rx_nombuf;
-               stats->fdirmatch += slave_stats.fdirmatch;
-               stats->fdirmiss += slave_stats.fdirmiss;
-               stats->tx_pause_xon += slave_stats.tx_pause_xon;
-               stats->rx_pause_xon += slave_stats.rx_pause_xon;
-               stats->tx_pause_xoff += slave_stats.tx_pause_xoff;
-               stats->rx_pause_xoff += slave_stats.rx_pause_xoff;
 
                for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
                        stats->q_ipackets[j] += slave_stats.q_ipackets[j];
@@ -2142,25 +2142,25 @@ bond_ethdev_rss_hash_conf_get(struct rte_eth_dev *dev,
        return 0;
 }
 
-struct eth_dev_ops default_dev_ops = {
-               .dev_start            = bond_ethdev_start,
-               .dev_stop             = bond_ethdev_stop,
-               .dev_close            = bond_ethdev_close,
-               .dev_configure        = bond_ethdev_configure,
-               .dev_infos_get        = bond_ethdev_info,
-               .rx_queue_setup       = bond_ethdev_rx_queue_setup,
-               .tx_queue_setup       = bond_ethdev_tx_queue_setup,
-               .rx_queue_release     = bond_ethdev_rx_queue_release,
-               .tx_queue_release     = bond_ethdev_tx_queue_release,
-               .link_update          = bond_ethdev_link_update,
-               .stats_get            = bond_ethdev_stats_get,
-               .stats_reset          = bond_ethdev_stats_reset,
-               .promiscuous_enable   = bond_ethdev_promiscuous_enable,
-               .promiscuous_disable  = bond_ethdev_promiscuous_disable,
-               .reta_update          = bond_ethdev_rss_reta_update,
-               .reta_query           = bond_ethdev_rss_reta_query,
-               .rss_hash_update      = bond_ethdev_rss_hash_update,
-               .rss_hash_conf_get    = bond_ethdev_rss_hash_conf_get
+const struct eth_dev_ops default_dev_ops = {
+       .dev_start            = bond_ethdev_start,
+       .dev_stop             = bond_ethdev_stop,
+       .dev_close            = bond_ethdev_close,
+       .dev_configure        = bond_ethdev_configure,
+       .dev_infos_get        = bond_ethdev_info,
+       .rx_queue_setup       = bond_ethdev_rx_queue_setup,
+       .tx_queue_setup       = bond_ethdev_tx_queue_setup,
+       .rx_queue_release     = bond_ethdev_rx_queue_release,
+       .tx_queue_release     = bond_ethdev_tx_queue_release,
+       .link_update          = bond_ethdev_link_update,
+       .stats_get            = bond_ethdev_stats_get,
+       .stats_reset          = bond_ethdev_stats_reset,
+       .promiscuous_enable   = bond_ethdev_promiscuous_enable,
+       .promiscuous_disable  = bond_ethdev_promiscuous_disable,
+       .reta_update          = bond_ethdev_rss_reta_update,
+       .reta_query           = bond_ethdev_rss_reta_query,
+       .rss_hash_update      = bond_ethdev_rss_hash_update,
+       .rss_hash_conf_get    = bond_ethdev_rss_hash_conf_get
 };
 
 static int