drivers/net: share vdev data to secondary process
[dpdk.git] / drivers / net / bonding / rte_eth_bond_pmd.c
index 960daac..09696ea 100644 (file)
@@ -1819,8 +1819,13 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
                                bonded_eth_dev->data->dev_conf.rxmode.mq_mode;
        }
 
-       slave_eth_dev->data->dev_conf.rxmode.hw_vlan_filter =
-                       bonded_eth_dev->data->dev_conf.rxmode.hw_vlan_filter;
+       if (bonded_eth_dev->data->dev_conf.rxmode.offloads &
+                       DEV_RX_OFFLOAD_VLAN_FILTER)
+               slave_eth_dev->data->dev_conf.rxmode.offloads |=
+                               DEV_RX_OFFLOAD_VLAN_FILTER;
+       else
+               slave_eth_dev->data->dev_conf.rxmode.offloads &=
+                               ~DEV_RX_OFFLOAD_VLAN_FILTER;
 
        nb_rx_queues = bonded_eth_dev->data->nb_rx_queues;
        nb_tx_queues = bonded_eth_dev->data->nb_tx_queues;
@@ -2258,6 +2263,8 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
        dev_info->rx_offload_capa = internals->rx_offload_capa;
        dev_info->tx_offload_capa = internals->tx_offload_capa;
+       dev_info->rx_queue_offload_capa = internals->rx_queue_offload_capa;
+       dev_info->tx_queue_offload_capa = internals->tx_queue_offload_capa;
        dev_info->flow_type_rss_offloads = internals->flow_type_rss_offloads;
 
        dev_info->reta_size = internals->reta_size;
@@ -2865,11 +2872,15 @@ bond_ethdev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        return 0;
 }
 
-static void
+static int
 bond_ethdev_mac_address_set(struct rte_eth_dev *dev, struct ether_addr *addr)
 {
-       if (mac_address_set(dev, addr))
+       if (mac_address_set(dev, addr)) {
                RTE_BOND_LOG(ERR, "Failed to update MAC address");
+               return -EINVAL;
+       }
+
+       return 0;
 }
 
 const struct eth_dev_ops default_dev_ops = {
@@ -2950,6 +2961,8 @@ bond_alloc(struct rte_vdev_device *dev, uint8_t mode)
        internals->active_slave_count = 0;
        internals->rx_offload_capa = 0;
        internals->tx_offload_capa = 0;
+       internals->rx_queue_offload_capa = 0;
+       internals->tx_queue_offload_capa = 0;
        internals->candidate_max_rx_pktlen = 0;
        internals->max_rx_pktlen = 0;
 
@@ -2962,7 +2975,7 @@ bond_alloc(struct rte_vdev_device *dev, uint8_t mode)
        /* Set mode 4 default configuration */
        bond_mode_8023ad_setup(eth_dev, NULL);
        if (bond_ethdev_mode_set(eth_dev, mode)) {
-               RTE_BOND_LOG(ERR, "Failed to set bonded device %d mode too %d",
+               RTE_BOND_LOG(ERR, "Failed to set bonded device %d mode to %d\n",
                                 eth_dev->data->port_id, mode);
                goto err;
        }
@@ -3008,6 +3021,7 @@ bond_probe(struct rte_vdev_device *dev)
        uint8_t bonding_mode, socket_id/*, agg_mode*/;
        int  arg_count, port_id;
        uint8_t agg_mode;
+       struct rte_eth_dev *eth_dev;
 
        if (!dev)
                return -EINVAL;
@@ -3015,6 +3029,18 @@ bond_probe(struct rte_vdev_device *dev)
        name = rte_vdev_device_name(dev);
        RTE_LOG(INFO, EAL, "Initializing pmd_bond for %s\n", name);
 
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
+           strlen(rte_vdev_device_args(dev)) == 0) {
+               eth_dev = rte_eth_dev_attach_secondary(name);
+               if (!eth_dev) {
+                       RTE_LOG(ERR, PMD, "Failed to probe %s\n", name);
+                       return -1;
+               }
+               /* TODO: request info from primary to set up Rx and Tx */
+               eth_dev->dev_ops = &default_dev_ops;
+               return 0;
+       }
+
        kvlist = rte_kvargs_parse(rte_vdev_device_args(dev),
                pmd_bond_init_valid_arguments);
        if (kvlist == NULL)
@@ -3132,6 +3158,10 @@ bond_remove(struct rte_vdev_device *dev)
        eth_dev->tx_pkt_burst = NULL;
 
        internals = eth_dev->data->dev_private;
+       /* Try to release mempool used in mode6. If the bond
+        * device is not mode6, free the NULL is not problem.
+        */
+       rte_mempool_free(internals->mode6.mempool);
        rte_bitmap_free(internals->vlan_filter_bmp);
        rte_free(internals->vlan_filter_bmpmem);
        rte_free(eth_dev->data->dev_private);