From patchwork Fri Jun 10 18:09:36 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Greear X-Patchwork-Id: 870112 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p5AI9xTX001493 for ; Fri, 10 Jun 2011 18:10:44 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757822Ab1FJSKn (ORCPT ); Fri, 10 Jun 2011 14:10:43 -0400 Received: from mail.candelatech.com ([208.74.158.172]:53563 "EHLO ns3.lanforge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757806Ab1FJSKn (ORCPT ); Fri, 10 Jun 2011 14:10:43 -0400 Received: from fs3.candelatech.com (firewall.candelatech.com [70.89.124.249]) by ns3.lanforge.com (8.14.2/8.14.2) with ESMTP id p5AI9o7G029276 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 10 Jun 2011 11:09:51 -0700 From: greearb@candelatech.com To: linux-nfs@vger.kernel.org Cc: Ben Greear Subject: [PATCH 4/7] nfs-utils: Implement srcaddr binding in network.c Date: Fri, 10 Jun 2011 11:09:36 -0700 Message-Id: <1307729379-7702-5-git-send-email-greearb@candelatech.com> X-Mailer: git-send-email 1.7.3.4 In-Reply-To: <1307729379-7702-1-git-send-email-greearb@candelatech.com> References: <1307729379-7702-1-git-send-email-greearb@candelatech.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Fri, 10 Jun 2011 18:10:44 +0000 (UTC) From: Ben Greear Implement binding logic in get_socket() if local_ip argument is not NULL. Note that this method had issues with supporting IPv6 before this patch, and this patch does NOT resolve them. Signed-off-by: Ben Greear --- :100644 100644 36c2e94... 5419c5d... M utils/mount/network.c utils/mount/network.c | 21 ++++++++++++++++++--- 1 files changed, 18 insertions(+), 3 deletions(-) diff --git a/utils/mount/network.c b/utils/mount/network.c index 36c2e94..5419c5d 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -461,19 +461,34 @@ static int get_socket(struct sockaddr_in *saddr, unsigned int p_prot, int so, cc, type; struct sockaddr_in laddr; socklen_t namelen = sizeof(laddr); + int f = AF_INET; + + if (local_ip && local_ip->is_set) + f = local_ip->addr.sa.sa_family; type = (p_prot == IPPROTO_UDP ? SOCK_DGRAM : SOCK_STREAM); - if ((so = socket (AF_INET, type, p_prot)) < 0) + + so = socket(f, type, p_prot); + if (so < 0) goto err_socket; - laddr.sin_family = AF_INET; + laddr.sin_family = f; laddr.sin_port = 0; laddr.sin_addr.s_addr = htonl(INADDR_ANY); if (resvp) { + /* TODO: Support IPv6 */ + if (local_ip && local_ip->is_set + && local_ip->addr.sa.sa_family == AF_INET) { + struct sockaddr_in *si = &local_ip->addr.s4; + laddr.sin_addr.s_addr = si->sin_addr.s_addr; + } if (bindresvport(so, &laddr) < 0) goto err_bindresvport; } else { - cc = bind(so, SAFE_SOCKADDR(&laddr), namelen); + if (local_ip && local_ip->is_set) + cc = bind(so, &local_ip->addr.sa, local_ip->addrlen); + else + cc = bind(so, SAFE_SOCKADDR(&laddr), namelen); if (cc < 0) goto err_bind; }