Message ID | C1BBCB674C57E643932FC661E0B0D466239D3132@xmb-aln-x01.cisco.com |
---|---|
State | New |
Headers | show |
You're Welcome. Regards, Bala On 21 August 2014 08:16, Robbie King (robking) <robking@cisco.com> wrote: > Hi Bala, I patched this in and was able to query mac address using > odp_pktio_t handle. > > Thanks! > > -----Original Message----- > From: lng-odp-bounces@lists.linaro.org [mailto: > lng-odp-bounces@lists.linaro.org] On Behalf Of Balasubramanian Manoharan > Sent: Wednesday, August 20, 2014 10:08 AM > To: lng-odp@lists.linaro.org > Subject: [lng-odp] [PATCH v4 1/1] API support for querying mac address > > This patch provides API support for querying mac address of an interface > using odp_pktio_t handle. > This current patch incorporates the review comments from the previous > patch. > > The discussions are ongoing regarding adding additional API for querying > mac address using device name, once it gets finalized the same will be > provided as a different patch. > > Signed-off-by: Balasubramanian Manoharan <bala.manoharan@linaro.org> > --- > 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 | 2 ++ > platform/linux-generic/odp_packet_socket.c | 14 +++++++---- > 5 files changed, 49 insertions(+), 4 deletions(-) > > diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h > index cfefac0..86778bf 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..69174fe 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..b29cca1 100644 > --- a/platform/linux-generic/odp_packet_io.c > +++ b/platform/linux-generic/odp_packet_io.c > @@ -246,6 +246,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; > } > @@ -535,3 +536,30 @@ 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) { > + 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; > +#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..9f58a6a 100644 > --- a/platform/linux-generic/odp_packet_netmap.c > +++ b/platform/linux-generic/odp_packet_netmap.c > @@ -222,6 +222,8 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, > const char *netdev, > ODP_ERR("Error: token creation failed\n"); > return -1; > } > + if (socket_store_hw_addr(pkt_nm->if_mac, netdev) > + return -1; > > odp_queue_enq(pkt_nm->tx_access, token); > > diff --git a/platform/linux-generic/odp_packet_socket.c > b/platform/linux-generic/odp_packet_socket.c > index d44c333..39aa4db 100644 > --- a/platform/linux-generic/odp_packet_socket.c > +++ b/platform/linux-generic/odp_packet_socket.c > @@ -57,6 +57,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. > @@ -174,6 +176,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; > } > @@ -735,7 +741,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 +750,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 +811,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 > lng-odp@lists.linaro.org > http://lists.linaro.org/mailman/listinfo/lng-odp >
diff --git a/include/odp_packet_io.h b/include/odp_packet_io.h index cfefac0..86778bf 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..69174fe 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..b29cca1 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -246,6 +246,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; } @@ -535,3 +536,30 @@ 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) { + 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; +#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..9f58a6a 100644 --- a/platform/linux-generic/odp_packet_netmap.c +++ b/platform/linux-generic/odp_packet_netmap.c @@ -222,6 +222,8 @@ int setup_pkt_netmap(pkt_netmap_t * const pkt_nm, const char *netdev, ODP_ERR("Error: token creation failed\n"); return -1; } + if (socket_store_hw_addr(pkt_nm->if_mac, netdev) + return -1; odp_queue_enq(pkt_nm->tx_access, token); diff --git a/platform/linux-generic/odp_packet_socket.c b/platform/linux-generic/odp_packet_socket.c index d44c333..39aa4db 100644 --- a/platform/linux-generic/odp_packet_socket.c +++ b/platform/linux-generic/odp_packet_socket.c @@ -57,6 +57,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. @@ -174,6 +176,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; } @@ -735,7 +741,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 +750,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 +811,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;