From patchwork Fri Apr 13 17:26:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 898032 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 40N4V5319mz9s0t for ; Sat, 14 Apr 2018 03:27:41 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 4AFF7DC8; Fri, 13 Apr 2018 17:27:09 +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 5E798D88 for ; Fri, 13 Apr 2018 17:27:07 +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 EA7DB672 for ; Fri, 13 Apr 2018 17:27:04 +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 95D29240007; Fri, 13 Apr 2018 19:27:03 +0200 (CEST) From: Ben Pfaff To: dev@openvswitch.org Date: Fri, 13 Apr 2018 10:26:47 -0700 Message-Id: <20180413172655.31638-3-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 03/11] ovn-northd: Use common code for sockaddr_storage. 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 better reuses existing code. It does require adding a slight variant on ss_format_address(), but it still seems like a net win. Signed-off-by: Ben Pfaff --- lib/socket-util.c | 28 ++++++++++++++++++++++------ lib/socket-util.h | 1 + ovn/northd/ovn-northd.c | 22 ++++++---------------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/lib/socket-util.c b/lib/socket-util.c index 86ac4d433a2d..b36de371baa1 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -1000,10 +1000,10 @@ is_safe_name(const char *name) return true; } -/* Formats the IPv4 or IPv6 address in 'ss' into 's'. If 'ss' is an IPv6 - * address, puts square brackets around the address. */ -void -ss_format_address(const struct sockaddr_storage *ss, struct ds *s) +static void +ss_format_address__(const struct sockaddr_storage *ss, + const char *lbrack, const char *rbrack, + struct ds *s) { if (ss->ss_family == AF_INET) { const struct sockaddr_in *sin @@ -1014,7 +1014,7 @@ ss_format_address(const struct sockaddr_storage *ss, struct ds *s) const struct sockaddr_in6 *sin6 = ALIGNED_CAST(const struct sockaddr_in6 *, ss); - ds_put_char(s, '['); + ds_put_cstr(s, lbrack); ds_reserve(s, s->length + INET6_ADDRSTRLEN); char *tail = &s->string[s->length]; inet_ntop(AF_INET6, sin6->sin6_addr.s6_addr, tail, INET6_ADDRSTRLEN); @@ -1034,12 +1034,28 @@ ss_format_address(const struct sockaddr_storage *ss, struct ds *s) } #endif - ds_put_char(s, ']'); + ds_put_cstr(s, rbrack); } else { OVS_NOT_REACHED(); } } +/* Formats the IPv4 or IPv6 address in 'ss' into 's'. If 'ss' is an IPv6 + * address, puts square brackets around the address. */ +void +ss_format_address(const struct sockaddr_storage *ss, struct ds *s) +{ + ss_format_address__(ss, "[", "]", s); +} + +/* Formats the IPv4 or IPv6 address in 'ss' into 's'. Does not add square + * brackets around IPv6 addresses. */ +void +ss_format_address_nobracks(const struct sockaddr_storage *ss, struct ds *s) +{ + ss_format_address__(ss, "", "", s); +} + size_t ss_length(const struct sockaddr_storage *ss) { diff --git a/lib/socket-util.h b/lib/socket-util.h index 439f0c285107..d8c6f082c8cf 100644 --- a/lib/socket-util.h +++ b/lib/socket-util.h @@ -75,6 +75,7 @@ char *describe_fd(int fd); * IPv6 address. */ uint16_t ss_get_port(const struct sockaddr_storage *); void ss_format_address(const struct sockaddr_storage *, struct ds *); +void ss_format_address_nobracks(const struct sockaddr_storage *, struct ds *); size_t ss_length(const struct sockaddr_storage *); const char *sock_strerror(int error); diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c index 845faba86fe0..b518953f2e63 100644 --- a/ovn/northd/ovn-northd.c +++ b/ovn/northd/ovn-northd.c @@ -2942,29 +2942,19 @@ ip_address_and_port_from_lb_key(const char *key, char **ip_address, uint16_t *port, int *addr_family) { struct sockaddr_storage ss; - char ip_addr_buf[INET6_ADDRSTRLEN]; - char *error; - - error = ipv46_parse(key, PORT_OPTIONAL, &ss); - if (error) { + if (!inet_parse_active(key, 0, &ss)) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1); VLOG_WARN_RL(&rl, "bad ip address or port for load balancer key %s", key); - free(error); return; } - if (ss.ss_family == AF_INET) { - struct sockaddr_in *sin = ALIGNED_CAST(struct sockaddr_in *, &ss); - *port = sin->sin_port == 0 ? 0 : ntohs(sin->sin_port); - inet_ntop(AF_INET, &sin->sin_addr, ip_addr_buf, sizeof ip_addr_buf); - } else { - struct sockaddr_in6 *sin6 = ALIGNED_CAST(struct sockaddr_in6 *, &ss); - *port = sin6->sin6_port == 0 ? 0 : ntohs(sin6->sin6_port); - inet_ntop(AF_INET6, &sin6->sin6_addr, ip_addr_buf, sizeof ip_addr_buf); - } + struct ds s = DS_EMPTY_INITIALIZER; + ss_format_address_nobracks(&ss, &s); + *ip_address = ds_steal_cstr(&s); + + *port = ss_get_port(&ss); - *ip_address = xstrdup(ip_addr_buf); *addr_family = ss.ss_family; }