aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic
diff options
context:
space:
mode:
authorMaxim Uvarov <maxim.uvarov@linaro.org>2014-12-09 20:44:47 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2014-12-10 16:52:31 +0300
commit52e18de38ab5bf9774753d5224de7ae3f161c21b (patch)
tree89533c3267e8f42238f0626d365f806db5e05feb /platform/linux-generic
parent22eaabb7db1d01faf165c716684382461b712638 (diff)
API: pktio: mac addr get function
Define API to get MAC address for specific packet i/o and implement linux-generic version. Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> Reviewed-by: Petri Savolainen <petri.savolainen@linaro.org> Reviewed-by: Victor Kamensky <victor.kamensky@linaro.org> Reviewed-by: Ciprian Barbu <ciprian.barbu@linaro.org>
Diffstat (limited to 'platform/linux-generic')
-rw-r--r--platform/linux-generic/include/api/odp_packet_io.h12
-rw-r--r--platform/linux-generic/odp_packet_io.c42
2 files changed, 54 insertions, 0 deletions
diff --git a/platform/linux-generic/include/api/odp_packet_io.h b/platform/linux-generic/include/api/odp_packet_io.h
index 742ea591f..63c047c54 100644
--- a/platform/linux-generic/include/api/odp_packet_io.h
+++ b/platform/linux-generic/include/api/odp_packet_io.h
@@ -175,6 +175,18 @@ int odp_pktio_promisc_mode_set(odp_pktio_t id, odp_bool_t enable);
int odp_pktio_promisc_mode(odp_pktio_t id);
/**
+ * Get the default MAC address of a packet IO interface.
+ *
+ * @param id ODP packet IO handle.
+ * @param[out] mac_addr Storage for MAC address of the packet IO interface.
+ * @param addr_size Storage size for the address
+ *
+ * @retval Number of bytes written on success, 0 on failure.
+ */
+size_t odp_pktio_mac_addr(odp_pktio_t id, void *mac_addr,
+ size_t addr_size);
+
+/**
* @}
*/
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
index fea53aaca..de24e6f0b 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -21,6 +21,7 @@
#include <string.h>
#include <sys/ioctl.h>
+#include <linux/if_arp.h>
static pktio_table_t *pktio_tbl;
@@ -662,3 +663,44 @@ int odp_pktio_promisc_mode(odp_pktio_t id)
else
return 0;
}
+
+size_t odp_pktio_mac_addr(odp_pktio_t id, void *mac_addr,
+ size_t addr_size)
+{
+ pktio_entry_t *entry;
+
+ if (addr_size < ETH_ALEN)
+ return 0;
+
+ entry = get_pktio_entry(id);
+ if (entry == NULL) {
+ ODP_DBG("pktio entry %d does not exist\n", id);
+ return 0;
+ }
+
+ lock_entry(entry);
+
+ if (odp_unlikely(is_free(entry))) {
+ unlock_entry(entry);
+ ODP_DBG("already freed pktio\n");
+ return -1;
+ }
+
+ switch (entry->s.type) {
+ case ODP_PKTIO_TYPE_SOCKET_BASIC:
+ case ODP_PKTIO_TYPE_SOCKET_MMSG:
+ memcpy(mac_addr, entry->s.pkt_sock.if_mac,
+ ETH_ALEN);
+ break;
+ case ODP_PKTIO_TYPE_SOCKET_MMAP:
+ memcpy(mac_addr, entry->s.pkt_sock_mmap.if_mac,
+ ETH_ALEN);
+ break;
+ default:
+ ODP_ABORT("Wrong socket type %d\n", entry->s.type);
+ }
+
+ unlock_entry(entry);
+
+ return ETH_ALEN;
+}