diff mbox

[v4,1/1] API support for querying mac address

Message ID 1408543705-1982-1-git-send-email-bala.manoharan@linaro.org
State New
Headers show

Commit Message

Balasubramanian Manoharan Aug. 20, 2014, 2:08 p.m. UTC
This patch provides API support for querying mac address of an interface using odp_pktio_t handle.
This current patch incorporates the review comments from the previous patch.

The discussions are ongoing regarding adding additional API for querying mac address using device name, once it gets finalized the same will be provided as a different patch.

Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>
---
 include/odp_packet_io.h                            |  8 +++++++
 platform/linux-generic/include/odp_packet_netmap.h |  1 +
 platform/linux-generic/odp_packet_io.c             | 28 ++++++++++++++++++++++
 platform/linux-generic/odp_packet_netmap.c         |  2 ++
 platform/linux-generic/odp_packet_socket.c         | 14 +++++++----
 5 files changed, 49 insertions(+), 4 deletions(-)

Comments

Maxim Uvarov Aug. 20, 2014, 2:19 p.m. UTC | #1
Reviewed-by: Maxim Uvarov <maxim.uvarov@linaro.org>

On 08/20/2014 06:08 PM, Balasubramanian Manoharan wrote:
> This patch provides API support for querying mac address of an interface using odp_pktio_t handle.
> This current patch incorporates the review comments from the previous patch.
>
> The discussions are ongoing regarding adding additional API for querying mac address using device name, once it gets finalized the same will be provided as a different patch.
>
> Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>
> ---
>   include/odp_packet_io.h                            |  8 +++++++
>   platform/linux-generic/include/odp_packet_netmap.h |  1 +
>   platform/linux-generic/odp_packet_io.c             | 28 ++++++++++++++++++++++
>   platform/linux-generic/odp_packet_netmap.c         |  2 ++
>   platform/linux-generic/odp_packet_socket.c         | 14 +++++++----
>   5 files changed, 49 insertions(+), 4 deletions(-)
>
> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
> index cfefac0..86778bf 100644
> --- a/include/odp_packet_io.h
> +++ b/include/odp_packet_io.h
> @@ -129,6 +129,14 @@ void odp_pktio_set_input(odp_packet_t pkt, odp_pktio_t id);
>    */
>   odp_pktio_t odp_pktio_get_input(odp_packet_t pkt);
>   
> +/**
> + * Get mac address of the interface
> + *
> + * @param id		ODP packet IO handle
> + * @param mac_addr	Storage for Mac address of the packet IO interface (filled by function)
> + * @return  0 on success or -1 on error
> +**/
> +int odp_pktio_get_mac_addr(odp_pktio_t id, unsigned char *mac_addr);
>   #ifdef __cplusplus
>   }
>   #endif
> diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
> index 57d9f2c..69174fe 100644
> --- a/platform/linux-generic/include/odp_packet_netmap.h
> +++ b/platform/linux-generic/include/odp_packet_netmap.h
> @@ -40,6 +40,7 @@ typedef struct {
>   	odp_queue_t tx_access; /* Used for exclusive access to send packets */
>   	uint32_t if_flags;
>   	char ifname[32];
> +	unsigned char if_mac[ETH_ALEN];
>   } pkt_netmap_t;
>   
>   /**
> diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
> index 33ade10..b29cca1 100644
> --- a/platform/linux-generic/odp_packet_io.c
> +++ b/platform/linux-generic/odp_packet_io.c
> @@ -246,6 +246,7 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>   		break;
>   	}
>   
> +	pktio_entry->s.params.type = params->type;
>   	unlock_entry(pktio_entry);
>   	return id;
>   }
> @@ -535,3 +536,30 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int num)
>   
>   	return nbr;
>   }
> +int odp_pktio_get_mac_addr(odp_pktio_t pkt, unsigned char *mac_addr)
> +{
> +	pktio_entry_t *pktio_entry = get_entry(pkt);
> +	if (!pktio_entry) {
> +		ODP_ERR("Invalid odp_pktio_t value\n");
> +		return -1;
> +	}
> +	switch (pktio_entry->s.params.type) {
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +		memcpy(mac_addr, pktio_entry->s.pkt_sock.if_mac, ETH_ALEN);
> +		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +		memcpy(mac_addr, pktio_entry->s.pkt_sock_mmap.if_mac, ETH_ALEN);
> +		break;
> +#ifdef ODP_HAVE_NETMAP
> +	case ODP_PKTIO_TYPE_NETMAP:
> +		memcpy(mac_addr, pktio_entry->s.pkt_nm.if_mac, ETH_ALEN);
> +		break;
> +#endif
> +	default:
> +		ODP_ERR("Invalid pktio type: %02x\n",
> +			pktio_entry->s.params.type);
> +		return ODP_PKTIO_INVALID;
> +	}
> +	return 0;
> +}
> diff --git a/platform/linux-generic/odp_packet_netmap.c b/platform/linux-generic/odp_packet_netmap.c
> index e2215ab..9f58a6a 100644
> --- a/platform/linux-generic/odp_packet_netmap.c
> +++ b/platform/linux-generic/odp_packet_netmap.c
> @@ -222,6 +222,8 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
>   		ODP_ERR("Error: token creation failed\n");
>   		return -1;
>   	}
> +	if (socket_store_hw_addr(pkt_nm->if_mac, netdev)
> +		return -1;
>   
>   	odp_queue_enq(pkt_nm->tx_access, token);
>   
> diff --git a/platform/linux-generic/odp_packet_socket.c b/platform/linux-generic/odp_packet_socket.c
> index d44c333..39aa4db 100644
> --- a/platform/linux-generic/odp_packet_socket.c
> +++ b/platform/linux-generic/odp_packet_socket.c
> @@ -57,6 +57,8 @@ typedef struct {
>   
>   static raw_socket_t raw_sockets[MAX_RAW_SOCKETS_NETDEVS];
>   static odp_spinlock_t raw_sockets_lock;
> +static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
> +			      const char *netdev);
>   
>   /** Eth buffer start offset from u32-aligned address to make sure the following
>    * header (e.g. IP) starts at a 32-bit aligned address.
> @@ -174,6 +176,10 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev,
>   	sockfd = find_raw_fd(netdev);
>   	if (sockfd) {
>   		pkt_sock->sockfd = sockfd;
> +		if (socket_store_hw_addr(sockfd, pkt_sock->if_mac, netdev)) {
> +			perror("setup_pkt_sock() - socket_store_hw_addr()");
> +			goto error;
> +		}
>   		odp_spinlock_unlock(&raw_sockets_lock);
>   		return sockfd;
>   	}
> @@ -735,7 +741,7 @@ static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, const char *netdev)
>   	return 0;
>   }
>   
> -static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
> +static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
>   			      const char *netdev)
>   {
>   	struct ifreq ethreq;
> @@ -744,13 +750,13 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
>   	/* get MAC address */
>   	memset(&ethreq, 0, sizeof(ethreq));
>   	strncpy(ethreq.ifr_name, netdev, IFNAMSIZ);
> -	ret = ioctl(pkt_sock->sockfd, SIOCGIFHWADDR, &ethreq);
> +	ret = ioctl(sockfd, SIOCGIFHWADDR, &ethreq);
>   	if (ret != 0) {
>   		perror("store_hw_addr() - ioctl(SIOCGIFHWADDR)");
>   		return -1;
>   	}
>   
> -	ethaddr_copy(pkt_sock->if_mac,
> +	ethaddr_copy(if_mac,
>   		     (unsigned char *)ethreq.ifr_ifru.ifru_hwaddr.sa_data);
>   
>   	return 0;
> @@ -805,7 +811,7 @@ int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, const char *netdev,
>   	if (ret != 0)
>   		return -1;
>   
> -	ret = mmap_store_hw_addr(pkt_sock, netdev);
> +	ret = socket_store_hw_addr(pkt_sock->sockfd, pkt_sock->if_mac, netdev);
>   	if (ret != 0)
>   		return -1;
>
Maxim Uvarov Aug. 21, 2014, 8:10 a.m. UTC | #2
I think to merge this patch we need to add other platforms. Or at least 
place holder in other platforms that this function is not implemented.

Thanks,
Maxim.

On 08/20/2014 06:08 PM, Balasubramanian Manoharan wrote:
> This patch provides API support for querying mac address of an interface using odp_pktio_t handle.
> This current patch incorporates the review comments from the previous patch.
>
> The discussions are ongoing regarding adding additional API for querying mac address using device name, once it gets finalized the same will be provided as a different patch.
>
> Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>
> ---
>   include/odp_packet_io.h                            |  8 +++++++
>   platform/linux-generic/include/odp_packet_netmap.h |  1 +
>   platform/linux-generic/odp_packet_io.c             | 28 ++++++++++++++++++++++
>   platform/linux-generic/odp_packet_netmap.c         |  2 ++
>   platform/linux-generic/odp_packet_socket.c         | 14 +++++++----
>   5 files changed, 49 insertions(+), 4 deletions(-)
>
> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
> index cfefac0..86778bf 100644
> --- a/include/odp_packet_io.h
> +++ b/include/odp_packet_io.h
> @@ -129,6 +129,14 @@ void odp_pktio_set_input(odp_packet_t pkt, odp_pktio_t id);
>    */
>   odp_pktio_t odp_pktio_get_input(odp_packet_t pkt);
>   
> +/**
> + * Get mac address of the interface
> + *
> + * @param id		ODP packet IO handle
> + * @param mac_addr	Storage for Mac address of the packet IO interface (filled by function)
> + * @return  0 on success or -1 on error
> +**/
> +int odp_pktio_get_mac_addr(odp_pktio_t id, unsigned char *mac_addr);
>   #ifdef __cplusplus
>   }
>   #endif
> diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
> index 57d9f2c..69174fe 100644
> --- a/platform/linux-generic/include/odp_packet_netmap.h
> +++ b/platform/linux-generic/include/odp_packet_netmap.h
> @@ -40,6 +40,7 @@ typedef struct {
>   	odp_queue_t tx_access; /* Used for exclusive access to send packets */
>   	uint32_t if_flags;
>   	char ifname[32];
> +	unsigned char if_mac[ETH_ALEN];
>   } pkt_netmap_t;
>   
>   /**
> diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
> index 33ade10..b29cca1 100644
> --- a/platform/linux-generic/odp_packet_io.c
> +++ b/platform/linux-generic/odp_packet_io.c
> @@ -246,6 +246,7 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>   		break;
>   	}
>   
> +	pktio_entry->s.params.type = params->type;
>   	unlock_entry(pktio_entry);
>   	return id;
>   }
> @@ -535,3 +536,30 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int num)
>   
>   	return nbr;
>   }
> +int odp_pktio_get_mac_addr(odp_pktio_t pkt, unsigned char *mac_addr)
> +{
> +	pktio_entry_t *pktio_entry = get_entry(pkt);
> +	if (!pktio_entry) {
> +		ODP_ERR("Invalid odp_pktio_t value\n");
> +		return -1;
> +	}
> +	switch (pktio_entry->s.params.type) {
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +		memcpy(mac_addr, pktio_entry->s.pkt_sock.if_mac, ETH_ALEN);
> +		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +		memcpy(mac_addr, pktio_entry->s.pkt_sock_mmap.if_mac, ETH_ALEN);
> +		break;
> +#ifdef ODP_HAVE_NETMAP
> +	case ODP_PKTIO_TYPE_NETMAP:
> +		memcpy(mac_addr, pktio_entry->s.pkt_nm.if_mac, ETH_ALEN);
> +		break;
> +#endif
> +	default:
> +		ODP_ERR("Invalid pktio type: %02x\n",
> +			pktio_entry->s.params.type);
> +		return ODP_PKTIO_INVALID;
> +	}
> +	return 0;
> +}
> diff --git a/platform/linux-generic/odp_packet_netmap.c b/platform/linux-generic/odp_packet_netmap.c
> index e2215ab..9f58a6a 100644
> --- a/platform/linux-generic/odp_packet_netmap.c
> +++ b/platform/linux-generic/odp_packet_netmap.c
> @@ -222,6 +222,8 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
>   		ODP_ERR("Error: token creation failed\n");
>   		return -1;
>   	}
> +	if (socket_store_hw_addr(pkt_nm->if_mac, netdev)
> +		return -1;
>   
>   	odp_queue_enq(pkt_nm->tx_access, token);
>   
> diff --git a/platform/linux-generic/odp_packet_socket.c b/platform/linux-generic/odp_packet_socket.c
> index d44c333..39aa4db 100644
> --- a/platform/linux-generic/odp_packet_socket.c
> +++ b/platform/linux-generic/odp_packet_socket.c
> @@ -57,6 +57,8 @@ typedef struct {
>   
>   static raw_socket_t raw_sockets[MAX_RAW_SOCKETS_NETDEVS];
>   static odp_spinlock_t raw_sockets_lock;
> +static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
> +			      const char *netdev);
>   
>   /** Eth buffer start offset from u32-aligned address to make sure the following
>    * header (e.g. IP) starts at a 32-bit aligned address.
> @@ -174,6 +176,10 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev,
>   	sockfd = find_raw_fd(netdev);
>   	if (sockfd) {
>   		pkt_sock->sockfd = sockfd;
> +		if (socket_store_hw_addr(sockfd, pkt_sock->if_mac, netdev)) {
> +			perror("setup_pkt_sock() - socket_store_hw_addr()");
> +			goto error;
> +		}
>   		odp_spinlock_unlock(&raw_sockets_lock);
>   		return sockfd;
>   	}
> @@ -735,7 +741,7 @@ static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, const char *netdev)
>   	return 0;
>   }
>   
> -static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
> +static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
>   			      const char *netdev)
>   {
>   	struct ifreq ethreq;
> @@ -744,13 +750,13 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
>   	/* get MAC address */
>   	memset(&ethreq, 0, sizeof(ethreq));
>   	strncpy(ethreq.ifr_name, netdev, IFNAMSIZ);
> -	ret = ioctl(pkt_sock->sockfd, SIOCGIFHWADDR, &ethreq);
> +	ret = ioctl(sockfd, SIOCGIFHWADDR, &ethreq);
>   	if (ret != 0) {
>   		perror("store_hw_addr() - ioctl(SIOCGIFHWADDR)");
>   		return -1;
>   	}
>   
> -	ethaddr_copy(pkt_sock->if_mac,
> +	ethaddr_copy(if_mac,
>   		     (unsigned char *)ethreq.ifr_ifru.ifru_hwaddr.sa_data);
>   
>   	return 0;
> @@ -805,7 +811,7 @@ int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, const char *netdev,
>   	if (ret != 0)
>   		return -1;
>   
> -	ret = mmap_store_hw_addr(pkt_sock, netdev);
> +	ret = socket_store_hw_addr(pkt_sock->sockfd, pkt_sock->if_mac, netdev);
>   	if (ret != 0)
>   		return -1;
>
Robbie King Sept. 3, 2014, 6:09 p.m. UTC | #3
Anders has requested that I put a bugID in my patches
for IPsec example application where I have a #define
to work around the fact this patch isn't in yet.  Does
such a bugID already exist, or is there a chance this patch
will be accepted soon?

I would really like to get the IPsec app patches in soon,
every rebase gets a little more painful.

-----Original Message-----
From: lng-odp-bounces@lists.linaro.org [mailto:lng-odp-bounces@lists.linaro.org] On Behalf Of Maxim Uvarov
Sent: Thursday, August 21, 2014 4:11 AM
To: lng-odp@lists.linaro.org
Subject: Re: [lng-odp] [PATCH v4 1/1] API support for querying mac address

I think to merge this patch we need to add other platforms. Or at least 
place holder in other platforms that this function is not implemented.

Thanks,
Maxim.

On 08/20/2014 06:08 PM, Balasubramanian Manoharan wrote:
> This patch provides API support for querying mac address of an interface using odp_pktio_t handle.
> This current patch incorporates the review comments from the previous patch.
>
> The discussions are ongoing regarding adding additional API for querying mac address using device name, once it gets finalized the same will be provided as a different patch.
>
> Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>
> ---
>   include/odp_packet_io.h                            |  8 +++++++
>   platform/linux-generic/include/odp_packet_netmap.h |  1 +
>   platform/linux-generic/odp_packet_io.c             | 28 ++++++++++++++++++++++
>   platform/linux-generic/odp_packet_netmap.c         |  2 ++
>   platform/linux-generic/odp_packet_socket.c         | 14 +++++++----
>   5 files changed, 49 insertions(+), 4 deletions(-)
>
> diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
> index cfefac0..86778bf 100644
> --- a/include/odp_packet_io.h
> +++ b/include/odp_packet_io.h
> @@ -129,6 +129,14 @@ void odp_pktio_set_input(odp_packet_t pkt, odp_pktio_t id);
>    */
>   odp_pktio_t odp_pktio_get_input(odp_packet_t pkt);
>   
> +/**
> + * Get mac address of the interface
> + *
> + * @param id		ODP packet IO handle
> + * @param mac_addr	Storage for Mac address of the packet IO interface (filled by function)
> + * @return  0 on success or -1 on error
> +**/
> +int odp_pktio_get_mac_addr(odp_pktio_t id, unsigned char *mac_addr);
>   #ifdef __cplusplus
>   }
>   #endif
> diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
> index 57d9f2c..69174fe 100644
> --- a/platform/linux-generic/include/odp_packet_netmap.h
> +++ b/platform/linux-generic/include/odp_packet_netmap.h
> @@ -40,6 +40,7 @@ typedef struct {
>   	odp_queue_t tx_access; /* Used for exclusive access to send packets */
>   	uint32_t if_flags;
>   	char ifname[32];
> +	unsigned char if_mac[ETH_ALEN];
>   } pkt_netmap_t;
>   
>   /**
> diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
> index 33ade10..b29cca1 100644
> --- a/platform/linux-generic/odp_packet_io.c
> +++ b/platform/linux-generic/odp_packet_io.c
> @@ -246,6 +246,7 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
>   		break;
>   	}
>   
> +	pktio_entry->s.params.type = params->type;
>   	unlock_entry(pktio_entry);
>   	return id;
>   }
> @@ -535,3 +536,30 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int num)
>   
>   	return nbr;
>   }
> +int odp_pktio_get_mac_addr(odp_pktio_t pkt, unsigned char *mac_addr)
> +{
> +	pktio_entry_t *pktio_entry = get_entry(pkt);
> +	if (!pktio_entry) {
> +		ODP_ERR("Invalid odp_pktio_t value\n");
> +		return -1;
> +	}
> +	switch (pktio_entry->s.params.type) {
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +		memcpy(mac_addr, pktio_entry->s.pkt_sock.if_mac, ETH_ALEN);
> +		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +		memcpy(mac_addr, pktio_entry->s.pkt_sock_mmap.if_mac, ETH_ALEN);
> +		break;
> +#ifdef ODP_HAVE_NETMAP
> +	case ODP_PKTIO_TYPE_NETMAP:
> +		memcpy(mac_addr, pktio_entry->s.pkt_nm.if_mac, ETH_ALEN);
> +		break;
> +#endif
> +	default:
> +		ODP_ERR("Invalid pktio type: %02x\n",
> +			pktio_entry->s.params.type);
> +		return ODP_PKTIO_INVALID;
> +	}
> +	return 0;
> +}
> diff --git a/platform/linux-generic/odp_packet_netmap.c b/platform/linux-generic/odp_packet_netmap.c
> index e2215ab..9f58a6a 100644
> --- a/platform/linux-generic/odp_packet_netmap.c
> +++ b/platform/linux-generic/odp_packet_netmap.c
> @@ -222,6 +222,8 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
>   		ODP_ERR("Error: token creation failed\n");
>   		return -1;
>   	}
> +	if (socket_store_hw_addr(pkt_nm->if_mac, netdev)
> +		return -1;
>   
>   	odp_queue_enq(pkt_nm->tx_access, token);
>   
> diff --git a/platform/linux-generic/odp_packet_socket.c b/platform/linux-generic/odp_packet_socket.c
> index d44c333..39aa4db 100644
> --- a/platform/linux-generic/odp_packet_socket.c
> +++ b/platform/linux-generic/odp_packet_socket.c
> @@ -57,6 +57,8 @@ typedef struct {
>   
>   static raw_socket_t raw_sockets[MAX_RAW_SOCKETS_NETDEVS];
>   static odp_spinlock_t raw_sockets_lock;
> +static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
> +			      const char *netdev);
>   
>   /** Eth buffer start offset from u32-aligned address to make sure the following
>    * header (e.g. IP) starts at a 32-bit aligned address.
> @@ -174,6 +176,10 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev,
>   	sockfd = find_raw_fd(netdev);
>   	if (sockfd) {
>   		pkt_sock->sockfd = sockfd;
> +		if (socket_store_hw_addr(sockfd, pkt_sock->if_mac, netdev)) {
> +			perror("setup_pkt_sock() - socket_store_hw_addr()");
> +			goto error;
> +		}
>   		odp_spinlock_unlock(&raw_sockets_lock);
>   		return sockfd;
>   	}
> @@ -735,7 +741,7 @@ static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, const char *netdev)
>   	return 0;
>   }
>   
> -static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
> +static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
>   			      const char *netdev)
>   {
>   	struct ifreq ethreq;
> @@ -744,13 +750,13 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
>   	/* get MAC address */
>   	memset(&ethreq, 0, sizeof(ethreq));
>   	strncpy(ethreq.ifr_name, netdev, IFNAMSIZ);
> -	ret = ioctl(pkt_sock->sockfd, SIOCGIFHWADDR, &ethreq);
> +	ret = ioctl(sockfd, SIOCGIFHWADDR, &ethreq);
>   	if (ret != 0) {
>   		perror("store_hw_addr() - ioctl(SIOCGIFHWADDR)");
>   		return -1;
>   	}
>   
> -	ethaddr_copy(pkt_sock->if_mac,
> +	ethaddr_copy(if_mac,
>   		     (unsigned char *)ethreq.ifr_ifru.ifru_hwaddr.sa_data);
>   
>   	return 0;
> @@ -805,7 +811,7 @@ int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, const char *netdev,
>   	if (ret != 0)
>   		return -1;
>   
> -	ret = mmap_store_hw_addr(pkt_sock, netdev);
> +	ret = socket_store_hw_addr(pkt_sock->sockfd, pkt_sock->if_mac, netdev);
>   	if (ret != 0)
>   		return -1;
>
diff mbox

Patch

diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
index cfefac0..86778bf 100644
--- a/include/odp_packet_io.h
+++ b/include/odp_packet_io.h
@@ -129,6 +129,14 @@  void odp_pktio_set_input(odp_packet_t pkt, odp_pktio_t id);
  */
 odp_pktio_t odp_pktio_get_input(odp_packet_t pkt);
 
+/**
+ * Get mac address of the interface
+ *
+ * @param id		ODP packet IO handle
+ * @param mac_addr	Storage for Mac address of the packet IO interface (filled by function)
+ * @return  0 on success or -1 on error
+**/
+int odp_pktio_get_mac_addr(odp_pktio_t id, unsigned char *mac_addr);
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h
index 57d9f2c..69174fe 100644
--- a/platform/linux-generic/include/odp_packet_netmap.h
+++ b/platform/linux-generic/include/odp_packet_netmap.h
@@ -40,6 +40,7 @@  typedef struct {
 	odp_queue_t tx_access; /* Used for exclusive access to send packets */
 	uint32_t if_flags;
 	char ifname[32];
+	unsigned char if_mac[ETH_ALEN];
 } pkt_netmap_t;
 
 /**
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
index 33ade10..b29cca1 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -246,6 +246,7 @@  odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool,
 		break;
 	}
 
+	pktio_entry->s.params.type = params->type;
 	unlock_entry(pktio_entry);
 	return id;
 }
@@ -535,3 +536,30 @@  int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int num)
 
 	return nbr;
 }
+int odp_pktio_get_mac_addr(odp_pktio_t pkt, unsigned char *mac_addr)
+{
+	pktio_entry_t *pktio_entry = get_entry(pkt);
+	if (!pktio_entry) {
+		ODP_ERR("Invalid odp_pktio_t value\n");
+		return -1;
+	}
+	switch (pktio_entry->s.params.type) {
+	case ODP_PKTIO_TYPE_SOCKET_BASIC:
+	case ODP_PKTIO_TYPE_SOCKET_MMSG:
+		memcpy(mac_addr, pktio_entry->s.pkt_sock.if_mac, ETH_ALEN);
+		break;
+	case ODP_PKTIO_TYPE_SOCKET_MMAP:
+		memcpy(mac_addr, pktio_entry->s.pkt_sock_mmap.if_mac, ETH_ALEN);
+		break;
+#ifdef ODP_HAVE_NETMAP
+	case ODP_PKTIO_TYPE_NETMAP:
+		memcpy(mac_addr, pktio_entry->s.pkt_nm.if_mac, ETH_ALEN);
+		break;
+#endif
+	default:
+		ODP_ERR("Invalid pktio type: %02x\n",
+			pktio_entry->s.params.type);
+		return ODP_PKTIO_INVALID;
+	}
+	return 0;
+}
diff --git a/platform/linux-generic/odp_packet_netmap.c b/platform/linux-generic/odp_packet_netmap.c
index e2215ab..9f58a6a 100644
--- a/platform/linux-generic/odp_packet_netmap.c
+++ b/platform/linux-generic/odp_packet_netmap.c
@@ -222,6 +222,8 @@  int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev,
 		ODP_ERR("Error: token creation failed\n");
 		return -1;
 	}
+	if (socket_store_hw_addr(pkt_nm->if_mac, netdev)
+		return -1;
 
 	odp_queue_enq(pkt_nm->tx_access, token);
 
diff --git a/platform/linux-generic/odp_packet_socket.c b/platform/linux-generic/odp_packet_socket.c
index d44c333..39aa4db 100644
--- a/platform/linux-generic/odp_packet_socket.c
+++ b/platform/linux-generic/odp_packet_socket.c
@@ -57,6 +57,8 @@  typedef struct {
 
 static raw_socket_t raw_sockets[MAX_RAW_SOCKETS_NETDEVS];
 static odp_spinlock_t raw_sockets_lock;
+static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
+			      const char *netdev);
 
 /** Eth buffer start offset from u32-aligned address to make sure the following
  * header (e.g. IP) starts at a 32-bit aligned address.
@@ -174,6 +176,10 @@  int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev,
 	sockfd = find_raw_fd(netdev);
 	if (sockfd) {
 		pkt_sock->sockfd = sockfd;
+		if (socket_store_hw_addr(sockfd, pkt_sock->if_mac, netdev)) {
+			perror("setup_pkt_sock() - socket_store_hw_addr()");
+			goto error;
+		}
 		odp_spinlock_unlock(&raw_sockets_lock);
 		return sockfd;
 	}
@@ -735,7 +741,7 @@  static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, const char *netdev)
 	return 0;
 }
 
-static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
+static int socket_store_hw_addr(int sockfd, unsigned char *if_mac,
 			      const char *netdev)
 {
 	struct ifreq ethreq;
@@ -744,13 +750,13 @@  static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
 	/* get MAC address */
 	memset(&ethreq, 0, sizeof(ethreq));
 	strncpy(ethreq.ifr_name, netdev, IFNAMSIZ);
-	ret = ioctl(pkt_sock->sockfd, SIOCGIFHWADDR, &ethreq);
+	ret = ioctl(sockfd, SIOCGIFHWADDR, &ethreq);
 	if (ret != 0) {
 		perror("store_hw_addr() - ioctl(SIOCGIFHWADDR)");
 		return -1;
 	}
 
-	ethaddr_copy(pkt_sock->if_mac,
+	ethaddr_copy(if_mac,
 		     (unsigned char *)ethreq.ifr_ifru.ifru_hwaddr.sa_data);
 
 	return 0;
@@ -805,7 +811,7 @@  int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, const char *netdev,
 	if (ret != 0)
 		return -1;
 
-	ret = mmap_store_hw_addr(pkt_sock, netdev);
+	ret = socket_store_hw_addr(pkt_sock->sockfd, pkt_sock->if_mac, netdev);
 	if (ret != 0)
 		return -1;