diff options
author | Maxim Uvarov <maxim.uvarov@linaro.org> | 2014-12-09 20:44:47 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2014-12-10 16:52:31 +0300 |
commit | 52e18de38ab5bf9774753d5224de7ae3f161c21b (patch) | |
tree | 89533c3267e8f42238f0626d365f806db5e05feb /platform/linux-generic | |
parent | 22eaabb7db1d01faf165c716684382461b712638 (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.h | 12 | ||||
-rw-r--r-- | platform/linux-generic/odp_packet_io.c | 42 |
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; +} |