When using a shared interface, the Linux interface name (as shown by
ifconfig) may differ from the fmX-macY style name used by DPDK. Add a
"drv_sh_if_name" device argument to let the application provide the
kernel shared interface name to the DPAA PMD.
e.g. -a dpaa_bus:fm1-mac3,drv_sh_if_name=eth1
Signed-off-by: Hemant Agrawal <[email protected]>
---
doc/guides/nics/dpaa.rst | 4 +++
drivers/net/dpaa/dpaa_ethdev.c | 66 ++++++++++++++++++++++++++++++++--
2 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/doc/guides/nics/dpaa.rst b/doc/guides/nics/dpaa.rst
index 5eb235de91..d4b683ba24 100644
--- a/doc/guides/nics/dpaa.rst
+++ b/doc/guides/nics/dpaa.rst
@@ -291,6 +291,10 @@ the ``-a`` EAL option (e.g. ``-a
dpaa_bus:fm1-mac3,drv_rx_taildrop=64``):
* ``drv_fmcless_rxq``
In FMCLESS mode, override the number of Rx frame queues to create.
+* ``drv_sh_if_name``
+
+ Provide the kernel Linux interface name for a shared MAC interface when it
+ differs from the ``fmX-macY`` style name used by DPDK.
FMAN Config
-----------
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 89d3eb7736..c0bf1dc81d 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -58,8 +58,12 @@
#define DRIVER_RX_TAILDROP "drv_rx_taildrop"
#define DRIVER_TX_TAILDROP "drv_tx_taildrop"
#define DRIVER_FMCLESS_RXQ "drv_fmcless_rxq"
+#define DRIVER_SH_IF_NAME "drv_sh_if_name"
#define RTE_PRIORITY_103 103
+static int dpaa_get_devargs_str(struct rte_devargs *devargs, const char *key,
+ char *val, size_t size);
+
/* Supported Rx offloads */
static uint64_t dev_rx_offloads_sup =
RTE_ETH_RX_OFFLOAD_SCATTER;
@@ -237,6 +241,7 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
int speed, duplex;
int ret, rx_status, socket_fd;
struct ifreq ifr;
+ char sh_if_name[IFNAMSIZ];
PMD_INIT_FUNC_TRACE();
@@ -258,7 +263,15 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
DPAA_PMD_ERR("Cannot open IF socket");
return -errno;
}
- strncpy(ifr.ifr_name, dpaa_intf->name, IFNAMSIZ - 1);
+
+ sh_if_name[0] = '\0';
+ ret = dpaa_get_devargs_str(dpaa_dev->device.devargs,
+ DRIVER_SH_IF_NAME, sh_if_name,
+ sizeof(sh_if_name));
+ if (ret <= 0 || sh_if_name[0] == '\0')
+ strlcpy(ifr.ifr_name, dpaa_intf->name, IFNAMSIZ);
+ else
+ strlcpy(ifr.ifr_name, sh_if_name, IFNAMSIZ);
if (ioctl(socket_fd, SIOCGIFMTU, &ifr) < 0) {
DPAA_PMD_ERR("Cannot get interface mtu");
@@ -2261,6 +2274,54 @@ dpaa_get_devargs_int(struct rte_devargs *devargs, const
char *key, long *val)
return 1;
}
+static int
+parse_str_devarg_handler(__rte_unused const char *key, const char *value,
+ void *opaque)
+{
+ *(const char **)opaque = value;
+ return 0;
+}
+
+/*
+ * Fetch a string valued device argument.
+ * Returns 1 and stores a pointer to the value in *val if the key is present,
+ * 0 if the key is absent, and a negative errno on error. The returned pointer
+ * is only valid until the kvargs list is freed, so callers must copy it.
+ */
+static int
+dpaa_get_devargs_str(struct rte_devargs *devargs, const char *key,
+ char *val, size_t size)
+{
+ struct rte_kvargs *kvlist;
+ const char *str = NULL;
+ int ret;
+
+ if (!devargs)
+ return 0;
+
+ kvlist = rte_kvargs_parse(devargs->args, NULL);
+ if (!kvlist)
+ return 0;
+
+ if (!rte_kvargs_count(kvlist, key)) {
+ rte_kvargs_free(kvlist);
+ return 0;
+ }
+
+ ret = rte_kvargs_process(kvlist, key, parse_str_devarg_handler, &str);
+ if (ret < 0 || str == NULL) {
+ rte_kvargs_free(kvlist);
+ return ret < 0 ? ret : 0;
+ }
+
+ ret = rte_strscpy(val, str, size);
+ rte_kvargs_free(kvlist);
+ if (ret < 0)
+ return ret;
+
+ return 1;
+}
+
/* Initialise a network interface */
static int
dpaa_dev_init(struct rte_eth_dev *eth_dev)
@@ -2786,5 +2847,6 @@ RTE_PMD_REGISTER_PARAM_STRING(net_dpaa,
DRIVER_RECV_ERR_PKTS "=<int>"
DRIVER_RX_TAILDROP "=<int>"
DRIVER_TX_TAILDROP "=<int>"
- DRIVER_FMCLESS_RXQ "=<int>");
+ DRIVER_FMCLESS_RXQ "=<int>"
+ DRIVER_SH_IF_NAME "=<string>");
RTE_LOG_REGISTER_DEFAULT(dpaa_logtype_pmd, NOTICE);
--
2.25.1