The netmap API requires interface names to be prefixed with "netmap:",
the pktio code will do that automatically, e.g. odp_pktio_open("eth0")
becomes nm_open("netmap:eth0"). But it will append the netmap: even if
the original name already has that prefix, so odp_pktio_open("netmap:eth0")
fails.

It's useful to be able to explicitly use the netmap interface, especially
when testing, if you don't want fallback to other pktio types.

Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com>
Signed-off-by: Matias Elo <matias....@nokia.com>
Suggested-by: Stuart Haslam <stuart.has...@linaro.org>
---
 platform/linux-generic/include/odp_packet_netmap.h |  1 +
 platform/linux-generic/pktio/netmap.c              | 38 ++++++++++++----------
 2 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/platform/linux-generic/include/odp_packet_netmap.h 
b/platform/linux-generic/include/odp_packet_netmap.h
index fbec15c..6338c36 100644
--- a/platform/linux-generic/include/odp_packet_netmap.h
+++ b/platform/linux-generic/include/odp_packet_netmap.h
@@ -44,6 +44,7 @@ typedef struct {
        int sockfd;                     /**< control socket */
        unsigned char if_mac[ETH_ALEN]; /**< eth mac address */
        char nm_name[IF_NAMESIZE + 7];  /**< netmap:<ifname> */
+       char if_name[IF_NAMESIZE];      /**< interface name used in ioctl */
        odp_pktio_capability_t  capa;   /**< interface capabilities */
        unsigned cur_rx_queue;          /**< current pktin queue */
        uint32_t num_rx_rings;          /**< number of nm rx rings */
diff --git a/platform/linux-generic/pktio/netmap.c 
b/platform/linux-generic/pktio/netmap.c
index c84f510..34ca920 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -48,7 +48,7 @@ static int netmap_do_ioctl(pktio_entry_t *pktio_entry, 
unsigned long cmd,
 
        memset(&ifr, 0, sizeof(ifr));
        snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s",
-                pktio_entry->s.name);
+                pktio_entry->s.pkt_nm.if_name);
 
        switch (cmd) {
        case SIOCSIFFLAGS:
@@ -141,7 +141,8 @@ static int netmap_input_queues_config(pktio_entry_t 
*pktio_entry,
 
        if (p->hash_enable && num_queues > 1) {
                if (rss_conf_set_fd(pktio_entry->s.pkt_nm.sockfd,
-                                   pktio_entry->s.name, &p->hash_proto)) {
+                                   pktio_entry->s.pkt_nm.if_name,
+                                   &p->hash_proto)) {
                        ODP_ERR("Failed to configure input hash\n");
                        return -1;
                }
@@ -210,7 +211,7 @@ static int netmap_close(pktio_entry_t *pktio_entry)
 static int netmap_link_status(pktio_entry_t *pktio_entry)
 {
        return link_status_fd(pktio_entry->s.pkt_nm.sockfd,
-                             pktio_entry->s.name);
+                             pktio_entry->s.pkt_nm.if_name);
 }
 
 /**
@@ -241,7 +242,7 @@ static inline int netmap_wait_for_link(pktio_entry_t 
*pktio_entry)
                if (ret == 1)
                        return 1;
        }
-       ODP_DBG("%s link is down\n", pktio_entry->s.name);
+       ODP_DBG("%s link is down\n", pktio_entry->s.pkt_nm.if_name);
        return 0;
 }
 
@@ -252,6 +253,7 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, 
pktio_entry_t *pktio_entry,
        int err;
        int sockfd;
        int mtu;
+       const char *prefix;
        uint32_t buf_size;
        pkt_netmap_t *pkt_nm = &pktio_entry->s.pkt_nm;
        struct nm_desc *desc;
@@ -275,10 +277,14 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, 
pktio_entry_t *pktio_entry,
                odp_buffer_pool_headroom(pool) -
                odp_buffer_pool_tailroom(pool);
 
-       snprintf(pktio_entry->s.name, sizeof(pktio_entry->s.name), "%s",
-                netdev);
-       snprintf(pkt_nm->nm_name, sizeof(pkt_nm->nm_name), "netmap:%s",
+       /* allow interface to be opened with or without the 'netmap:' prefix */
+       if (strncmp(netdev, "netmap:", 7) == 0)
+               netdev += 7;
+       prefix = "netmap:";
+
+       snprintf(pkt_nm->nm_name, sizeof(pkt_nm->nm_name), "%s%s", prefix,
                 netdev);
+       snprintf(pkt_nm->if_name, sizeof(pkt_nm->if_name), "%s", netdev);
 
        /* Dummy open here to check if netmap module is available and to read
         * capability info. */
@@ -320,12 +326,12 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, 
pktio_entry_t *pktio_entry,
 
        /* Use either interface MTU (+ ethernet header length) or netmap buffer
         * size as MTU, whichever is smaller. */
-       mtu = mtu_get_fd(pktio_entry->s.pkt_nm.sockfd, pktio_entry->s.name) +
-                       ODPH_ETHHDR_LEN;
+       mtu = mtu_get_fd(pktio_entry->s.pkt_nm.sockfd, pkt_nm->if_name);
        if (mtu < 0) {
                ODP_ERR("Unable to read interface MTU\n");
                goto error;
        }
+       mtu += ODPH_ETHHDR_LEN;
        pkt_nm->mtu = ((uint32_t)mtu < buf_size) ? (uint32_t)mtu : buf_size;
 
        /* Check if RSS is supported. If not, set 'max_input_queues' to 1. */
@@ -338,7 +344,7 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, 
pktio_entry_t *pktio_entry,
        if (err)
                goto error;
        if ((pkt_nm->if_flags & IFF_UP) == 0)
-               ODP_DBG("%s is down\n", pktio_entry->s.name);
+               ODP_DBG("%s is down\n", pkt_nm->if_name);
 
        err = mac_addr_get_fd(sockfd, netdev, pkt_nm->if_mac);
        if (err)
@@ -351,11 +357,10 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, 
pktio_entry_t *pktio_entry,
 
        /* netmap uses only ethtool to get statistics counters */
        err = ethtool_stats_get_fd(pktio_entry->s.pkt_nm.sockfd,
-                                  pktio_entry->s.name,
-                                  &cur_stats);
+                                  pkt_nm->if_name, &cur_stats);
        if (err) {
                ODP_ERR("netmap pktio %s does not support statistics 
counters\n",
-                       pktio_entry->s.name);
+                       pkt_nm->if_name);
                pktio_entry->s.stats_type = STATS_UNSUPPORTED;
        } else {
                pktio_entry->s.stats_type = STATS_ETHTOOL;
@@ -427,8 +432,7 @@ static int netmap_start(pktio_entry_t *pktio_entry)
 
        base_desc.self = &base_desc;
        base_desc.mem = NULL;
-       memcpy(base_desc.req.nr_name, pktio_entry->s.name,
-              sizeof(pktio_entry->s.name));
+       memcpy(base_desc.req.nr_name, pkt_nm->if_name, sizeof(pkt_nm->if_name));
        base_desc.req.nr_flags &= ~NR_REG_MASK;
 
        if (num_rx_desc == 1)
@@ -771,13 +775,13 @@ static int netmap_promisc_mode_set(pktio_entry_t 
*pktio_entry,
                                   odp_bool_t enable)
 {
        return promisc_mode_set_fd(pktio_entry->s.pkt_nm.sockfd,
-                                  pktio_entry->s.name, enable);
+                                  pktio_entry->s.pkt_nm.if_name, enable);
 }
 
 static int netmap_promisc_mode_get(pktio_entry_t *pktio_entry)
 {
        return promisc_mode_get_fd(pktio_entry->s.pkt_nm.sockfd,
-                                  pktio_entry->s.name);
+                                  pktio_entry->s.pkt_nm.if_name);
 }
 
 static int netmap_capability(pktio_entry_t *pktio_entry,
-- 
1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to