From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pd0-f181.google.com (mail-pd0-f181.google.com [209.85.192.181]) by dpdk.org (Postfix) with ESMTP id 82A1E3975 for ; Tue, 26 Aug 2014 02:09:13 +0200 (CEST) Received: by mail-pd0-f181.google.com with SMTP id g10so20968271pdj.40 for ; Mon, 25 Aug 2014 17:13:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=zMj6pPecMbyTBKR78RagbDA52zkQm8QAlz/CO9WQiKs=; b=BwmWVDV1kb5GXWaBYYnH+xhM8FfW3jyaJRiJfI7x/Nreths+lb+lM5mqh0rdpdHsYN CAa/XYqX0Br3JpXFQqF6MGuL72tSFtIaG9N5zyp9nypCgXS4n2JuvP/muEaGR+AkQ0tc lmVyL/FQR+WXwQjpsuFjeRYtG0SA+Z39ECLA/aEE82Kp1f835pg/1pkld2barI+x03XL zJNEzybG7wDQmzrsAULA8uZdpDSUAvzhPViXXl4/YwqhgXLgjNioFa2DTkbm4oM+CGOe ARSxRv5ErOxGp1xC3H+spEuEqmje3Tn2drmoII2OAYNw4ZQaY/V+It/zDGE8jaJiJ65y c9zg== X-Gm-Message-State: ALoCoQlIgA0SrQXp6zILJrgmCOnSs9Rm72qcF6z4yz4QOu3i094IUy6tGSs6IOZPC0FBbNMJ309d X-Received: by 10.70.102.200 with SMTP id fq8mr8692131pdb.152.1409011989764; Mon, 25 Aug 2014 17:13:09 -0700 (PDT) Received: from uryu.home.lan (static-50-53-65-80.bvtn.or.frontiernet.net. [50.53.65.80]) by mx.google.com with ESMTPSA id nn5sm1021024pbc.26.2014.08.25.17.13.09 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 25 Aug 2014 17:13:09 -0700 (PDT) Date: Mon, 25 Aug 2014 17:13:03 -0700 From: Stephen Hemminger To: Ouyang Changchun Message-ID: <20140825171303.21e20d8b@uryu.home.lan> In-Reply-To: <1408932572-10343-5-git-send-email-changchun.ouyang@intel.com> References: <1408932572-10343-1-git-send-email-changchun.ouyang@intel.com> <1408932572-10343-5-git-send-email-changchun.ouyang@intel.com> X-Mailer: Claws Mail 3.8.1 (GTK+ 2.24.10; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH 4/5] virtio: New API to enable/disable multicast and promisc mode X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Aug 2014 00:09:14 -0000 On Mon, 25 Aug 2014 10:09:31 +0800 Ouyang Changchun wrote: > This patch adds new API in virtio for supporting promiscuous and allmulticast enabling and disabling. > > Signed-off-by: Changchun Ouyang > Acked-by: Huawei Xie > Acked-by: Cunming Liang > > --- > lib/librte_pmd_virtio/virtio_ethdev.c | 98 ++++++++++++++++++++++++++++++++++- > 1 file changed, 97 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_pmd_virtio/virtio_ethdev.c b/lib/librte_pmd_virtio/virtio_ethdev.c > index 6293ac6..c7f874a 100644 > --- a/lib/librte_pmd_virtio/virtio_ethdev.c > +++ b/lib/librte_pmd_virtio/virtio_ethdev.c > @@ -66,6 +66,10 @@ static int eth_virtio_dev_init(struct eth_driver *eth_drv, > static int virtio_dev_configure(struct rte_eth_dev *dev); > static int virtio_dev_start(struct rte_eth_dev *dev); > static void virtio_dev_stop(struct rte_eth_dev *dev); > +static void virtio_dev_promiscuous_enable(struct rte_eth_dev *dev); > +static void virtio_dev_promiscuous_disable(struct rte_eth_dev *dev); > +static void virtio_dev_allmulticast_enable(struct rte_eth_dev *dev); > +static void virtio_dev_allmulticast_disable(struct rte_eth_dev *dev); > static void virtio_dev_info_get(struct rte_eth_dev *dev, > struct rte_eth_dev_info *dev_info); > static int virtio_dev_link_update(struct rte_eth_dev *dev, > @@ -403,6 +407,94 @@ virtio_dev_close(struct rte_eth_dev *dev) > virtio_dev_stop(dev); > } > > +static void > +virtio_dev_promiscuous_enable(struct rte_eth_dev *dev) > +{ > + struct virtio_hw *hw > + = VIRTIO_DEV_PRIVATE_TO_HW(dev->data->dev_private); > + struct virtio_pmd_ctrl ctrl; > + int dlen[1]; > + int ret; > + > + ctrl.hdr.class = VIRTIO_NET_CTRL_RX; > + ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_PROMISC; > + ctrl.data[0] = 1; > + dlen[0] = 1; > + > + ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1); > + > + if (ret) { > + PMD_INIT_LOG(ERR, "Promisc enabling but send command " > + "failed, this is too late now...\n"); > + } > +} > + > +static void > +virtio_dev_promiscuous_disable(struct rte_eth_dev *dev) > +{ > + struct virtio_hw *hw > + = VIRTIO_DEV_PRIVATE_TO_HW(dev->data->dev_private); > + struct virtio_pmd_ctrl ctrl; > + int dlen[1]; > + int ret; > + > + ctrl.hdr.class = VIRTIO_NET_CTRL_RX; > + ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_PROMISC; > + ctrl.data[0] = 0; > + dlen[0] = 1; > + > + ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1); > + > + if (ret) { > + PMD_INIT_LOG(ERR, "Promisc disabling but send command " > + "failed, this is too late now...\n"); > + } > +} > + > +static void > +virtio_dev_allmulticast_enable(struct rte_eth_dev *dev) > +{ > + struct virtio_hw *hw > + = VIRTIO_DEV_PRIVATE_TO_HW(dev->data->dev_private); > + struct virtio_pmd_ctrl ctrl; > + int dlen[1]; > + int ret; > + > + ctrl.hdr.class = VIRTIO_NET_CTRL_RX; > + ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_ALLMULTI; > + ctrl.data[0] = 1; > + dlen[0] = 1; > + > + ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1); > + > + if (ret) { > + PMD_INIT_LOG(ERR, "Promisc enabling but send command " > + "failed, this is too late now...\n"); > + } > +} > + > +static void > +virtio_dev_allmulticast_disable(struct rte_eth_dev *dev) > +{ > + struct virtio_hw *hw > + = VIRTIO_DEV_PRIVATE_TO_HW(dev->data->dev_private); > + struct virtio_pmd_ctrl ctrl; > + int dlen[1]; > + int ret; > + > + ctrl.hdr.class = VIRTIO_NET_CTRL_RX; > + ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_ALLMULTI; > + ctrl.data[0] = 0; > + dlen[0] = 1; > + > + ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1); > + > + if (ret) { > + PMD_INIT_LOG(ERR, "Promisc disabling but send command " > + "failed, this is too late now...\n"); > + } > +} > + > /* > * dev_ops for virtio, bare necessities for basic operation > */ > @@ -411,6 +503,10 @@ static struct eth_dev_ops virtio_eth_dev_ops = { > .dev_start = virtio_dev_start, > .dev_stop = virtio_dev_stop, > .dev_close = virtio_dev_close, > + .promiscuous_enable = virtio_dev_promiscuous_enable, > + .promiscuous_disable = virtio_dev_promiscuous_disable, > + .allmulticast_enable = virtio_dev_allmulticast_enable, > + .allmulticast_disable = virtio_dev_allmulticast_disable, > > .dev_infos_get = virtio_dev_info_get, > .stats_get = virtio_dev_stats_get, > @@ -561,7 +657,7 @@ virtio_negotiate_features(struct virtio_hw *hw) > { > uint32_t host_features, mask; > > - mask = VIRTIO_NET_F_CTRL_RX | VIRTIO_NET_F_CTRL_VLAN; > + mask = VIRTIO_NET_F_CTRL_VLAN; > mask |= VIRTIO_NET_F_CSUM | VIRTIO_NET_F_GUEST_CSUM; > > /* TSO and LRO are only available when their corresponding I have similar patches, but you really need to fix the driver so that control queue is brought up on dev_init, not start. It makes sense to allow code to change modes independent of whether driver has been started or not. Also, the virtio driver is doing reset on stop. This may not be best solution because it conflicts with what Linux driver is doing. Another current bug is that virtio DPDK driver is broken on latest KVM. It works with Debian stable, but not with Debian testing. Too busy to investigate further.