From patchwork Wed Aug 20 09:29:39 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Balasubramanian Manoharan X-Patchwork-Id: 35687 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-oa0-f70.google.com (mail-oa0-f70.google.com [209.85.219.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id BCDB620351 for ; Wed, 20 Aug 2014 09:30:47 +0000 (UTC) Received: by mail-oa0-f70.google.com with SMTP id eb12sf49229369oac.1 for ; Wed, 20 Aug 2014 02:30:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:subject :precedence:list-id:list-unsubscribe:list-archive:list-post :list-help:list-subscribe:mime-version:errors-to:sender :x-original-sender:x-original-authentication-results:mailing-list :content-type:content-transfer-encoding; bh=F505l9SW/F0DTb7sQktAmUtaFgrfmhHydvAStbJtmI4=; b=IWrgNdPL/NFvMb//jKuwlnmgWu/JWd1wHmKSky2pp1Grv+Etg26vhzN9OTXlUh3/LB dy6C9Wr2R9UakRw0xCH/uxAmXeTj2IKvcAeK63HdpuAc1WLgxbWHb/To+35ZPj4CWWjt AigB13RKIUqGRgwGQbTVXTm+QNfYiw5PqJTB7hz0JV+jUapmZDNE2doF8I3XLfH80Gh9 yNclfICm3dmr5BOTbqgkvmzUmVZYN1T3haZK5rtHSocKPSoJGl/zhCNxsQENUIu9HOqa tW+EIaqGYTZKNEr9apN18iVYFg5AlF8hr9+CbYpMzTw0aeMFN5hcSo6/ilr7Tph7C+7a km4g== X-Gm-Message-State: ALoCoQkAFIqRsT7HstykfX5JKLviugnNjc1aZbmZSg3Q6+y19d7LcyCOTrJ8PVY8MNF0FoAF4WRL X-Received: by 10.42.207.146 with SMTP id fy18mr25524694icb.12.1408527047351; Wed, 20 Aug 2014 02:30:47 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.36.148 with SMTP id p20ls186009qgp.50.gmail; Wed, 20 Aug 2014 02:30:47 -0700 (PDT) X-Received: by 10.52.128.8 with SMTP id nk8mr4777498vdb.48.1408527047153; Wed, 20 Aug 2014 02:30:47 -0700 (PDT) Received: from mail-vc0-f178.google.com (mail-vc0-f178.google.com [209.85.220.178]) by mx.google.com with ESMTPS id w4si10327939vct.72.2014.08.20.02.30.47 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 20 Aug 2014 02:30:47 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.178 as permitted sender) client-ip=209.85.220.178; Received: by mail-vc0-f178.google.com with SMTP id la4so8692083vcb.23 for ; Wed, 20 Aug 2014 02:30:47 -0700 (PDT) X-Received: by 10.52.61.136 with SMTP id p8mr5365937vdr.15.1408527047045; Wed, 20 Aug 2014 02:30:47 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.45.67 with SMTP id uj3csp38567vcb; Wed, 20 Aug 2014 02:30:46 -0700 (PDT) X-Received: by 10.140.91.6 with SMTP id y6mr45541355qgd.58.1408527046529; Wed, 20 Aug 2014 02:30:46 -0700 (PDT) Received: from ip-10-141-164-156.ec2.internal (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTPS id 98si18818785qgb.33.2014.08.20.02.30.46 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 20 Aug 2014 02:30:46 -0700 (PDT) Received-SPF: none (google.com: lng-odp-bounces@lists.linaro.org does not designate permitted sender hosts) client-ip=54.225.227.206; Received: from localhost ([127.0.0.1] helo=ip-10-141-164-156.ec2.internal) by ip-10-141-164-156.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1XK2E9-0005Ob-K1; Wed, 20 Aug 2014 09:30:45 +0000 Received: from mail-yh0-f54.google.com ([209.85.213.54]) by ip-10-141-164-156.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1XK2E3-0005OW-QL for lng-odp@lists.linaro.org; Wed, 20 Aug 2014 09:30:39 +0000 Received: by mail-yh0-f54.google.com with SMTP id v1so6625694yhn.41 for ; Wed, 20 Aug 2014 02:30:34 -0700 (PDT) X-Received: by 10.236.209.97 with SMTP id r61mr70828398yho.3.1408527034540; Wed, 20 Aug 2014 02:30:34 -0700 (PDT) Received: from bala-PowerEdge-T110-II.caveonetworks.com ([111.93.218.67]) by mx.google.com with ESMTPSA id y65sm46979081yhl.26.2014.08.20.02.30.32 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 20 Aug 2014 02:30:34 -0700 (PDT) From: Balasubramanian Manoharan To: lng-odp@lists.linaro.org Date: Wed, 20 Aug 2014 14:59:39 +0530 Message-Id: <1408526979-932-1-git-send-email-bala.manoharan@linaro.org> X-Mailer: git-send-email 1.7.9.5 X-Topics: patch Subject: [lng-odp] [PATCH v2 1/1] API support for querying mac address X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: lng-odp-bounces@lists.linaro.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: bala.manoharan@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.178 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 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 --- 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 | 20 +++++++++------- 5 files changed, 50 insertions(+), 11 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..f644dff 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){ + 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..9bf2fcf 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( 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..a40fe60 100644 --- a/platform/linux-generic/odp_packet_socket.c +++ b/platform/linux-generic/odp_packet_socket.c @@ -57,6 +57,9 @@ typedef struct { static raw_socket_t raw_sockets[MAX_RAW_SOCKETS_NETDEVS]; static odp_spinlock_t raw_sockets_lock; +// Forward Declaration +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. @@ -153,7 +156,6 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev, if (pool == ODP_BUFFER_POOL_INVALID) return -1; pkt_sock->pool = pool; - pkt = odp_packet_alloc(pool); if (!odp_packet_is_valid(pkt)) return -1; @@ -168,12 +170,14 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev, pkt_sock->max_frame_len = pkt_sock->buf_size - pkt_sock->frame_offset; odp_packet_free(pkt); - odp_spinlock_lock(&raw_sockets_lock); - 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; } @@ -215,7 +219,6 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, const char *netdev, perror("setup_pkt_sock() - bind(to IF)"); goto error; } - add_raw_fd(netdev, sockfd); odp_spinlock_unlock(&raw_sockets_lock); return sockfd; @@ -735,7 +738,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 +747,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,8 +808,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); - if (ret != 0) + if(socket_store_hw_addr(pkt_sock->sockfd, pkt_sock->if_mac, netdev)) return -1; if_idx = if_nametoindex(netdev);