From patchwork Fri Apr 13 17:26:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 898040 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ovn.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40N4YS0DmJz9s0t for ; Sat, 14 Apr 2018 03:30:36 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 52EE2E04; Fri, 13 Apr 2018 17:27:17 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 74D4FDD5 for ; Fri, 13 Apr 2018 17:27:13 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [217.70.183.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 771C8672 for ; Fri, 13 Apr 2018 17:27:12 +0000 (UTC) X-Originating-IP: 208.91.3.26 Received: from sigabrt.benpfaff.org (unknown [208.91.3.26]) (Authenticated sender: blp@ovn.org) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id E45EC24000D; Fri, 13 Apr 2018 19:27:10 +0200 (CEST) From: Ben Pfaff To: dev@openvswitch.org Date: Fri, 13 Apr 2018 10:26:52 -0700 Message-Id: <20180413172655.31638-8-blp@ovn.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180413172655.31638-1-blp@ovn.org> References: <20180413172655.31638-1-blp@ovn.org> X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Ben Pfaff Subject: [ovs-dev] [PATCH 08/11] netdev: New function netdev_get_ip_by_name(). X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org This is like netdev_get_in4_by_name() but accepts any IP address instead of just an IPv4 address. It will acquire its first user in an upcoming commit. Signed-off-by: Ben Pfaff --- lib/netdev.c | 81 +++++++++++++++++++++++++++++++++++++++++++----------------- lib/netdev.h | 1 + 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/lib/netdev.c b/lib/netdev.c index 00192f0b00da..1c4ae2c6cdd2 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -1142,39 +1142,74 @@ netdev_set_in4(struct netdev *netdev, struct in_addr addr, struct in_addr mask) : EOPNOTSUPP); } -/* Obtains ad IPv4 address from device name and save the address in - * in4. Returns 0 if successful, otherwise a positive errno value. - */ +static int +netdev_get_addresses_by_name(const char *device_name, + struct in6_addr **addrsp, int *n_addrsp) +{ + struct netdev *netdev; + int error = netdev_open(device_name, NULL, &netdev); + if (error) { + *addrsp = NULL; + *n_addrsp = 0; + return error; + } + + struct in6_addr *masks; + error = netdev_get_addr_list(netdev, addrsp, &masks, n_addrsp); + netdev_close(netdev); + free(masks); + return error; +} + +/* Obtains an IPv4 address from 'device_name' and save the address in '*in4'. + * Returns 0 if successful, otherwise a positive errno value. */ int netdev_get_in4_by_name(const char *device_name, struct in_addr *in4) { - struct in6_addr *mask, *addr6; - int err, n_in6, i; - struct netdev *dev; + struct in6_addr *addrs; + int n; + int error = netdev_get_addresses_by_name(device_name, &addrs, &n); - err = netdev_open(device_name, NULL, &dev); - if (err) { - return err; + in4->s_addr = 0; + if (!error) { + error = ENOENT; + for (int i = 0; i < n; i++) { + if (IN6_IS_ADDR_V4MAPPED(&addrs[i])) { + in4->s_addr = in6_addr_get_mapped_ipv4(&addrs[i]); + error = 0; + break; + } + } } + free(addrs); - err = netdev_get_addr_list(dev, &addr6, &mask, &n_in6); - if (err) { - goto out; - } + return error; +} - for (i = 0; i < n_in6; i++) { - if (IN6_IS_ADDR_V4MAPPED(&addr6[i])) { - in4->s_addr = in6_addr_get_mapped_ipv4(&addr6[i]); - goto out; +/* Obtains an IPv4 or IPv6 address from 'device_name' and save the address in + * '*ss', representing IPv4 addressse as v6-mapped. Returns 0 if successful, + * otherwise a positive errno value. */ +int +netdev_get_ip_by_name(const char *device_name, struct in6_addr *in6) +{ + struct in6_addr *addrs; + int n; + int error = netdev_get_addresses_by_name(device_name, &addrs, &n); + + *in6 = in6addr_any; + if (!error) { + error = ENOENT; + for (int i = 0; i < n; i++) { + if (!in6_is_lla(&addrs[i])) { + *in6 = addrs[i]; + error = 0; + break; + } } } - err = -ENOENT; -out: - free(addr6); - free(mask); - netdev_close(dev); - return err; + free(addrs); + return error; } /* Adds 'router' as a default IP gateway for the TCP/IP stack that corresponds diff --git a/lib/netdev.h b/lib/netdev.h index ff1b604b24e2..441e53daeb69 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -282,6 +282,7 @@ void netdev_restore_flags(struct netdev_saved_flags *); /* TCP/IP stack interface. */ int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask); int netdev_get_in4_by_name(const char *device_name, struct in_addr *in4); +int netdev_get_ip_by_name(const char *device_name, struct in6_addr *); int netdev_get_addr_list(const struct netdev *netdev, struct in6_addr **addr, struct in6_addr **mask, int *n_in6);