open-nic icon indicating copy to clipboard operation
open-nic copied to clipboard

Assistance with MAC Address Setting for QDMA-DPDK VF

Open vijayaKesavan19 opened this issue 1 year ago • 0 comments

Hi @cneely-amd and team,

I am currently working on port representor testing using the QDMA-DPDK framework, based on the OpenNIC design project (GitHub link for the project). I need to test the process of changing the MAC addresses for both the Physical Function (PF) and Virtual Function (VF) from the PF.

For the PF, I successfully use the following command to set the MAC address:

testpmd> mac_addr set <port id> <XX:XX:XX:XX:XX:XX>

I have implemented a function to achieve this, which is shown below:

int qdma_set_mac_address(struct rte_eth_dev *dev, struct rte_ether_addr *addr)
 
{
 
        int i ;
 
        uint64_t mac_addr = (uint64_t)(uintptr_t)&addr;
 
        if (!rte_is_valid_assigned_ether_addr(addr))
 
               return -EADDRNOTAVAIL;
 
        for (i = 0; i < RTE_ETHER_ADDR_LEN; i++)
 
                dev->data->mac_addrs[0].addr_bytes[RTE_ETHER_ADDR_LEN -1 -i] =
 
                                                (uint8_t)((mac_addr >> (BITS_IN_BYTE * i)) & 0xFF);
 
        return 0;
 
}

File : drivers/net/qdma/qdma_devops.c

In the case of the VF, I use the command:

testpmd> set vf mac addr <port id> <vf id> <XX:XX:XX:XX:XX:XX>

I believe this invokes the following function:

static void cmd_set_vf_mac_addr_parsed (
 
        void *parsed_result,
 
        __rte_unused struct cmdline *cl,
 
        __rte_unused void *data)
 
{
 
        struct cmd_set_vf_mac_addr_result *res = parsed_result;
 
        int ret = -ENOTSUP;
 
 
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN))
 
                return;
 
 
 
#ifdef RTE_NET_IXGBE
 
        if (ret == -ENOTSUP)
 
                ret = rte_pmd_ixgbe_set_vf_mac_addr(res->port_id, res->vf_id,
 
                                &res->mac_addr);
 
#endif
 
#ifdef RTE_NET_I40E
 
        if (ret == -ENOTSUP)
 
                ret = rte_pmd_i40e_set_vf_mac_addr(res->port_id, res->vf_id,
 
                                &res->mac_addr);
 
#endif
 
#ifdef RTE_NET_BNXT
 
        if (ret == -ENOTSUP)
 
                ret = rte_pmd_bnxt_set_vf_mac_addr(res->port_id, res->vf_id,
 
                                &res->mac_addr);
 
#endif
 
     
 
        switch (ret) {
 
        case 0:
 
                break;
 
        case -EINVAL:
 
                printf("invalid vf_id %d or mac_addr\n", res->vf_id);
 
                break;
 
        case -ENODEV:
 
                printf("invalid port_id %d\n", res->port_id);
 
                break;
 
        case -ENOTSUP:
 
                printf("function not implemented\n");
 
                break;
 
        default:
 
                printf("programming error: (%s)\n", strerror(-ret));
 
        }
 
}
 

As you can notice that this functionality is only supported for ixgbe, i40e, or bnxt devices, while I am working with a QDMA device (with the VF device name being "qdma_vf").

For other drivers, the MAC address is accessed through a structure that allows fetching the VF's information. Unfortunately, in the QDMA driver, I can only retrieve the function ID for the VF, as shown below:

struct qdma_vf_info {
    uint16_t func_id;
};

Could you please guide me on how to access the MAC address and received packets of the QDMA_VF device through the PF in the QDMA-DPDK testpmd application? Alternatively, if you could point me toward any reference documentation that could assist with this issue, I would greatly appreciate it.

Thank you in advance for your help!

vijayaKesavan19 avatar Oct 07 '24 13:10 vijayaKesavan19