> -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Ouyang Changchun > Sent: Sunday, October 26, 2014 8:46 PM > To: dev at dpdk.org > Subject: [dpdk-dev] [PATCH v2 3/5] vhost: enable promisc mode and config > VMDQ offload register for multicast feature > > 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 at intel.com> > --- > examples/vhost/main.c | 25 ++++++++++++++++++++++--- > lib/librte_vhost/virtio-net.c | 4 +++- > 2 files changed, 25 insertions(+), 4 deletions(-) > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > index 291128e..c4947f7 100644 > --- a/examples/vhost/main.c > +++ b/examples/vhost/main.c > @@ -161,6 +161,9 @@ > /* mask of enabled ports */ > static uint32_t enabled_port_mask = 0; > > +/* Ports set in promiscuous mode off by default. */ comment is confusing > +static uint32_t promiscuous_on; > + > /*Number of switching cores enabled*/ > static uint32_t num_switching_cores = 0; Don't initialize static variables to zero/NULL > > @@ -274,6 +277,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},}, > }, > }, Same as above, do we need to initialize static var?
> @@ -364,13 +368,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 ]; > @@ -468,6 +474,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 > @@ -598,7 +607,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': > @@ -610,6 +620,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; > + rte_vhost_feature_enable(1ULL << > VIRTIO_NET_F_CTRL_RX); Alignment? > + > + break; > + > case 0: > /* Enable/disable vm2vm comms. */ > if (!strncmp(long_option[option_index].name, "vm2vm", > diff --git a/lib/librte_vhost/virtio-net.c b/lib/librte_vhost/virtio-net.c > index 27ba175..744156c 100644 > --- a/lib/librte_vhost/virtio-net.c > +++ b/lib/librte_vhost/virtio-net.c > @@ -68,7 +68,9 @@ static struct virtio_net_device_ops const *notify_ops; > static struct virtio_net_config_ll *ll_root; > > /* Features supported by this application. RX merge buffers are enabled by > default. */ > -#define VHOST_SUPPORTED_FEATURES (1ULL << VIRTIO_NET_F_MRG_RXBUF) > +#define VHOST_SUPPORTED_FEATURES ((1ULL << VIRTIO_NET_F_MRG_RXBUF) > | \ > + (1ULL << VIRTIO_NET_F_CTRL_RX)) > + > static uint64_t VHOST_FEATURES = VHOST_SUPPORTED_FEATURES; > > /* Line size for reading maps file. */ > -- > 1.8.4.2