[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