From patchwork Wed Aug 20 10:20: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: 35688 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pa0-f70.google.com (mail-pa0-f70.google.com [209.85.220.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id D92FD2055D for ; Wed, 20 Aug 2014 10:21:53 +0000 (UTC) Received: by mail-pa0-f70.google.com with SMTP id lf10sf66961606pab.1 for ; Wed, 20 Aug 2014 03:21:49 -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=pl6twonu5+BBxbSbA3J5XFKNjl5JJ0xl6brJYBGx5dM=; b=VBXlCMi86RCCQVhckrQUTfFW3IKB6GqNTpdtCn1MSZHYSzpVX5KLFC8Xh7sNq2LGzM KWxr8X5FWzX2ZcknPm0DE/uZqzrfkAzi3OYqrnDVi+gxiD/4Skg1PhdjdSk9uKcYp5TB xfnOLOTK3YwqhaadkdZrklrTYZWHTV/EMAsh1fiKYSC8n1FMasEcJP+ksYSSl+hTMyCf +4Lu/AxP3SZjniXhMlLI6Kat46Ev+RMBGNSgdksn5dSYHeu0s/Uaa0Na5yew3F6Z/5sS CJNDiNNok/neqRJSBvQN5Y0jQbDZuLHPIBDeFGTyOITOli7z5E6czifID25Tx+nRCn2w 4AzQ== X-Gm-Message-State: ALoCoQkR71wjIN2jwwZXxJUnPE1AlvfGI6v1f2F4Wl/KuWhuXOedg1GA9vFvanAxD6KQnfclDWVq X-Received: by 10.66.190.67 with SMTP id go3mr25127960pac.10.1408530107754; Wed, 20 Aug 2014 03:21:47 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.88.6 with SMTP id s6ls208624qgd.22.gmail; Wed, 20 Aug 2014 03:21:47 -0700 (PDT) X-Received: by 10.53.0.164 with SMTP id az4mr4902960vdd.52.1408530107621; Wed, 20 Aug 2014 03:21:47 -0700 (PDT) Received: from mail-vc0-f172.google.com (mail-vc0-f172.google.com [209.85.220.172]) by mx.google.com with ESMTPS id n4si10353518vda.71.2014.08.20.03.21.47 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 20 Aug 2014 03:21:47 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.172 as permitted sender) client-ip=209.85.220.172; Received: by mail-vc0-f172.google.com with SMTP id im17so8859403vcb.31 for ; Wed, 20 Aug 2014 03:21:47 -0700 (PDT) X-Received: by 10.220.15.8 with SMTP id i8mr5751332vca.45.1408530107533; Wed, 20 Aug 2014 03:21: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 uj3csp41442vcb; Wed, 20 Aug 2014 03:21:47 -0700 (PDT) X-Received: by 10.140.98.7 with SMTP id n7mr70723544qge.83.1408530106854; Wed, 20 Aug 2014 03:21: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 dt10si33238626qcb.26.2014.08.20.03.21.46 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 20 Aug 2014 03:21: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 1XK31V-0006xa-E0; Wed, 20 Aug 2014 10:21:45 +0000 Received: from mail-ie0-f178.google.com ([209.85.223.178]) by ip-10-141-164-156.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1XK31P-0006xV-I2 for lng-odp@lists.linaro.org; Wed, 20 Aug 2014 10:21:39 +0000 Received: by mail-ie0-f178.google.com with SMTP id rd18so2594573iec.37 for ; Wed, 20 Aug 2014 03:21:34 -0700 (PDT) X-Received: by 10.42.247.137 with SMTP id mc9mr45854580icb.13.1408530094054; Wed, 20 Aug 2014 03:21:34 -0700 (PDT) Received: from bala-PowerEdge-T110-II.caveonetworks.com ([111.93.218.67]) by mx.google.com with ESMTPSA id x3sm9456547igl.7.2014.08.20.03.21.32 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 20 Aug 2014 03:21:33 -0700 (PDT) From: Balasubramanian Manoharan To: lng-odp@lists.linaro.org Date: Wed, 20 Aug 2014 15:50:39 +0530 Message-Id: <1408530039-1266-1-git-send-email-bala.manoharan@linaro.org> X-Mailer: git-send-email 1.7.9.5 X-Topics: patch Subject: [lng-odp] [PATCH v3 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.172 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 | 29 +++++++++++++++++++++- platform/linux-generic/odp_packet_netmap.c | 3 ++- platform/linux-generic/odp_packet_socket.c | 19 +++++++------- 5 files changed, 49 insertions(+), 11 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..ddad7a4 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,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..13f3f52 100644 --- a/platform/linux-generic/odp_packet_netmap.c +++ b/platform/linux-generic/odp_packet_netmap.c @@ -222,9 +222,10 @@ 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..593d093 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. @@ -153,7 +155,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 +169,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 +218,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 +737,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 +746,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 +807,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);