diff mbox

[v4] API support for querying mac address

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

Commit Message

Balasubramanian Manoharan Oct. 1, 2014, 1:24 p.m. UTC
This patch provides API support for querying mac address of an interface using
odp_pktio_t handle. 
This patch incorporates the review comments from the previous patch.

Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>
---
 example/ipsec/odp_ipsec.c                          |  8 ++++++-
 platform/linux-generic/include/api/odp_packet_io.h | 10 +++++++++
 platform/linux-generic/odp_packet_io.c             | 25 ++++++++++++++++++++++
 platform/linux-generic/odp_packet_socket.c         | 14 ++++++++----
 4 files changed, 52 insertions(+), 5 deletions(-)
diff mbox

Patch

diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index a9bba24..e5da314 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -555,6 +555,7 @@  void initialize_intf(char *intf, int type, int fanout)
 	odp_pktio_params_t params;
 	socket_params_t *sock_params = &params.sock_params;
 	uint8_t src_mac[ODPH_ETHADDR_LEN];
+	size_t mac_addr_size;
 	char src_mac_str[MAX_STRING];
 
 	/*
@@ -594,8 +595,13 @@  void initialize_intf(char *intf, int type, int fanout)
 	/* Read the source MAC address for this interface */
 #if USE_MAC_ADDR_HACK
 	ret = query_mac_address(intf, src_mac);
+	(void)mac_addr_size;
 #else
-	ret = odp_pktio_get_mac_addr(pktio, src_mac);
+	ret = odp_pktio_get_mac_addr(pktio, src_mac, &mac_addr_size);
+	if (mac_addr_size != ODPH_ETHADDR_LEN) {
+		ODP_ERR("Error: Ethernet mac address length not supported");
+		exit(EXIT_FAILURE);
+	}
 #endif
 	if (ret) {
 		ODP_ERR("Error: failed during MAC address get for %s\n", intf);
diff --git a/platform/linux-generic/include/api/odp_packet_io.h b/platform/linux-generic/include/api/odp_packet_io.h
index cfefac0..e2372b6 100644
--- a/platform/linux-generic/include/api/odp_packet_io.h
+++ b/platform/linux-generic/include/api/odp_packet_io.h
@@ -129,6 +129,16 @@  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)
+ * @param addr_size	Size of the Mac address (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,
+			   size_t *addr_size);
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
index c06653f..feb157b 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -226,6 +226,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;
 }
@@ -499,3 +500,27 @@  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 id, unsigned char *mac_addr,
+			   size_t *addr_size)
+{
+	pktio_entry_t *pktio_entry = get_entry(id);
+	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;
+	default:
+		ODP_ERR("Invalid pktio type: %02x\n",
+			pktio_entry->s.params.type);
+		return ODP_PKTIO_INVALID;
+	}
+	*addr_size = ETH_ALEN;
+	return 0;
+}
diff --git a/platform/linux-generic/odp_packet_socket.c b/platform/linux-generic/odp_packet_socket.c
index 279a0cb..7f5953b 100644
--- a/platform/linux-generic/odp_packet_socket.c
+++ b/platform/linux-generic/odp_packet_socket.c
@@ -89,6 +89,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.
@@ -206,6 +208,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;
 	}
@@ -777,7 +783,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;
@@ -786,13 +792,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;
@@ -847,7 +853,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;