From patchwork Fri Apr 13 17:26:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 898042 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 40N4Yx3Xqzz9s0t for ; Sat, 14 Apr 2018 03:31:01 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 430AEE08; Fri, 13 Apr 2018 17:27:18 +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 638F1DE5 for ; Fri, 13 Apr 2018 17:27:15 +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 52DCD672 for ; Fri, 13 Apr 2018 17:27:14 +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 80FB7240009; Fri, 13 Apr 2018 19:27:12 +0200 (CEST) From: Ben Pfaff To: dev@openvswitch.org Date: Fri, 13 Apr 2018 10:26:53 -0700 Message-Id: <20180413172655.31638-9-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 09/11] ofproto-dpif-slow: Add IPv6 agent address support. 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 Suggested-by: Neil McKee Signed-off-by: Ben Pfaff --- ofproto/ofproto-dpif-sflow.c | 55 ++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c index 5d8c0e19f8e3..fe79a9dbbad6 100644 --- a/ofproto/ofproto-dpif-sflow.c +++ b/ofproto/ofproto-dpif-sflow.c @@ -446,43 +446,45 @@ sflow_choose_agent_address(const char *agent_device, const char *control_ip, SFLAddress *agent_addr) { - const char *target; - struct in_addr in4; - - memset(agent_addr, 0, sizeof *agent_addr); - agent_addr->type = SFLADDRESSTYPE_IP_V4; + struct in6_addr ip; if (agent_device) { - if (!netdev_get_in4_by_name(agent_device, &in4) - || !lookup_ip(agent_device, &in4)) { + /* If 'agent_device' is the name of a network device, use its IP + * address. */ + if (!netdev_get_ip_by_name(agent_device, &ip)) { + goto success; + } + + /* If 'agent_device' is itself an IP address, use it. */ + struct sockaddr_storage ss; + if (inet_parse_address(agent_device, &ss)) { + ip = ss_get_address(&ss); goto success; } } + /* Otherwise, use an appropriate local IP address for one of the + * collectors' remote IP addresses. */ + const char *target; SSET_FOR_EACH (target, targets) { - union { - struct sockaddr_storage ss; - struct sockaddr_in sin; - } sa; - char name[IFNAMSIZ]; - - if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, &sa.ss) - && sa.ss.ss_family == AF_INET) { - struct in6_addr addr6, src, gw; - - in6_addr_set_mapped_ipv4(&addr6, sa.sin.sin_addr.s_addr); + struct sockaddr_storage ss; + if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, &ss)) { /* sFlow only supports target in default routing table with * packet mark zero. */ - if (ovs_router_lookup(0, &addr6, name, &src, &gw)) { + ip = ss_get_address(&ss); - in4.s_addr = in6_addr_get_mapped_ipv4(&src); + struct in6_addr src, gw; + char name[IFNAMSIZ]; + if (ovs_router_lookup(0, &ip, name, &src, &gw)) { goto success; } } } - if (control_ip && !lookup_ip(control_ip, &in4)) { + struct sockaddr_storage ss; + if (control_ip && inet_parse_address(control_ip, &ss)) { + ip = ss_get_address(&ss); goto success; } @@ -490,7 +492,16 @@ sflow_choose_agent_address(const char *agent_device, return false; success: - agent_addr->address.ip_v4.addr = (OVS_FORCE uint32_t) in4.s_addr; + memset(agent_addr, 0, sizeof *agent_addr); + if (IN6_IS_ADDR_V4MAPPED(&ip)) { + agent_addr->type = SFLADDRESSTYPE_IP_V4; + agent_addr->address.ip_v4.addr + = (OVS_FORCE uint32_t) in6_addr_get_mapped_ipv4(&ip); + } else { + agent_addr->type = SFLADDRESSTYPE_IP_V6; + memcpy(agent_addr->address.ip_v6.addr, ip.s6_addr, + sizeof agent_addr->address.ip_v6.addr); + } return true; }