@@ -555,6 +555,7 @@ void initialize_intf(char *intf, int type, int fanout)
odp_pktio_params_t params;
socket_params_t *sock_params = ¶ms.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);
@@ -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
@@ -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;
+}
@@ -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(ð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;
@@ -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;
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(-)