net/sfc: report user flag on EF100 native datapath
[dpdk.git] / drivers / net / bonding / rte_eth_bond_pmd.c
index 5241c60..4c604d6 100644 (file)
@@ -342,11 +342,11 @@ rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts,
                                                 bufs[j])) ||
                                !collecting ||
                                (!promisc &&
-                                ((rte_is_unicast_ether_addr(&hdr->d_addr) &&
+                                ((rte_is_unicast_ether_addr(&hdr->dst_addr) &&
                                   !rte_is_same_ether_addr(bond_mac,
-                                                      &hdr->d_addr)) ||
+                                                      &hdr->dst_addr)) ||
                                  (!allmulti &&
-                                  rte_is_multicast_ether_addr(&hdr->d_addr)))))) {
+                                  rte_is_multicast_ether_addr(&hdr->dst_addr)))))) {
 
                                if (hdr->ether_type == ether_type_slow_be) {
                                        bond_mode_8023ad_handle_slow_pkt(
@@ -473,17 +473,13 @@ update_client_stats(uint32_t addr, uint16_t port, uint32_t *TXorRXindicator)
 #ifdef RTE_LIBRTE_BOND_DEBUG_ALB
 #define MODE6_DEBUG(info, src_ip, dst_ip, eth_h, arp_op, port, burstnumber) \
        rte_log(RTE_LOG_DEBUG, bond_logtype,                            \
-               "%s port:%d SrcMAC:%02X:%02X:%02X:%02X:%02X:%02X SrcIP:%s " \
-               "DstMAC:%02X:%02X:%02X:%02X:%02X:%02X DstIP:%s %s %d\n", \
+               "%s port:%d SrcMAC:" RTE_ETHER_ADDR_PRT_FMT " SrcIP:%s " \
+               "DstMAC:" RTE_ETHER_ADDR_PRT_FMT " DstIP:%s %s %d\n", \
                info,                                                   \
                port,                                                   \
-               eth_h->s_addr.addr_bytes[0], eth_h->s_addr.addr_bytes[1], \
-               eth_h->s_addr.addr_bytes[2], eth_h->s_addr.addr_bytes[3], \
-               eth_h->s_addr.addr_bytes[4], eth_h->s_addr.addr_bytes[5], \
+               RTE_ETHER_ADDR_BYTES(&eth_h->src_addr),                  \
                src_ip,                                                 \
-               eth_h->d_addr.addr_bytes[0], eth_h->d_addr.addr_bytes[1], \
-               eth_h->d_addr.addr_bytes[2], eth_h->d_addr.addr_bytes[3], \
-               eth_h->d_addr.addr_bytes[4], eth_h->d_addr.addr_bytes[5], \
+               RTE_ETHER_ADDR_BYTES(&eth_h->dst_addr),                  \
                dst_ip,                                                 \
                arp_op, ++burstnumber)
 #endif
@@ -647,9 +643,9 @@ static inline uint16_t
 ether_hash(struct rte_ether_hdr *eth_hdr)
 {
        unaligned_uint16_t *word_src_addr =
-               (unaligned_uint16_t *)eth_hdr->s_addr.addr_bytes;
+               (unaligned_uint16_t *)eth_hdr->src_addr.addr_bytes;
        unaligned_uint16_t *word_dst_addr =
-               (unaligned_uint16_t *)eth_hdr->d_addr.addr_bytes;
+               (unaligned_uint16_t *)eth_hdr->dst_addr.addr_bytes;
 
        return (word_src_addr[0] ^ word_dst_addr[0]) ^
                        (word_src_addr[1] ^ word_dst_addr[1]) ^
@@ -946,10 +942,10 @@ bond_ethdev_tx_burst_tlb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
                        ether_hdr = rte_pktmbuf_mtod(bufs[j],
                                                struct rte_ether_hdr *);
-                       if (rte_is_same_ether_addr(&ether_hdr->s_addr,
+                       if (rte_is_same_ether_addr(&ether_hdr->src_addr,
                                                        &primary_slave_addr))
                                rte_ether_addr_copy(&active_slave_addr,
-                                               &ether_hdr->s_addr);
+                                               &ether_hdr->src_addr);
 #if defined(RTE_LIBRTE_BOND_DEBUG_ALB) || defined(RTE_LIBRTE_BOND_DEBUG_ALB_L1)
                                        mode6_debug("TX IPv4:", ether_hdr, slaves[i], &burstnumberTX);
 #endif
@@ -1021,7 +1017,7 @@ bond_ethdev_tx_burst_alb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        slave_idx = bond_mode_alb_arp_xmit(eth_h, offset, internals);
 
                        /* Change src mac in eth header */
-                       rte_eth_macaddr_get(slave_idx, &eth_h->s_addr);
+                       rte_eth_macaddr_get(slave_idx, &eth_h->src_addr);
 
                        /* Add packet to slave tx buffer */
                        slave_bufs[slave_idx][slave_bufs_pkts[slave_idx]] = bufs[i];
@@ -1705,14 +1701,11 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
 
        /* If RSS is enabled for bonding, try to enable it for slaves  */
        if (bonded_eth_dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) {
-               if (internals->rss_key_len != 0) {
-                       slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len =
+               /* rss_key won't be empty if RSS is configured in bonded dev */
+               slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len =
                                        internals->rss_key_len;
-                       slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key =
+               slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key =
                                        internals->rss_key;
-               } else {
-                       slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
-               }
 
                slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =
                                bonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf;
@@ -1805,12 +1798,13 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
                                != 0)
                        return errval;
 
-               if (bond_ethdev_8023ad_flow_verify(bonded_eth_dev,
-                               slave_eth_dev->data->port_id) != 0) {
+               errval = bond_ethdev_8023ad_flow_verify(bonded_eth_dev,
+                               slave_eth_dev->data->port_id);
+               if (errval != 0) {
                        RTE_BOND_LOG(ERR,
-                               "rte_eth_tx_queue_setup: port=%d queue_id %d, err (%d)",
-                               slave_eth_dev->data->port_id, q_id, errval);
-                       return -1;
+                               "bond_ethdev_8023ad_flow_verify: port=%d, err (%d)",
+                               slave_eth_dev->data->port_id, errval);
+                       return errval;
                }
 
                if (internals->mode4.dedicated_queues.flow[slave_eth_dev->data->port_id] != NULL)
@@ -1818,8 +1812,14 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
                                        internals->mode4.dedicated_queues.flow[slave_eth_dev->data->port_id],
                                        &flow_error);
 
-               bond_ethdev_8023ad_flow_set(bonded_eth_dev,
+               errval = bond_ethdev_8023ad_flow_set(bonded_eth_dev,
                                slave_eth_dev->data->port_id);
+               if (errval != 0) {
+                       RTE_BOND_LOG(ERR,
+                               "bond_ethdev_8023ad_flow_set: port=%d, err (%d)",
+                               slave_eth_dev->data->port_id, errval);
+                       return errval;
+               }
        }
 
        /* Start device */
@@ -2156,6 +2156,9 @@ bond_ethdev_close(struct rte_eth_dev *dev)
         */
        rte_mempool_free(internals->mode6.mempool);
 
+       if (internals->kvlist != NULL)
+               rte_kvargs_free(internals->kvlist);
+
        return 0;
 }
 
@@ -2245,6 +2248,7 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        dev_info->flow_type_rss_offloads = internals->flow_type_rss_offloads;
 
        dev_info->reta_size = internals->reta_size;
+       dev_info->hash_key_size = internals->rss_key_len;
 
        return 0;
 }
@@ -2326,8 +2330,10 @@ bond_ethdev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 }
 
 static void
-bond_ethdev_rx_queue_release(void *queue)
+bond_ethdev_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_id)
 {
+       void *queue = dev->data->rx_queues[queue_id];
+
        if (queue == NULL)
                return;
 
@@ -2335,8 +2341,10 @@ bond_ethdev_rx_queue_release(void *queue)
 }
 
 static void
-bond_ethdev_tx_queue_release(void *queue)
+bond_ethdev_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_id)
 {
+       void *queue = dev->data->rx_queues[queue_id];
+
        if (queue == NULL)
                return;
 
@@ -3034,13 +3042,15 @@ bond_ethdev_rss_hash_update(struct rte_eth_dev *dev,
        if (bond_rss_conf.rss_hf != 0)
                dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf = bond_rss_conf.rss_hf;
 
-       if (bond_rss_conf.rss_key && bond_rss_conf.rss_key_len <
-                       sizeof(internals->rss_key)) {
-               if (bond_rss_conf.rss_key_len == 0)
-                       bond_rss_conf.rss_key_len = 40;
-               internals->rss_key_len = bond_rss_conf.rss_key_len;
+       if (bond_rss_conf.rss_key) {
+               if (bond_rss_conf.rss_key_len < internals->rss_key_len)
+                       return -EINVAL;
+               else if (bond_rss_conf.rss_key_len > internals->rss_key_len)
+                       RTE_BOND_LOG(WARNING, "rss_key will be truncated");
+
                memcpy(internals->rss_key, bond_rss_conf.rss_key,
                                internals->rss_key_len);
+               bond_rss_conf.rss_key_len = internals->rss_key_len;
        }
 
        for (i = 0; i < internals->slave_count; i++) {
@@ -3108,14 +3118,11 @@ bond_ethdev_mac_address_set(struct rte_eth_dev *dev,
 }
 
 static int
-bond_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-                enum rte_filter_type type, enum rte_filter_op op, void *arg)
+bond_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+                 const struct rte_flow_ops **ops)
 {
-       if (type == RTE_ETH_FILTER_GENERIC && op == RTE_ETH_FILTER_GET) {
-               *(const void **)arg = &bond_flow_ops;
-               return 0;
-       }
-       return -ENOTSUP;
+       *ops = &bond_flow_ops;
+       return 0;
 }
 
 static int
@@ -3207,7 +3214,7 @@ const struct eth_dev_ops default_dev_ops = {
        .mac_addr_set         = bond_ethdev_mac_address_set,
        .mac_addr_add         = bond_ethdev_mac_addr_add,
        .mac_addr_remove      = bond_ethdev_mac_addr_remove,
-       .filter_ctrl          = bond_filter_ctrl
+       .flow_ops_get         = bond_flow_ops_get
 };
 
 static int
@@ -3336,8 +3343,9 @@ bond_probe(struct rte_vdev_device *dev)
        const char *name;
        struct bond_dev_private *internals;
        struct rte_kvargs *kvlist;
-       uint8_t bonding_mode, socket_id/*, agg_mode*/;
-       int  arg_count, port_id;
+       uint8_t bonding_mode;
+       int arg_count, port_id;
+       int socket_id;
        uint8_t agg_mode;
        struct rte_eth_dev *eth_dev;
 
@@ -3502,14 +3510,24 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
         * Fall back to default RSS key if the key is not specified
         */
        if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS) {
-               if (dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key != NULL) {
-                       internals->rss_key_len =
-                               dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len;
-                       memcpy(internals->rss_key,
-                              dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key,
+               struct rte_eth_rss_conf *rss_conf =
+                       &dev->data->dev_conf.rx_adv_conf.rss_conf;
+               if (rss_conf->rss_key != NULL) {
+                       if (internals->rss_key_len > rss_conf->rss_key_len) {
+                               RTE_BOND_LOG(ERR, "Invalid rss key length(%u)",
+                                               rss_conf->rss_key_len);
+                               return -EINVAL;
+                       }
+
+                       memcpy(internals->rss_key, rss_conf->rss_key,
                               internals->rss_key_len);
                } else {
-                       internals->rss_key_len = sizeof(default_rss_key);
+                       if (internals->rss_key_len > sizeof(default_rss_key)) {
+                               RTE_BOND_LOG(ERR,
+                                      "There is no suitable default hash key");
+                               return -EINVAL;
+                       }
+
                        memcpy(internals->rss_key, default_rss_key,
                               internals->rss_key_len);
                }
@@ -3778,4 +3796,7 @@ RTE_PMD_REGISTER_PARAM_STRING(net_bonding,
        "up_delay=<int> "
        "down_delay=<int>");
 
-RTE_LOG_REGISTER(bond_logtype, pmd.net.bond, NOTICE);
+/* We can't use RTE_LOG_REGISTER_DEFAULT because of the forced name for
+ * this library, see meson.build.
+ */
+RTE_LOG_REGISTER(bond_logtype, pmd.net.bonding, NOTICE);