[PATCH v7 3/4] net/iavf: add a helper for sending MAC addresses to PF

David Marchand david.marchand at redhat.com
Mon Sep 14 10:17:24 CEST 2026


Rather than have multiple implementations of the same code,
define a single helper.

This is also a good place where to check if the driver is requesting too
many addresses in a single message to the PF.

Signed-off-by: David Marchand <david.marchand at redhat.com>
---
 drivers/net/intel/iavf/iavf_vchnl.c | 124 +++++++++++++---------------
 1 file changed, 56 insertions(+), 68 deletions(-)

diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index a918db5443..decfae3182 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -1671,50 +1671,69 @@ iavf_config_irq_map_lv(struct iavf_adapter *adapter, uint16_t num)
 	return 0;
 }
 
+#define IAVF_ETH_ADDR_PER_REQ \
+	((IAVF_AQ_BUF_SZ - sizeof(struct virtchnl_ether_addr_list)) / \
+	 sizeof(struct virtchnl_ether_addr))
+#define IAVF_ETH_ADDR_CMD_SIZE(nb_addrs) \
+	(sizeof(struct virtchnl_ether_addr_list) + sizeof(struct virtchnl_ether_addr) * (nb_addrs))
+
+static int
+iavf_send_eth_addr_list(struct iavf_adapter *adapter, const char *caller,
+		struct virtchnl_ether_addr_list *list, bool add)
+{
+	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
+	struct iavf_cmd_info args;
+	int err;
+
+	if (list->num_elements > IAVF_ETH_ADDR_PER_REQ) {
+		PMD_DRV_LOG(ERR, "cannot fit this ethernet address list in a message to the PF");
+		return -EINVAL;
+	}
+
+	memset(&args, 0, sizeof(args));
+	args.ops = add ? VIRTCHNL_OP_ADD_ETH_ADDR : VIRTCHNL_OP_DEL_ETH_ADDR;
+	args.in_args = (uint8_t *)list;
+	args.in_args_size = IAVF_ETH_ADDR_CMD_SIZE(list->num_elements);
+	args.out_buffer = msg_buf;
+	args.out_size = IAVF_AQ_BUF_SZ;
+	err = iavf_execute_vf_cmd_safe(adapter, &args);
+	if (err != 0) {
+		PMD_DRV_LOG(ERR, "fail to execute command %s for %s",
+			add ? "VIRTCHNL_OP_ADD_ETH_ADDR" : "VIRTCHNL_OP_DEL_ETH_ADDR", caller);
+		return err;
+	}
+
+	PMD_DRV_LOG(DEBUG, "executed command %s for %s",
+		add ? "VIRTCHNL_OP_ADD_ETH_ADDR" : "VIRTCHNL_OP_DEL_ETH_ADDR", caller);
+
+	return 0;
+}
+
 void
 iavf_add_del_secondary_mac_addr(struct iavf_adapter *adapter, bool add)
 {
 	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
-	struct {
-		struct virtchnl_ether_addr_list list;
-		struct virtchnl_ether_addr addr[RTE_DIM(vf->mac_addrs)];
-	} list_req = {0};
-	struct virtchnl_ether_addr_list *list = &list_req.list;
-	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
-	struct iavf_cmd_info args = {0};
-	int err;
-	size_t buf_len;
+	uint8_t cmd_buffer[IAVF_ETH_ADDR_CMD_SIZE(RTE_DIM(vf->mac_addrs))] = {0};
+	struct virtchnl_ether_addr_list *list;
+
+	list = (struct virtchnl_ether_addr_list *)cmd_buffer;
+	list->vsi_id = vf->vsi_res->vsi_id;
+	list->num_elements = 0;
 
 	for (unsigned int i = 1; i < RTE_DIM(vf->mac_addrs); i++) {
 		struct rte_ether_addr *addr = &vf->mac_addrs[i];
 		struct virtchnl_ether_addr *vc_addr = &list->list[list->num_elements];
 
-		/* ignore empty addresses */
-		if (rte_is_zero_ether_addr(addr))
-			continue;
-		list->num_elements++;
+		if (!rte_is_zero_ether_addr(addr)) {
+			list->num_elements++;
 
-		memcpy(vc_addr->addr, addr->addr_bytes, sizeof(addr->addr_bytes));
-		vc_addr->type = VIRTCHNL_ETHER_ADDR_EXTRA;
+			memcpy(vc_addr->addr, addr->addr_bytes, sizeof(addr->addr_bytes));
+			vc_addr->type = VIRTCHNL_ETHER_ADDR_EXTRA;
+		}
 	}
 
-	if (list->num_elements == 0)
-		return;
-
-	/* for some reason PF side checks for buffer being too big, so adjust it down */
-	buf_len = sizeof(struct virtchnl_ether_addr_list) +
-		  sizeof(struct virtchnl_ether_addr) * list->num_elements;
-
-	list->vsi_id = vf->vsi_res->vsi_id;
-	args.ops = add ? VIRTCHNL_OP_ADD_ETH_ADDR : VIRTCHNL_OP_DEL_ETH_ADDR;
-	args.in_args = (uint8_t *)list;
-	args.in_args_size = buf_len;
-	args.out_buffer = msg_buf;
-	args.out_size = IAVF_AQ_BUF_SZ;
-	err = iavf_execute_vf_cmd_safe(adapter, &args);
-	if (err)
-		PMD_DRV_LOG(ERR, "fail to execute command %s",
-				add ? "OP_ADD_ETHER_ADDRESS" : "OP_DEL_ETHER_ADDRESS");
+	if (list->num_elements != 0)
+		(void)iavf_send_eth_addr_list(adapter, __func__, list, add);
 }
 
 int
@@ -1797,13 +1816,9 @@ int
 iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr,
 		     bool add, uint8_t type)
 {
-	struct virtchnl_ether_addr_list *list;
 	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
-	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
-	uint8_t cmd_buffer[sizeof(struct virtchnl_ether_addr_list) +
-			   sizeof(struct virtchnl_ether_addr)];
-	struct iavf_cmd_info args;
-	int err;
+	uint8_t cmd_buffer[IAVF_ETH_ADDR_CMD_SIZE(1)] = {0};
+	struct virtchnl_ether_addr_list *list;
 
 	if (adapter->closed)
 		return -EIO;
@@ -1815,16 +1830,7 @@ iavf_add_del_eth_addr(struct iavf_adapter *adapter, struct rte_ether_addr *addr,
 	memcpy(list->list[0].addr, addr->addr_bytes,
 		   sizeof(addr->addr_bytes));
 
-	args.ops = add ? VIRTCHNL_OP_ADD_ETH_ADDR : VIRTCHNL_OP_DEL_ETH_ADDR;
-	args.in_args = cmd_buffer;
-	args.in_args_size = sizeof(cmd_buffer);
-	args.out_buffer = msg_buf;
-	args.out_size = IAVF_AQ_BUF_SZ;
-	err = iavf_execute_vf_cmd_safe(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 iavf_send_eth_addr_list(adapter, __func__, list, add);
 }
 
 int
@@ -2302,14 +2308,10 @@ iavf_add_del_mc_addr_list(struct iavf_adapter *adapter,
 			struct rte_ether_addr *mc_addrs,
 			uint32_t mc_addrs_num, bool add)
 {
+	uint8_t cmd_buffer[IAVF_ETH_ADDR_CMD_SIZE(IAVF_NUM_MACADDR_MAX)] = {0};
 	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
-	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
-	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;
@@ -2330,21 +2332,7 @@ iavf_add_del_mc_addr_list(struct iavf_adapter *adapter,
 		list->list[i].type = VIRTCHNL_ETHER_ADDR_EXTRA;
 	}
 
-	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 = msg_buf;
-	args.out_size = IAVF_AQ_BUF_SZ;
-	err = iavf_execute_vf_cmd_safe(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;
+	return iavf_send_eth_addr_list(adapter, __func__, list, add);
 }
 
 int
-- 
2.54.0



More information about the dev mailing list