diff mbox

[3/9] linux-generic: pktio: support using netmap: prefix

Message ID 1446060551-21029-4-git-send-email-stuart.haslam@linaro.org
State Superseded
Headers show

Commit Message

Stuart Haslam Oct. 28, 2015, 7:29 p.m. UTC
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.

Signed-off-by: Stuart Haslam <stuart.haslam@linaro.org>
---
 platform/linux-generic/include/odp_packet_netmap.h |  2 ++
 platform/linux-generic/pktio/netmap.c              | 26 +++++++++++++++-------
 2 files changed, 20 insertions(+), 8 deletions(-)

Comments

Maxim Uvarov Oct. 29, 2015, 11:49 a.m. UTC | #1
If you add prefix, then getenv() has to be removed. And previous patch 
looks like obsolete.

Maxim.

On 10/28/2015 22:29, Stuart Haslam wrote:
> 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.
>
> Signed-off-by: Stuart Haslam <stuart.haslam@linaro.org>
> ---
>   platform/linux-generic/include/odp_packet_netmap.h |  2 ++
>   platform/linux-generic/pktio/netmap.c              | 26 +++++++++++++++-------
>   2 files changed, 20 insertions(+), 8 deletions(-)
>
> diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
> index 0577dfe..7caa92f 100644
> --- a/platform/linux-generic/include/odp_packet_netmap.h
> +++ b/platform/linux-generic/include/odp_packet_netmap.h
> @@ -10,6 +10,7 @@
>   #include <odp/pool.h>
>   
>   #include <linux/if_ether.h>
> +#include <net/if.h>
>   
>   /** Packet socket using netmap mmaped rings for both Rx and Tx */
>   typedef struct {
> @@ -20,6 +21,7 @@ typedef struct {
>   	uint32_t if_flags;		/**< interface flags */
>   	int sockfd;			/**< control socket */
>   	unsigned char if_mac[ETH_ALEN]; /**< eth mac address */
> +	char ifname[IF_NAMESIZE];	/**< interface name to be used in ioctl */
>   } pkt_netmap_t;
>   
>   #endif
> diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
> index 67ff95e..5378586 100644
> --- a/platform/linux-generic/pktio/netmap.c
> +++ b/platform/linux-generic/pktio/netmap.c
> @@ -47,8 +47,7 @@ static int netmap_do_ioctl(pktio_entry_t *pktio_entry, unsigned long cmd,
>   	int fd = pkt_nm->sockfd;
>   
>   	memset(&ifr, 0, sizeof(ifr));
> -	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s",
> -		 pktio_entry->s.name);
> +	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", pkt_nm->ifname);
>   
>   	switch (cmd) {
>   	case SIOCSIFFLAGS:
> @@ -107,7 +106,8 @@ static int netmap_close(pktio_entry_t *pktio_entry)
>   static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
>   		       const char *netdev, odp_pool_t pool)
>   {
> -	char ifname[IFNAMSIZ + 7]; /* netmap:<ifname> */
> +	char nmname[IF_NAMESIZE + 7]; /* netmap:<ifname> */
> +	const char *prefix;
>   	int err;
>   	int sockfd;
>   	int i;
> @@ -129,20 +129,30 @@ 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);
>   
> +	/* allow interface to be opened with or without the netmap: prefix */
>   	snprintf(pktio_entry->s.name, sizeof(pktio_entry->s.name), "%s",
>   		 netdev);
> -	snprintf(ifname, sizeof(ifname), "netmap:%s", netdev);
> +
> +	if (strncmp(netdev, "netmap:", 7) == 0) {
> +		netdev += 7;
> +		prefix = "";
> +	} else {
> +		prefix = "netmap:";
> +	}
> +
> +	snprintf(pkt_nm->ifname, sizeof(pkt_nm->ifname), "%s", netdev);
> +	snprintf(nmname, sizeof(nmname), "%s%s", prefix, pktio_entry->s.name);
>   
>   	if (mmap_desc.mem == NULL)
> -		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL,
> +		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL,
>   					  NULL);
>   	else
> -		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL |
> +		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL |
>   					  NM_OPEN_NO_MMAP, &mmap_desc);
> -	pkt_nm->tx_desc = nm_open(ifname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
> +	pkt_nm->tx_desc = nm_open(nmname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
>   
>   	if (pkt_nm->rx_desc == NULL || pkt_nm->tx_desc == NULL) {
> -		ODP_ERR("nm_open(%s) failed\n", ifname);
> +		ODP_ERR("nm_open(%s) failed\n", nmname);
>   		goto error;
>   	}
>
Stuart Haslam Oct. 30, 2015, 10:03 a.m. UTC | #2
On Thu, Oct 29, 2015 at 02:49:31PM +0300, Maxim Uvarov wrote:
> If you add prefix, then getenv() has to be removed. And previous
> patch looks like obsolete.
> 
> Maxim.

The prefix forces use of a particular pktio type whereas the getenv()
stuff disables a single type, they have different purposes (for now).

The netmap: prefix is optional, so you can still open with "eth0" and
let the implementation decide the best type available. I would like to
get rid of all of the getenv() stuff but to do that we first need to add
prefixes for the other pktio types (like "sock:", "sockmmap:").

--
Stuart.

> 
> On 10/28/2015 22:29, Stuart Haslam wrote:
> >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.
> >
> >Signed-off-by: Stuart Haslam <stuart.haslam@linaro.org>
> >---
> >  platform/linux-generic/include/odp_packet_netmap.h |  2 ++
> >  platform/linux-generic/pktio/netmap.c              | 26 +++++++++++++++-------
> >  2 files changed, 20 insertions(+), 8 deletions(-)
> >
> >diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
> >index 0577dfe..7caa92f 100644
> >--- a/platform/linux-generic/include/odp_packet_netmap.h
> >+++ b/platform/linux-generic/include/odp_packet_netmap.h
> >@@ -10,6 +10,7 @@
> >  #include <odp/pool.h>
> >  #include <linux/if_ether.h>
> >+#include <net/if.h>
> >  /** Packet socket using netmap mmaped rings for both Rx and Tx */
> >  typedef struct {
> >@@ -20,6 +21,7 @@ typedef struct {
> >  	uint32_t if_flags;		/**< interface flags */
> >  	int sockfd;			/**< control socket */
> >  	unsigned char if_mac[ETH_ALEN]; /**< eth mac address */
> >+	char ifname[IF_NAMESIZE];	/**< interface name to be used in ioctl */
> >  } pkt_netmap_t;
> >  #endif
> >diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
> >index 67ff95e..5378586 100644
> >--- a/platform/linux-generic/pktio/netmap.c
> >+++ b/platform/linux-generic/pktio/netmap.c
> >@@ -47,8 +47,7 @@ static int netmap_do_ioctl(pktio_entry_t *pktio_entry, unsigned long cmd,
> >  	int fd = pkt_nm->sockfd;
> >  	memset(&ifr, 0, sizeof(ifr));
> >-	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s",
> >-		 pktio_entry->s.name);
> >+	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", pkt_nm->ifname);
> >  	switch (cmd) {
> >  	case SIOCSIFFLAGS:
> >@@ -107,7 +106,8 @@ static int netmap_close(pktio_entry_t *pktio_entry)
> >  static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
> >  		       const char *netdev, odp_pool_t pool)
> >  {
> >-	char ifname[IFNAMSIZ + 7]; /* netmap:<ifname> */
> >+	char nmname[IF_NAMESIZE + 7]; /* netmap:<ifname> */
> >+	const char *prefix;
> >  	int err;
> >  	int sockfd;
> >  	int i;
> >@@ -129,20 +129,30 @@ 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);
> >+	/* allow interface to be opened with or without the netmap: prefix */
> >  	snprintf(pktio_entry->s.name, sizeof(pktio_entry->s.name), "%s",
> >  		 netdev);
> >-	snprintf(ifname, sizeof(ifname), "netmap:%s", netdev);
> >+
> >+	if (strncmp(netdev, "netmap:", 7) == 0) {
> >+		netdev += 7;
> >+		prefix = "";
> >+	} else {
> >+		prefix = "netmap:";
> >+	}
> >+
> >+	snprintf(pkt_nm->ifname, sizeof(pkt_nm->ifname), "%s", netdev);
> >+	snprintf(nmname, sizeof(nmname), "%s%s", prefix, pktio_entry->s.name);
> >  	if (mmap_desc.mem == NULL)
> >-		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL,
> >+		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL,
> >  					  NULL);
> >  	else
> >-		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL |
> >+		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL |
> >  					  NM_OPEN_NO_MMAP, &mmap_desc);
> >-	pkt_nm->tx_desc = nm_open(ifname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
> >+	pkt_nm->tx_desc = nm_open(nmname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
> >  	if (pkt_nm->rx_desc == NULL || pkt_nm->tx_desc == NULL) {
> >-		ODP_ERR("nm_open(%s) failed\n", ifname);
> >+		ODP_ERR("nm_open(%s) failed\n", nmname);
> >  		goto error;
> >  	}
> 
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
Maxim Uvarov Oct. 30, 2015, 11 a.m. UTC | #3
On 10/30/2015 13:03, Stuart Haslam wrote:
> On Thu, Oct 29, 2015 at 02:49:31PM +0300, Maxim Uvarov wrote:
>> If you add prefix, then getenv() has to be removed. And previous
>> patch looks like obsolete.
>>
>> Maxim.
> The prefix forces use of a particular pktio type whereas the getenv()
> stuff disables a single type, they have different purposes (for now).
>
> The netmap: prefix is optional, so you can still open with "eth0" and
> let the implementation decide the best type available. I would like to
> get rid of all of the getenv() stuff but to do that we first need to add
> prefixes for the other pktio types (like "sock:", "sockmmap:").
>
> --
> Stuart.

I also vote to get rid of that and use prefixes.

I previously thought that you don't want app to use netmap until you 
explicitly say about that with prefix.
But if you want to allow it I don't worry.

Maxim.
>
>> On 10/28/2015 22:29, Stuart Haslam wrote:
>>> 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.
>>>
>>> Signed-off-by: Stuart Haslam <stuart.haslam@linaro.org>
>>> ---
>>>   platform/linux-generic/include/odp_packet_netmap.h |  2 ++
>>>   platform/linux-generic/pktio/netmap.c              | 26 +++++++++++++++-------
>>>   2 files changed, 20 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
>>> index 0577dfe..7caa92f 100644
>>> --- a/platform/linux-generic/include/odp_packet_netmap.h
>>> +++ b/platform/linux-generic/include/odp_packet_netmap.h
>>> @@ -10,6 +10,7 @@
>>>   #include <odp/pool.h>
>>>   #include <linux/if_ether.h>
>>> +#include <net/if.h>
>>>   /** Packet socket using netmap mmaped rings for both Rx and Tx */
>>>   typedef struct {
>>> @@ -20,6 +21,7 @@ typedef struct {
>>>   	uint32_t if_flags;		/**< interface flags */
>>>   	int sockfd;			/**< control socket */
>>>   	unsigned char if_mac[ETH_ALEN]; /**< eth mac address */
>>> +	char ifname[IF_NAMESIZE];	/**< interface name to be used in ioctl */
>>>   } pkt_netmap_t;
>>>   #endif
>>> diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
>>> index 67ff95e..5378586 100644
>>> --- a/platform/linux-generic/pktio/netmap.c
>>> +++ b/platform/linux-generic/pktio/netmap.c
>>> @@ -47,8 +47,7 @@ static int netmap_do_ioctl(pktio_entry_t *pktio_entry, unsigned long cmd,
>>>   	int fd = pkt_nm->sockfd;
>>>   	memset(&ifr, 0, sizeof(ifr));
>>> -	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s",
>>> -		 pktio_entry->s.name);
>>> +	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", pkt_nm->ifname);
>>>   	switch (cmd) {
>>>   	case SIOCSIFFLAGS:
>>> @@ -107,7 +106,8 @@ static int netmap_close(pktio_entry_t *pktio_entry)
>>>   static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
>>>   		       const char *netdev, odp_pool_t pool)
>>>   {
>>> -	char ifname[IFNAMSIZ + 7]; /* netmap:<ifname> */
>>> +	char nmname[IF_NAMESIZE + 7]; /* netmap:<ifname> */
>>> +	const char *prefix;
>>>   	int err;
>>>   	int sockfd;
>>>   	int i;
>>> @@ -129,20 +129,30 @@ 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);
>>> +	/* allow interface to be opened with or without the netmap: prefix */
>>>   	snprintf(pktio_entry->s.name, sizeof(pktio_entry->s.name), "%s",
>>>   		 netdev);
>>> -	snprintf(ifname, sizeof(ifname), "netmap:%s", netdev);
>>> +
>>> +	if (strncmp(netdev, "netmap:", 7) == 0) {
>>> +		netdev += 7;
>>> +		prefix = "";
>>> +	} else {
>>> +		prefix = "netmap:";
>>> +	}
>>> +
>>> +	snprintf(pkt_nm->ifname, sizeof(pkt_nm->ifname), "%s", netdev);
>>> +	snprintf(nmname, sizeof(nmname), "%s%s", prefix, pktio_entry->s.name);
>>>   	if (mmap_desc.mem == NULL)
>>> -		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL,
>>> +		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL,
>>>   					  NULL);
>>>   	else
>>> -		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL |
>>> +		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL |
>>>   					  NM_OPEN_NO_MMAP, &mmap_desc);
>>> -	pkt_nm->tx_desc = nm_open(ifname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
>>> +	pkt_nm->tx_desc = nm_open(nmname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
>>>   	if (pkt_nm->rx_desc == NULL || pkt_nm->tx_desc == NULL) {
>>> -		ODP_ERR("nm_open(%s) failed\n", ifname);
>>> +		ODP_ERR("nm_open(%s) failed\n", nmname);
>>>   		goto error;
>>>   	}
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> https://lists.linaro.org/mailman/listinfo/lng-odp
diff mbox

Patch

diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
index 0577dfe..7caa92f 100644
--- a/platform/linux-generic/include/odp_packet_netmap.h
+++ b/platform/linux-generic/include/odp_packet_netmap.h
@@ -10,6 +10,7 @@ 
 #include <odp/pool.h>
 
 #include <linux/if_ether.h>
+#include <net/if.h>
 
 /** Packet socket using netmap mmaped rings for both Rx and Tx */
 typedef struct {
@@ -20,6 +21,7 @@  typedef struct {
 	uint32_t if_flags;		/**< interface flags */
 	int sockfd;			/**< control socket */
 	unsigned char if_mac[ETH_ALEN]; /**< eth mac address */
+	char ifname[IF_NAMESIZE];	/**< interface name to be used in ioctl */
 } pkt_netmap_t;
 
 #endif
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 67ff95e..5378586 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -47,8 +47,7 @@  static int netmap_do_ioctl(pktio_entry_t *pktio_entry, unsigned long cmd,
 	int fd = pkt_nm->sockfd;
 
 	memset(&ifr, 0, sizeof(ifr));
-	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s",
-		 pktio_entry->s.name);
+	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", pkt_nm->ifname);
 
 	switch (cmd) {
 	case SIOCSIFFLAGS:
@@ -107,7 +106,8 @@  static int netmap_close(pktio_entry_t *pktio_entry)
 static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
 		       const char *netdev, odp_pool_t pool)
 {
-	char ifname[IFNAMSIZ + 7]; /* netmap:<ifname> */
+	char nmname[IF_NAMESIZE + 7]; /* netmap:<ifname> */
+	const char *prefix;
 	int err;
 	int sockfd;
 	int i;
@@ -129,20 +129,30 @@  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);
 
+	/* allow interface to be opened with or without the netmap: prefix */
 	snprintf(pktio_entry->s.name, sizeof(pktio_entry->s.name), "%s",
 		 netdev);
-	snprintf(ifname, sizeof(ifname), "netmap:%s", netdev);
+
+	if (strncmp(netdev, "netmap:", 7) == 0) {
+		netdev += 7;
+		prefix = "";
+	} else {
+		prefix = "netmap:";
+	}
+
+	snprintf(pkt_nm->ifname, sizeof(pkt_nm->ifname), "%s", netdev);
+	snprintf(nmname, sizeof(nmname), "%s%s", prefix, pktio_entry->s.name);
 
 	if (mmap_desc.mem == NULL)
-		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL,
+		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL,
 					  NULL);
 	else
-		pkt_nm->rx_desc = nm_open(ifname, NULL, NETMAP_NO_TX_POLL |
+		pkt_nm->rx_desc = nm_open(nmname, NULL, NETMAP_NO_TX_POLL |
 					  NM_OPEN_NO_MMAP, &mmap_desc);
-	pkt_nm->tx_desc = nm_open(ifname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
+	pkt_nm->tx_desc = nm_open(nmname, NULL, NM_OPEN_NO_MMAP, &mmap_desc);
 
 	if (pkt_nm->rx_desc == NULL || pkt_nm->tx_desc == NULL) {
-		ODP_ERR("nm_open(%s) failed\n", ifname);
+		ODP_ERR("nm_open(%s) failed\n", nmname);
 		goto error;
 	}