From patchwork Wed Aug 20 09:19:00 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Balasubramanian Manoharan X-Patchwork-Id: 35686 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f200.google.com (mail-ie0-f200.google.com [209.85.223.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 1046720351 for ; Wed, 20 Aug 2014 09:20:12 +0000 (UTC) Received: by mail-ie0-f200.google.com with SMTP id at20sf10334277iec.7 for ; Wed, 20 Aug 2014 02:20:11 -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=Rs1Kzy3itU0iW3xbAYjqGO35BC8mIJbd4aW1C9/5Gc8=; b=DzVw7WdTqju0V5ahZYmKVAtME3tLuzYKkz9bJf3pfcVxkrEO9EgJWobGZ/ET4vHLZb mE5KEzLKNH3tU98ii6GRL8XTvfA8j7mBoGzrZ78vZ3CstCEyHQi5Hhm4RMEmDku6/wz8 nSzCw8kGwFAITqzl2O7PkifLevb+pf9FRUt/tu/0qXhVebBOXH9NiDSRebDhh4thq/xG WCgvhbfcFK+JjRU411fG/Xczs66Zr2OnZbnF01Kx1XhYsW9TDqVNoHsG3Fzw9lN8qEIg wTMLqt7RGgJx5aE0Hmiemv8HMzReKwv1VegW+HEeQqkeCLF5sPoml4csk7X8WLywlKxh ukUw== X-Gm-Message-State: ALoCoQmxyewQndxTRGSvhXcmcLFW6+0YsQCZf4pK7DuMpYoBZRHuO2QCxiKyAybS29zS2DZzdEKp X-Received: by 10.182.246.70 with SMTP id xu6mr25711288obc.31.1408526411392; Wed, 20 Aug 2014 02:20:11 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.84.47 with SMTP id k44ls173660qgd.73.gmail; Wed, 20 Aug 2014 02:20:11 -0700 (PDT) X-Received: by 10.52.87.144 with SMTP id ay16mr5403918vdb.43.1408526411218; Wed, 20 Aug 2014 02:20:11 -0700 (PDT) Received: from mail-vc0-f171.google.com (mail-vc0-f171.google.com [209.85.220.171]) by mx.google.com with ESMTPS id z9si10333311vcl.1.2014.08.20.02.20.11 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 20 Aug 2014 02:20:11 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.171 as permitted sender) client-ip=209.85.220.171; Received: by mail-vc0-f171.google.com with SMTP id hq11so8815660vcb.16 for ; Wed, 20 Aug 2014 02:20:11 -0700 (PDT) X-Received: by 10.52.129.165 with SMTP id nx5mr22722764vdb.25.1408526411109; Wed, 20 Aug 2014 02:20:11 -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 uj3csp38041vcb; Wed, 20 Aug 2014 02:20:10 -0700 (PDT) X-Received: by 10.140.107.198 with SMTP id h64mr48522328qgf.42.1408526410385; Wed, 20 Aug 2014 02:20:10 -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 b19si33120209qag.22.2014.08.20.02.20.09 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 20 Aug 2014 02:20:10 -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 1XK23s-0005CO-Tl; Wed, 20 Aug 2014 09:20:08 +0000 Received: from mail-ig0-f172.google.com ([209.85.213.172]) by ip-10-141-164-156.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1XK23m-0005Bg-Hn for lng-odp@lists.linaro.org; Wed, 20 Aug 2014 09:20:02 +0000 Received: by mail-ig0-f172.google.com with SMTP id h15so11302894igd.17 for ; Wed, 20 Aug 2014 02:19:57 -0700 (PDT) X-Received: by 10.50.57.68 with SMTP id g4mr11563121igq.48.1408526396917; Wed, 20 Aug 2014 02:19:56 -0700 (PDT) Received: from bala-PowerEdge-T110-II.caveonetworks.com ([111.93.218.67]) by mx.google.com with ESMTPSA id f18sm8950169igz.0.2014.08.20.02.19.55 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 20 Aug 2014 02:19:56 -0700 (PDT) From: Balasubramanian Manoharan To: lng-odp@lists.linaro.org Date: Wed, 20 Aug 2014 14:49:00 +0530 Message-Id: <1408526340-683-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.171 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. Regards, Bala 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);