[dpdk-dev,3/5] examples/vhost: enable promisc mode and config VMDQ offload register for multicast feature
Commit Message
This patch is to let vhost receive and forward multicast and broadcast packets,
add promiscuous option into command line; and set VMDQ RX mode as:
ETH_VMDQ_ACCEPT_BROADCAST|ETH_VMDQ_ACCEPT_MULTICAST if promisc mode is on.
Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com>
Acked-by: Huawei Xie <huawei.xie@intel.com>
Acked-by: Cunming Liang <cunming.liang@intel.com>
---
examples/vhost/main.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
@@ -161,6 +161,9 @@
/* mask of enabled ports */
static uint32_t enabled_port_mask = 0;
+/* Ports set in promiscuous mode off by default. */
+static uint32_t promiscuous_on;
+
/*Number of switching cores enabled*/
static uint32_t num_switching_cores = 0;
@@ -278,6 +281,7 @@ static struct rte_eth_conf vmdq_conf_default = {
.enable_default_pool = 0,
.default_pool = 0,
.nb_pool_maps = 0,
+ .rx_mode = 0,
.pool_map = {{0, 0},},
},
},
@@ -368,13 +372,15 @@ static inline int
get_eth_conf(struct rte_eth_conf *eth_conf, uint32_t num_devices)
{
struct rte_eth_vmdq_rx_conf conf;
+ struct rte_eth_vmdq_rx_conf *def_conf =
+ &vmdq_conf_default.rx_adv_conf.vmdq_rx_conf;
unsigned i;
memset(&conf, 0, sizeof(conf));
conf.nb_queue_pools = (enum rte_eth_nb_pools)num_devices;
conf.nb_pool_maps = num_devices;
- conf.enable_loop_back =
- vmdq_conf_default.rx_adv_conf.vmdq_rx_conf.enable_loop_back;
+ conf.enable_loop_back = def_conf->enable_loop_back;
+ conf.rx_mode = def_conf->rx_mode;
for (i = 0; i < conf.nb_pool_maps; i++) {
conf.pool_map[i].vlan_id = vlan_tags[ i ];
@@ -472,6 +478,9 @@ port_init(uint8_t port)
return retval;
}
+ if (promiscuous_on)
+ rte_eth_promiscuous_enable(port);
+
rte_eth_macaddr_get(port, &vmdq_ports_eth_addr[port]);
RTE_LOG(INFO, VHOST_PORT, "Max virtio devices supported: %u\n", num_devices);
RTE_LOG(INFO, VHOST_PORT, "Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8
@@ -604,7 +613,8 @@ us_vhost_parse_args(int argc, char **argv)
};
/* Parse command line */
- while ((opt = getopt_long(argc, argv, "p:",long_option, &option_index)) != EOF) {
+ while ((opt = getopt_long(argc, argv, "p:P",
+ long_option, &option_index)) != EOF) {
switch (opt) {
/* Portmask */
case 'p':
@@ -616,6 +626,15 @@ us_vhost_parse_args(int argc, char **argv)
}
break;
+ case 'P':
+ promiscuous_on = 1;
+ vmdq_conf_default.rx_adv_conf.vmdq_rx_conf.rx_mode =
+ ETH_VMDQ_ACCEPT_BROADCAST |
+ ETH_VMDQ_ACCEPT_MULTICAST;
+ VHOST_FEATURES |= (1ULL << VIRTIO_NET_F_CTRL_RX);
+
+ break;
+
case 0:
/* Enable/disable vm2vm comms. */
if (!strncmp(long_option[option_index].name, "vm2vm",
@@ -677,7 +696,7 @@ us_vhost_parse_args(int argc, char **argv)
return -1;
} else {
if (ret)
- VHOST_FEATURES = (1ULL << VIRTIO_NET_F_MRG_RXBUF);
+ VHOST_FEATURES |= (1ULL << VIRTIO_NET_F_MRG_RXBUF);
}
}