Regards,
Bala
Signed-off-by: Balasubramanian Manoharan <[email protected]>
---
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 | 4 +++-
platform/linux-generic/odp_packet_socket.c | 8 +++----
5 files changed, 43 insertions(+), 6 deletions(-)
diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h
index cfefac0..6c06520 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..3693416 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..069b0e1 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -245,7 +245,7 @@ odp_pktio_t odp_pktio_open(const char *dev,
odp_buffer_pool_t pool,
ODP_ERR("This type of I/O is not supported. Please
recompile.\n");
break;
}
-
+ pktio_entry->s.params.type = params->type;
unlock_entry(pktio_entry);
return id;
}
@@ -535,3 +535,29 @@ 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){
+ printf("Invalid odp_pktio_t value\n");
+ return ODP_PKTIO_INVALID;
+ }
+ 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..e9e9f56 100644
--- a/platform/linux-generic/odp_packet_netmap.c
+++ b/platform/linux-generic/odp_packet_netmap.c
@@ -222,9 +222,11 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const
char *netdev,
ODP_ERR("Error: token creation failed\n");
return -1;
}
+ if( 0 != socket_store_hw_addr(pkt_nm->if_mac, netdev)
+ return -1;
odp_queue_enq(pkt_nm->tx_access, token);
-
+
ODP_DBG("Wait for link to come up\n");
sleep(WAITLINK_TMO);
ODP_DBG("Done\n");
diff --git a/platform/linux-generic/odp_packet_socket.c
b/platform/linux-generic/odp_packet_socket.c
index d44c333..d96aa8e 100644
--- a/platform/linux-generic/odp_packet_socket.c
+++ b/platform/linux-generic/odp_packet_socket.c
@@ -735,7 +735,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 +744,13 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t * const
pkt_sock,
/* get MAC address */
memset(ðreq, 0, sizeof(ethreq));
strncpy(ethreq.ifr_name, netdev, IFNAMSIZ);
- ret = ioctl(pkt_sock->sockfd, SIOCGIFHWADDR, ðreq);
+ ret = ioctl(sockfd, SIOCGIFHWADDR, ðreq);
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 +805,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;
--
2.0.1.472.g6f92e5f
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp