From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2A814A04BC for ; Sat, 10 Oct 2020 04:49:27 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E4EE31D658; Sat, 10 Oct 2020 04:49:25 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 1B53D1D658 for ; Sat, 10 Oct 2020 04:49:22 +0200 (CEST) IronPort-SDR: tDV0uIKhFOnmxxNNukqMbkHpd5TStqjH0mw2C/4nCcjX4zrJthJXDw+NHVeRghhG6sPLHOHw4u QEjz/5xCNiAQ== X-IronPort-AV: E=McAfee;i="6000,8403,9769"; a="183007506" X-IronPort-AV: E=Sophos;i="5.77,357,1596524400"; d="scan'208";a="183007506" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Oct 2020 19:49:20 -0700 IronPort-SDR: RhA154e+U6mmxcRCWmG/DVyx0uj11BwzvGcucr5BJjjs9P10+186jx+iDFx0cXfAMUgeWijymh SA4q1qTxCl4A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,357,1596524400"; d="scan'208";a="462395630" Received: from dpdk51.sh.intel.com ([10.67.111.142]) by orsmga004.jf.intel.com with ESMTP; 09 Oct 2020 19:49:18 -0700 From: Qi Zhang To: bluca@debian.org Cc: stable@dpdk.org, ferruh.yigit@intel.com, Qi Zhang , Wei Zhao Date: Sat, 10 Oct 2020 10:53:15 +0800 Message-Id: <20201010025315.728589-1-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] [PATCH v2] net/iavf: support multicast configuration X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" [ upstream commit 05e4c3aff35f41d527acfab86df55477fd8dcff2 ] This patch enable add multicast address for iavf. Signed-off-by: Wei Zhao Acked-by: Qi Zhang --- To maintainer: I know this is not a fix, but this is requested by an important customer that will use DPDK 19.11 LTS, meanwhile this patch just add a missing eth_dev op in AVF, it has low risk to bring any side effect. doc/guides/nics/features/iavf.ini | 1 + drivers/net/iavf/iavf.h | 7 ++++ drivers/net/iavf/iavf_ethdev.c | 43 ++++++++++++++++++++++++ drivers/net/iavf/iavf_vchnl.c | 56 +++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+) diff --git a/doc/guides/nics/features/iavf.ini b/doc/guides/nics/features/iavf.ini index f08392a9c..80143059e 100644 --- a/doc/guides/nics/features/iavf.ini +++ b/doc/guides/nics/features/iavf.ini @@ -15,6 +15,7 @@ TSO = Y Promiscuous mode = Y Allmulticast mode = Y Unicast MAC filter = Y +Multicast MAC filter = Y RSS hash = Y RSS key update = Y RSS reta update = Y diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index 84f821354..482d4a677 100644 --- a/drivers/net/iavf/iavf.h +++ b/drivers/net/iavf/iavf.h @@ -103,6 +103,10 @@ struct iavf_info { bool link_up; uint32_t link_speed; + /* Multicast addrs */ + struct rte_ether_addr mc_addrs[IAVF_NUM_MACADDR_MAX]; + uint16_t mc_addrs_num; /* Multicast mac addresses number */ + struct iavf_vsi vsi; bool vf_reset; uint64_t flags; @@ -230,4 +234,7 @@ int iavf_config_promisc(struct iavf_adapter *adapter, bool enable_unicast, int iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr, bool add); int iavf_add_del_vlan(struct iavf_adapter *adapter, uint16_t vlanid, bool add); +int iavf_add_del_mc_addr_list(struct iavf_adapter *adapter, + struct rte_ether_addr *mc_addrs, + uint32_t mc_addrs_num, bool add); #endif /* _IAVF_ETHDEV_H_ */ diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 8ddd4aad9..357a4af04 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -72,6 +72,9 @@ static int iavf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id); static int iavf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id); +static int iavf_set_mc_addr_list(struct rte_eth_dev *dev, + struct rte_ether_addr *mc_addr, + uint32_t mc_addrs_num); int iavf_logtype_init; int iavf_logtype_driver; @@ -107,6 +110,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = { .allmulticast_disable = iavf_dev_allmulticast_disable, .mac_addr_add = iavf_dev_add_mac_addr, .mac_addr_remove = iavf_dev_del_mac_addr, + .set_mc_addr_list = iavf_set_mc_addr_list, .vlan_filter_set = iavf_dev_vlan_filter_set, .vlan_offload_set = iavf_dev_vlan_offload_set, .rx_queue_start = iavf_dev_rx_queue_start, @@ -132,6 +136,35 @@ static const struct eth_dev_ops iavf_eth_dev_ops = { .rx_queue_intr_disable = iavf_dev_rx_queue_intr_disable, }; +static int +iavf_set_mc_addr_list(struct rte_eth_dev *dev, + struct rte_ether_addr *mc_addrs, + uint32_t mc_addrs_num) +{ + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); + struct iavf_adapter *adapter = + IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); + int err; + + /* flush previous addresses */ + err = iavf_add_del_mc_addr_list(adapter, vf->mc_addrs, vf->mc_addrs_num, + false); + if (err) + return err; + + vf->mc_addrs_num = 0; + + /* add new ones */ + err = iavf_add_del_mc_addr_list(adapter, mc_addrs, mc_addrs_num, true); + if (err) + return err; + + vf->mc_addrs_num = mc_addrs_num; + memcpy(vf->mc_addrs, mc_addrs, mc_addrs_num * sizeof(*mc_addrs)); + + return 0; +} + static int iavf_init_rss(struct iavf_adapter *adapter) { @@ -461,6 +494,10 @@ iavf_dev_start(struct rte_eth_dev *dev) /* Set all mac addrs */ iavf_add_del_all_mac_addr(adapter, TRUE); + /* Set all multicast addresses */ + iavf_add_del_mc_addr_list(adapter, vf->mc_addrs, vf->mc_addrs_num, + true); + if (iavf_start_queues(dev) != 0) { PMD_DRV_LOG(ERR, "enable queues failed"); goto err_mac; @@ -477,6 +514,7 @@ iavf_dev_start(struct rte_eth_dev *dev) static void iavf_dev_stop(struct rte_eth_dev *dev) { + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); struct iavf_adapter *adapter = IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -499,6 +537,11 @@ iavf_dev_stop(struct rte_eth_dev *dev) /* remove all mac addrs */ iavf_add_del_all_mac_addr(adapter, FALSE); + + /* remove all multicast addresses */ + iavf_add_del_mc_addr_list(adapter, vf->mc_addrs, vf->mc_addrs_num, + false); + hw->adapter_stopped = 1; } diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index 149673b9b..234196aa2 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -844,3 +844,59 @@ iavf_add_del_vlan(struct iavf_adapter *adapter, uint16_t vlanid, bool add) return err; } + +int +iavf_add_del_mc_addr_list(struct iavf_adapter *adapter, + struct rte_ether_addr *mc_addrs, + uint32_t mc_addrs_num, bool add) +{ + struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); + uint8_t cmd_buffer[sizeof(struct virtchnl_ether_addr_list) + + (IAVF_NUM_MACADDR_MAX * sizeof(struct virtchnl_ether_addr))]; + struct virtchnl_ether_addr_list *list; + struct iavf_cmd_info args; + uint32_t i; + int err; + + if (mc_addrs == NULL || mc_addrs_num == 0) + return 0; + + if (mc_addrs_num > IAVF_NUM_MACADDR_MAX) + return -EINVAL; + + list = (struct virtchnl_ether_addr_list *)cmd_buffer; + list->vsi_id = vf->vsi_res->vsi_id; + list->num_elements = mc_addrs_num; + + for (i = 0; i < mc_addrs_num; i++) { + if (!IAVF_IS_MULTICAST(mc_addrs[i].addr_bytes)) { + PMD_DRV_LOG(ERR, "Invalid mac:%x:%x:%x:%x:%x:%x", + mc_addrs[i].addr_bytes[0], + mc_addrs[i].addr_bytes[1], + mc_addrs[i].addr_bytes[2], + mc_addrs[i].addr_bytes[3], + mc_addrs[i].addr_bytes[4], + mc_addrs[i].addr_bytes[5]); + return -EINVAL; + } + + memcpy(list->list[i].addr, mc_addrs[i].addr_bytes, + sizeof(list->list[i].addr)); + } + + args.ops = add ? VIRTCHNL_OP_ADD_ETH_ADDR : VIRTCHNL_OP_DEL_ETH_ADDR; + args.in_args = cmd_buffer; + args.in_args_size = sizeof(struct virtchnl_ether_addr_list) + + i * sizeof(struct virtchnl_ether_addr); + args.out_buffer = vf->aq_resp; + args.out_size = IAVF_AQ_BUF_SZ; + err = iavf_execute_vf_cmd(adapter, &args); + + if (err) { + PMD_DRV_LOG(ERR, "fail to execute command %s", + add ? "OP_ADD_ETH_ADDR" : "OP_DEL_ETH_ADDR"); + return err; + } + + return 0; +} -- 2.25.4