From patchwork Tue Jan 23 19:19:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864962 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="caExu8DS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQymG05wzz9s9Y for ; Wed, 24 Jan 2018 06:19:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752044AbeAWTTk (ORCPT ); Tue, 23 Jan 2018 14:19:40 -0500 Received: from mail-lf0-f67.google.com ([209.85.215.67]:33022 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751774AbeAWTTi (ORCPT ); Tue, 23 Jan 2018 14:19:38 -0500 Received: by mail-lf0-f67.google.com with SMTP id t139so2044405lff.0 for ; Tue, 23 Jan 2018 11:19:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=76X53dY0a+XHyUfkAPpfZ1G4avbUz7ZBaNPgs6CdjVk=; b=caExu8DSGV+5CJUwxrXlTdX/Ig3y20pRWKqUAud5mOef8rrEpI5xx8jrYEVqWTig3L Yh3ez7aHyj+ORUDd9PTQkBqxyPCrMsbfIOmau4YPp1l0KMaXCAVgmebjixmJBq8DXyBs dtxgdMiZlAckMgGvJcdp1Ibwc1PTGxtpXYew32kfRQLkBWEv+8Jn6qxQk8dOjYUbIzfU 6oeUDkUz8fiLSgKHzlhG1Nqkkk06L2EndoOS6ZQoenWh5sasoMLjS78yRoQWHWkwfsdX 7DCRQO08xXtIP8us7sfFGNoTvgpkb7A/dGsrE4H9K4/91FM5kZHGxCnwIlSwp6AjfNBj SllQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=76X53dY0a+XHyUfkAPpfZ1G4avbUz7ZBaNPgs6CdjVk=; b=f9W3tjKWs/n/clXhzuVTJiOAJRfZbafhUxK6x29FQJRtdVcNc94XUyzFNND96Er3p0 coGK4SELcmHXpHKkE1kwPbnv46UJKE/LFHz4GAOMmz/8mqCT0uzYhhkE0yOu0CFPwNbZ +6+93BnsVB4oEwL2MCtxJ7pz3NwXNfdINJXQbPPh3uV3J1NIKy3mQgKvA1Eq9fhN+vJn +BCTDit7w4OLxQDOMYMdpYOWH/oXqViuDU0l0Xee+fdOaTc5geiKXnXowSKpVTq+nenv D6KZPt9QBP43EWtAz5Y/SW7N2oPOAw6BggUt3+MaHpip8rCPraOv1JSgW0/Ie5E4F+fE Mosg== X-Gm-Message-State: AKwxytfSdS09P5Uw0Sqnr7Y0Z+KnuF/EDmOm8KvNGetTBw3lTLnMuMDg 1vR9oC8VP6freI3Ab8BlMdprIQ== X-Google-Smtp-Source: AH8x2254y9NBJtmVgv67tbguo9dPaDRMny9DsAnl3znkgVANHhb85ndeVWt9mNARIlvFx8hW+7ecZg== X-Received: by 10.46.43.71 with SMTP id q68mr1747804lje.92.1516735176738; Tue, 23 Jan 2018 11:19:36 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.35 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:35 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 1/8] utils: Introduce get_addr_rta() and inet_addr_match_rta() Date: Tue, 23 Jan 2018 21:19:23 +0200 Message-Id: <1516735170-20921-2-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org First is used to get address from netlink attribute to inet_prefix data structure. Use memcpy() with constant value to let complier optimize by replacing a call by inlining load/store instructions. Second is used to match address in given netlink attribute with one given as reference. It matches successfully if no attribute is given (@rta is NULL), reference address family is AF_UNSPEC or it's length isn't given; fails if get_attr_rta() can't get attribute or it's family does not match reference; calls inet_addr_match() to get final verdict. Signed-off-by: Serhey Popovych --- include/utils.h | 2 ++ lib/utils.c | 95 ++++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 78 insertions(+), 19 deletions(-) diff --git a/include/utils.h b/include/utils.h index f562547..0394268 100644 --- a/include/utils.h +++ b/include/utils.h @@ -120,6 +120,7 @@ int get_prefix_1(inet_prefix *dst, char *arg, int family); int get_addr(inet_prefix *dst, const char *arg, int family); int get_prefix(inet_prefix *dst, char *arg, int family); int mask2bits(__u32 netmask); +int get_addr_rta(inet_prefix *dst, const struct rtattr *rta, int family); int get_addr_ila(__u64 *val, const char *arg); int read_prop(const char *dev, char *prop, long *value); @@ -174,6 +175,7 @@ int check_ifname(const char *); int get_ifname(char *, const char *); int matches(const char *arg, const char *pattern); int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits); +int inet_addr_match_rta(const inet_prefix *m, const struct rtattr *rta); const char *dnet_ntop(int af, const void *addr, char *str, size_t len); int dnet_pton(int af, const char *src, void *addr); diff --git a/lib/utils.c b/lib/utils.c index e20b60e..8e15625 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -534,6 +534,28 @@ int get_addr64(__u64 *ap, const char *cp) return 1; } +static void set_address_type(inet_prefix *addr) +{ + switch (addr->family) { + case AF_INET: + if (!addr->data[0]) + addr->flags |= ADDRTYPE_INET_UNSPEC; + else if (IN_MULTICAST(ntohl(addr->data[0]))) + addr->flags |= ADDRTYPE_INET_MULTI; + else + addr->flags |= ADDRTYPE_INET; + break; + case AF_INET6: + if (IN6_IS_ADDR_UNSPECIFIED(addr->data)) + addr->flags |= ADDRTYPE_INET_UNSPEC; + else if (IN6_IS_ADDR_MULTICAST(addr->data)) + addr->flags |= ADDRTYPE_INET_MULTI; + else + addr->flags |= ADDRTYPE_INET; + break; + } +} + static int __get_addr_1(inet_prefix *addr, const char *name, int family) { memset(addr, 0, sizeof(*addr)); @@ -627,25 +649,7 @@ int get_addr_1(inet_prefix *addr, const char *name, int family) if (ret) return ret; - switch (addr->family) { - case AF_INET: - if (!addr->data[0]) - addr->flags |= ADDRTYPE_INET_UNSPEC; - else if (IN_MULTICAST(ntohl(addr->data[0]))) - addr->flags |= ADDRTYPE_INET_MULTI; - else - addr->flags |= ADDRTYPE_INET; - break; - case AF_INET6: - if (IN6_IS_ADDR_UNSPECIFIED(addr->data)) - addr->flags |= ADDRTYPE_INET_UNSPEC; - else if (IN6_IS_ADDR_MULTICAST(addr->data)) - addr->flags |= ADDRTYPE_INET_MULTI; - else - addr->flags |= ADDRTYPE_INET; - break; - } - + set_address_type(addr); return 0; } @@ -734,6 +738,46 @@ int get_addr(inet_prefix *dst, const char *arg, int family) return 0; } +int get_addr_rta(inet_prefix *dst, const struct rtattr *rta, int family) +{ + const int len = RTA_PAYLOAD(rta); + const void *data = RTA_DATA(rta); + + switch (len) { + case 4: + dst->family = AF_INET; + dst->bytelen = 4; + memcpy(dst->data, data, 4); + break; + case 16: + dst->family = AF_INET6; + dst->bytelen = 16; + memcpy(dst->data, data, 16); + break; + case 2: + dst->family = AF_DECnet; + dst->bytelen = 2; + memcpy(dst->data, data, 2); + break; + case 10: + dst->family = AF_IPX; + dst->bytelen = 10; + memcpy(dst->data, data, 10); + break; + default: + return -1; + } + + if (family != AF_UNSPEC && family != dst->family) + return -2; + + dst->bitlen = -1; + dst->flags = 0; + + set_address_type(dst); + return 0; +} + int get_prefix(inet_prefix *dst, char *arg, int family) { if (family == AF_PACKET) { @@ -864,6 +908,19 @@ int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits) return 0; } +int inet_addr_match_rta(const inet_prefix *m, const struct rtattr *rta) +{ + inet_prefix dst; + + if (!rta || m->family == AF_UNSPEC || m->bitlen <= 0) + return 0; + + if (get_addr_rta(&dst, rta, m->family)) + return -1; + + return inet_addr_match(&dst, m, m->bitlen); +} + int __iproute2_hz_internal; int __get_hz(void) From patchwork Tue Jan 23 19:19:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864967 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Qmt87ZLX"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQymn0Xqcz9s4s for ; Wed, 24 Jan 2018 06:20:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752178AbeAWTUH (ORCPT ); Tue, 23 Jan 2018 14:20:07 -0500 Received: from mail-lf0-f67.google.com ([209.85.215.67]:35700 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751928AbeAWTTj (ORCPT ); Tue, 23 Jan 2018 14:19:39 -0500 Received: by mail-lf0-f67.google.com with SMTP id a204so2024232lfa.2 for ; Tue, 23 Jan 2018 11:19:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=sPV4jnMakdtc6F38waS2JNMUzH9b8eAbxozH7PBVjvc=; b=Qmt87ZLXKhGhVvlgXTAStdwKRtLt0s3NE6GSuWvbkPr+sJ2YcE/rUpTcrBYjlFKFS+ xREfryEJ/oP4XLUIZfmPFnZsrc5uQ605QOYgAiRiAUn+SBrmXI7hMv0W3CELKRp2P5XF Wj5MfqGod0oamTUyOPCdjYhHF72P4ub49WgrvVs1PtKF0gWQY6iKuzqILx/iQmm0Pasc 3Zh1YiEABtSerfSzeQef/Fqdv91/8YinhOuPMry/uAZwOWpvu4YYY52/dt24TJX2UsIK 1BOnWZ5fYMWM7td5LE7CKFJCcr/zoN5+/lvz8PvyNLQjpjh4LHu0GdADuOzR/na5H3iR yZdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=sPV4jnMakdtc6F38waS2JNMUzH9b8eAbxozH7PBVjvc=; b=XJlmwl8f96VIU24Zk+BoqMwi5E/pM6e1KzMFDJZTGsF9AURNOI0zTGw1V7a+MvXqPx SIh4zIzxEWNNm0QEhDpqMmFC0SY1SqcN1tkun+3yVBL7S6ysT6LPkVGTk4YfI2AXDZ43 6AKNuUI7aYfvUDT60vvWXN5GtSnj6R9+R1xISBoHKdmYpvCIPrbWFkFDT0JbWmvccNZO 7FhWGUPa44oLCI7P1a+KOjGOIv1WKOMAD1Lq3uUkobbAxPnHsyyoNwmOGSRwAsEdFMwd hXf5KrHmYZfeKTlQtsCm6E9ACPNd54PtbrlDBLUNPYONAwYlYGiw0IZYgeN/HxOC33Ek QgpQ== X-Gm-Message-State: AKwxytf5klYZjL9mZaTIl6/Xp/L3M+G5TuTPc46z72IYNL5yOyaEaC5L XgR7qlGYCBFXpsWs5+u82gjcHA== X-Google-Smtp-Source: AH8x225vgnGquIP6ebzrBvRuN4gqngpBCKgU/y3LJW4IJRnHMw+9yXV30Rp4E2iOzYgVvxQa6TtPbw== X-Received: by 10.46.46.12 with SMTP id u12mr1715598lju.81.1516735177972; Tue, 23 Jan 2018 11:19:37 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.36 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:37 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 2/8] ipaddress: Use inet_addr_match_rta() Date: Tue, 23 Jan 2018 21:19:24 +0200 Message-Id: <1516735170-20921-3-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org While there check return from get_prefix() for filter address. Signed-off-by: Serhey Popovych --- ip/ipaddress.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/ip/ipaddress.c b/ip/ipaddress.c index ba60125..44894e6 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -1523,19 +1523,13 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, if (fnmatch(filter.label, label, 0) != 0) return 0; } - if (filter.pfx.family) { - if (rta_tb[IFA_LOCAL]) { - inet_prefix dst = { .family = ifa->ifa_family }; - - memcpy(&dst.data, RTA_DATA(rta_tb[IFA_LOCAL]), RTA_PAYLOAD(rta_tb[IFA_LOCAL])); - if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen)) - return 0; - } - } if (filter.family && filter.family != ifa->ifa_family) return 0; + if (inet_addr_match_rta(&filter.pfx, rta_tb[IFA_LOCAL])) + return 0; + if (filter.flushb) { struct nlmsghdr *fn; @@ -1889,18 +1883,12 @@ static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo) if ((filter.flags ^ ifa_flags) & filter.flagmask) continue; if (filter.pfx.family || filter.label) { - if (!tb[IFA_LOCAL]) - tb[IFA_LOCAL] = tb[IFA_ADDRESS]; + struct rtattr *rta = + tb[IFA_LOCAL] ? : tb[IFA_ADDRESS]; - if (filter.pfx.family && tb[IFA_LOCAL]) { - inet_prefix dst = { - .family = ifa->ifa_family - }; + if (inet_addr_match_rta(&filter.pfx, rta)) + continue; - memcpy(&dst.data, RTA_DATA(tb[IFA_LOCAL]), RTA_PAYLOAD(tb[IFA_LOCAL])); - if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen)) - continue; - } if (filter.label) { SPRINT_BUF(b1); const char *label; @@ -2072,7 +2060,8 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action) while (argc > 0) { if (strcmp(*argv, "to") == 0) { NEXT_ARG(); - get_prefix(&filter.pfx, *argv, filter.family); + if (get_prefix(&filter.pfx, *argv, filter.family)) + invarg("invalid \"to\"\n", *argv); if (filter.family == AF_UNSPEC) filter.family = filter.pfx.family; } else if (strcmp(*argv, "scope") == 0) { From patchwork Tue Jan 23 19:19:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864964 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VZe076eW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQymN5s5hz9s9Y for ; Wed, 24 Jan 2018 06:19:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752101AbeAWTTq (ORCPT ); Tue, 23 Jan 2018 14:19:46 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:37444 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751998AbeAWTTk (ORCPT ); Tue, 23 Jan 2018 14:19:40 -0500 Received: by mail-lf0-f65.google.com with SMTP id f3so2025665lfe.4 for ; Tue, 23 Jan 2018 11:19:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=luc2dI5KHzG815PHsWbwxYKoA7v5/v2TvBBn08mPtmk=; b=VZe076eW8bvWdMrGvEAW7QHq0reWjFWO6bAfybXVhIcVAtHloohiJgG40vbaxbsRBo w9lAyGhYO+meGIjGJuC1bV0umqZ6dj8EwTT34FiZ3p84oKscppZsMQlx8xa6xN7QGXdi 2QwCpquTpHxr0itFC4cYc+7AhLFqdiXF+phrUPnf5W/rQ3FJH1usbce1dGw871HLqu+F cwxIXZikSRE/taQDiBY8tvqn/mfjcqEK9lxdj3TC/EsNiAv+Za0AYGI/oUVSNtNCVGDC yATPjqzBq9LTyFXEVcCkuhNpnYjZlvJzjnexdH8Wi+pJPXVqZMvL97rUbimXMAf/Gd1w 554A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=luc2dI5KHzG815PHsWbwxYKoA7v5/v2TvBBn08mPtmk=; b=sJgFMRyKw3Dn8TAtzWNSU1bWW5br62OoQJQZifPUJfHW/MDL1ZaohLNBCVDo0FPSdW OAb3+hjLwvEZ5n5Leczmj6jQTPYZcIkvlGmZ0+UJ35HM7RmNZNed7Crb2QozFw8qDCfs t03pNCaO9mZQaBKmEHfXmX0unzQO00ef68kUYvCFCaoGkdp6BMVc3Ry/0Xt0U/Yzf4y6 wRP5wftQYieAlTTGHfsMmb21bMAi1cEUPYeJ+CBeYNcxy3RuDLFf61OmgG5zxdHxPqBP gNy7u8ZYyNm3F9cFEY0ysDOm41o2ovfWY5911eWWmbX1OkgIKhHL6Nq8455xnCkRQNnY JyjA== X-Gm-Message-State: AKwxytcjprTiqt7CRR/0TTi3x+bAVzKZdziLjqHf8T+IMVGUOa7KehP8 6FGnk837ReMkD8IbMCa2TsN3hA== X-Google-Smtp-Source: AH8x225YpA2dUZs9kCq4Sgh7wJqdE/+lUKoG1DvEkNxlPnHDmqrQRyRoZRYobzu23xZunvatwKX5SA== X-Received: by 10.46.64.7 with SMTP id n7mr1713891lja.9.1516735179304; Tue, 23 Jan 2018 11:19:39 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.38 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:38 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 3/8] iprule: Use inet_addr_match_rta() Date: Tue, 23 Jan 2018 21:19:25 +0200 Message-Id: <1516735170-20921-4-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org While there check return from get_prefix() for filter address. Signed-off-by: Serhey Popovych --- ip/iprule.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/ip/iprule.c b/ip/iprule.c index 96695d8..a3abf2f 100644 --- a/ip/iprule.c +++ b/ip/iprule.c @@ -76,8 +76,6 @@ static struct static bool filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len) { struct rtmsg *r = NLMSG_DATA(n); - inet_prefix src = { .family = r->rtm_family }; - inet_prefix dst = { .family = r->rtm_family }; __u32 table; if (preferred_family != AF_UNSPEC && r->rtm_family != preferred_family) @@ -90,24 +88,24 @@ static bool filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len) return false; if (filter.src.family) { - if (tb[FRA_SRC]) { - memcpy(&src.data, RTA_DATA(tb[FRA_SRC]), - (r->rtm_src_len + 7) / 8); - } - if (filter.src.family != r->rtm_family || - filter.src.bitlen > r->rtm_src_len || - inet_addr_match(&src, &filter.src, filter.src.bitlen)) + inet_prefix *f_src = &filter.src; + + if (f_src->family != r->rtm_family || + f_src->bitlen > r->rtm_src_len) + return false; + + if (inet_addr_match_rta(f_src, tb[FRA_SRC])) return false; } if (filter.dst.family) { - if (tb[FRA_DST]) { - memcpy(&dst.data, RTA_DATA(tb[FRA_DST]), - (r->rtm_dst_len + 7) / 8); - } - if (filter.dst.family != r->rtm_family || - filter.dst.bitlen > r->rtm_dst_len || - inet_addr_match(&dst, &filter.dst, filter.dst.bitlen)) + inet_prefix *f_dst = &filter.dst; + + if (f_dst->family != r->rtm_family || + f_dst->bitlen > r->rtm_dst_len) + return false; + + if (inet_addr_match_rta(f_dst, tb[FRA_DST])) return false; } @@ -500,13 +498,15 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action) } else if (matches(*argv, "from") == 0 || matches(*argv, "src") == 0) { NEXT_ARG(); - get_prefix(&filter.src, *argv, af); + if (get_prefix(&filter.src, *argv, af)) + invarg("from value is invalid\n", *argv); } else { if (matches(*argv, "dst") == 0 || matches(*argv, "to") == 0) { NEXT_ARG(); } - get_prefix(&filter.dst, *argv, af); + if (get_prefix(&filter.dst, *argv, af)) + invarg("to value is invalid\n", *argv); } argc--; argv++; } From patchwork Tue Jan 23 19:19:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864963 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="NHlCCy6D"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQymL6Pmcz9s4s for ; Wed, 24 Jan 2018 06:19:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752095AbeAWTTp (ORCPT ); Tue, 23 Jan 2018 14:19:45 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:44721 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751774AbeAWTTm (ORCPT ); Tue, 23 Jan 2018 14:19:42 -0500 Received: by mail-lf0-f65.google.com with SMTP id v188so2014082lfa.11 for ; Tue, 23 Jan 2018 11:19:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=EElrN5lmHW1tKK3JUqpx+ENDwS2lzJkUZPj6ENEpA5w=; b=NHlCCy6DkfScWrnMMIcbB1eey+AySv4vp+nihvn8fedUp561BQV79Ymh7fHcD8xXx5 3BP46lyfOQroQGklzsx0wELDLoemsSbZrSb6Pq0+0MwAa04oon2wo+TDD2Wt4lFQBN74 D+rWucsnbJvrdg5iR3NtNSHPjsw7rd5EA/E3WGHXff1DSg3CarI2iy5NsL4Y6ZNIDEfB TXKz/Isf4L6Goik8GsPP+V86rl4dFjy47ciXfVkrQy+9TPmAp8aiQV4ZBibQbWC9AY6f FPqdivogYRlVpL9yu51Phw3hSgenf6lOIujJy5faDjT7RR6/pvyexTjcX3gooYnVn4zm hxTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=EElrN5lmHW1tKK3JUqpx+ENDwS2lzJkUZPj6ENEpA5w=; b=sY63mzBaHXaAfF7ZCdkDCCJ+wQxjrOmB2IZAScLy04LWhZIXpShztLsZA9a5uyApdm NADgYgtTz3hdzB/cCGYT1MCvNK7ppi6ejABoBy5eyg/wFHawJPYXn07IRgjyrpd9FvPq 4wXf31N3qMslG3anBRp3pOcc6n6hOr43uaeZwkU4sIR4m2dB5rtin3hd/ot8NOeyzKsT scixCF3SthXBjxqRuW5EvACUkxOV2RL+JkmQL15UvtCna46qJCi+1tSexk743RqB3XFs 8LEmjEjqGvl7uPeK3uRo6BHJUuAV5MTDl7M7JNceVh279cjFqBElr8Cfjkhlsh3nmf8j rimA== X-Gm-Message-State: AKwxytcDMLy1vzfB2ORPqXFrwsrqBxpahcAZMJkubJB2hHu7MRvNnUNt 9HlU6bz/SuraKrx+wH0MpAXb4w== X-Google-Smtp-Source: AH8x227939FGGtJ20g3I+HqvcyumhVnkb1HjxqX99ReDdo5b7VBtx8CoSMHdqVjHkeAQM0nPx2QfbA== X-Received: by 10.46.65.66 with SMTP id o63mr1754931lja.97.1516735180444; Tue, 23 Jan 2018 11:19:40 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.39 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:39 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 4/8] ipmroute: Use inet_addr_match_rta() Date: Tue, 23 Jan 2018 21:19:26 +0200 Message-Id: <1516735170-20921-5-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org While there check return from get_prefix() for filter address. Signed-off-by: Serhey Popovych --- ip/ipmroute.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/ip/ipmroute.c b/ip/ipmroute.c index 0450ea9..aa5029b 100644 --- a/ip/ipmroute.c +++ b/ip/ipmroute.c @@ -95,21 +95,11 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) if (filter.af && filter.af != r->rtm_family) return 0; - if (tb[RTA_DST] && filter.mdst.bitlen > 0) { - inet_prefix dst = { .family = r->rtm_family }; - - memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), RTA_PAYLOAD(tb[RTA_DST])); - if (inet_addr_match(&dst, &filter.mdst, filter.mdst.bitlen)) - return 0; - } - - if (tb[RTA_SRC] && filter.msrc.bitlen > 0) { - inet_prefix src = { .family = r->rtm_family }; + if (inet_addr_match_rta(&filter.mdst, tb[RTA_DST])) + return 0; - memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), RTA_PAYLOAD(tb[RTA_SRC])); - if (inet_addr_match(&src, &filter.msrc, filter.msrc.bitlen)) - return 0; - } + if (inet_addr_match_rta(&filter.msrc, tb[RTA_SRC])) + return 0; family = get_real_family(r->rtm_type, r->rtm_family); @@ -213,6 +203,8 @@ static int mroute_list(int argc, char **argv) } else filter.af = RTNL_FAMILY_IP6MR; + filter.msrc.family = filter.mdst.family = family; + while (argc > 0) { if (matches(*argv, "table") == 0) { __u32 tid; @@ -233,14 +225,16 @@ static int mroute_list(int argc, char **argv) id = *argv; } else if (matches(*argv, "from") == 0) { NEXT_ARG(); - get_prefix(&filter.msrc, *argv, family); + if (get_prefix(&filter.msrc, *argv, family)) + invarg("from value is invalid\n", *argv); } else { if (strcmp(*argv, "to") == 0) { NEXT_ARG(); } if (matches(*argv, "help") == 0) usage(); - get_prefix(&filter.mdst, *argv, family); + if (get_prefix(&filter.mdst, *argv, family)) + invarg("to value is invalid\n", *argv); } argc--; argv++; } From patchwork Tue Jan 23 19:19:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864968 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="nlgZ3cBO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQyms0Vr0z9s4s for ; Wed, 24 Jan 2018 06:20:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752160AbeAWTUG (ORCPT ); Tue, 23 Jan 2018 14:20:06 -0500 Received: from mail-lf0-f68.google.com ([209.85.215.68]:45766 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752000AbeAWTTo (ORCPT ); Tue, 23 Jan 2018 14:19:44 -0500 Received: by mail-lf0-f68.google.com with SMTP id x196so1996742lfd.12 for ; Tue, 23 Jan 2018 11:19:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=Pgs0K9+oRDNSyGW3O828XvayAMnLkI0Xq0etfm1tahc=; b=nlgZ3cBOGCcmh5vhFUM1wQ+Z+3MbHnuOzxBYmT/C3ykcgftfZ2b1jOwyVpEatxRReE i/aIR4jTtCOXmTRN+wsR2lf2tQKaFV67c/QujrmoGgeMR6Yz94Kgs/i/AfGQByivB3mR 3KT1XNZNzYU7I5dmu6SIL6PT7jvExyPEjCwcPVoLZYO0xQg8X8iJGnZ6z0oL2NjLfokL XdFCyKAmNQcUXTAZdmPMkmnkvpkCXOhwvwYRf+1SBnLxh8rouREfRdmaTivhZU4wIrU+ x29TId8q5/K5b3joaku98Zq8WDchR1TMhysgaykNWJfIt9pkzmLwyA++vPxz1V6axIJK DOxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Pgs0K9+oRDNSyGW3O828XvayAMnLkI0Xq0etfm1tahc=; b=TtSBoiCjiVpeVbLt+P/gG+L7EjnWfrIfqcL3ugKN41kOhHKL+W1uXuUQ/0PSXpV6ZA 9zMAoBeYTcc1MTv2H2ss/hoE42zGF5f/fDHht7F3Z5Z696iEytT3FNHKxYsq8ZOLFmld RE96mM6Wx8y7HXHedVB7miMvNaS1dyoLxG3K+4VY1b4tOHC7ExVSenL1qb2I0C51GYky qgZmUwr9IJjsrihalCD/uW6Ubxf6csSAsd7QqrVDxonKZp3sAtxTqtYqgQWEs9KYdRng 1i6iOK46aBZNPR7G8bxYcH1VPy1GNgVxfT8d5r6MhtVX9RivxjCRNf0TxHioCNxR7/Ks ku+g== X-Gm-Message-State: AKwxytdkKds9+2FlVUNDCMobbeuaea7Cx4/X+j9ltgK8Wv7M57uFBF5P 6bRaaXcobMPQxEuBlF5CSmCPNQ== X-Google-Smtp-Source: AH8x227tamy1TPmHNRHYg3EnYC7eOH4xD9qFzRlUgWoB4gzeRtP0Mh2O4e2YsMV0XSYaG8eVkC92AQ== X-Received: by 10.46.93.130 with SMTP id v2mr1787426lje.63.1516735181553; Tue, 23 Jan 2018 11:19:41 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:40 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 5/8] ipneigh: Use inet_addr_match_rta() Date: Tue, 23 Jan 2018 21:19:27 +0200 Message-Id: <1516735170-20921-6-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org While there check return from get_prefix() for filter address. Signed-off-by: Serhey Popovych --- ip/ipneigh.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/ip/ipneigh.c b/ip/ipneigh.c index 11f280d..0735424 100644 --- a/ip/ipneigh.c +++ b/ip/ipneigh.c @@ -234,15 +234,9 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) parse_rtattr(tb, NDA_MAX, NDA_RTA(r), n->nlmsg_len - NLMSG_LENGTH(sizeof(*r))); - if (tb[NDA_DST]) { - if (filter.pfx.family) { - inet_prefix dst = { .family = r->ndm_family }; + if (inet_addr_match_rta(&filter.pfx, tb[NDA_DST])) + return 0; - memcpy(&dst.data, RTA_DATA(tb[NDA_DST]), RTA_PAYLOAD(tb[NDA_DST])); - if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen)) - return 0; - } - } if (filter.unused_only && tb[NDA_CACHEINFO]) { struct nda_cacheinfo *ci = RTA_DATA(tb[NDA_CACHEINFO]); @@ -418,7 +412,8 @@ static int do_show_or_flush(int argc, char **argv, int flush) } if (matches(*argv, "help") == 0) usage(); - get_prefix(&filter.pfx, *argv, filter.family); + if (get_prefix(&filter.pfx, *argv, filter.family)) + invarg("to value is invalid\n", *argv); if (filter.family == AF_UNSPEC) filter.family = filter.pfx.family; } From patchwork Tue Jan 23 19:19:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864969 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VMf7tqI9"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQymw6ZPyz9s4s for ; Wed, 24 Jan 2018 06:20:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752148AbeAWTUG (ORCPT ); Tue, 23 Jan 2018 14:20:06 -0500 Received: from mail-lf0-f68.google.com ([209.85.215.68]:46430 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752058AbeAWTTo (ORCPT ); Tue, 23 Jan 2018 14:19:44 -0500 Received: by mail-lf0-f68.google.com with SMTP id q194so1995871lfe.13 for ; Tue, 23 Jan 2018 11:19:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=6fgDXHY1LCAjSMYC6OwKAZAYEOeglnLVM3sDBA4j5cE=; b=VMf7tqI9m+X6OoPY37O2I9i+X/rEX27/KIqMZRcMm9euSghZn+bwqOLBlNknKbCfPZ Ixuyj2vB9aH84i6yjIDydPM7p2aT/Hq9NsA0AjbGeoHf8VjQ1F3P9l4xAdC7+nfH/cO/ EHQ3SNI9yuMlU6vHx7W83Rb4YjShmEy2nDjbPsQioIKpUjiIC4YPt+XdQWZsEKrVquR/ J7QySpYB9KhqGPfoQ1VwpfXurWRNttNa+shPG8VZMmtWnclBAbcKHGRnhhSsop44F+on b6UGGvH6iek5FrZAlkXzm4CSskYOfHcZw/s2v4MNxrQh/JlbH7YpFQRi9fFnWTt7dTHR /vtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=6fgDXHY1LCAjSMYC6OwKAZAYEOeglnLVM3sDBA4j5cE=; b=ICvCHNcQYBhTmw9DaCPtNS+YZa9/vY6fNhn7wukndDeDGkmKC8uZ0dvMKYnYF1BS/p 2gnVxSUPH52Hbmt39TyAETXeDQxA1Guk3kPs7R6Fl/OZaZrgt9bVe3F6dWlwuV0lEElI tRvRhisnXlhQlz5KUA3EjFD7TP2zAG5AlMdSd7YI5mwaGQcOH1NploMfQ+FnhSmzecXI sUM6mGA6GKbEKRz6kdmQx8DyWn/iNQFKFRqbfpVtybxMi5s2PDprMEHl0Cbzxl7xsEST 9d1tssrais2nfa6oapXCWWDiRQezRavvhE7+oPlfzYyTxYhAeGB7b5j9EyrllpToaZH4 HacQ== X-Gm-Message-State: AKwxytdIKmiW3GLe+0T0VJ70vZusz7l7JaIdnNxFqrXS8cE40huX79+A hkxTP1cqv8fo8UGBHBqZ4zBPiQ== X-Google-Smtp-Source: AH8x225ADuKAxlaMnavthKfcDpCVBMgpvZBc2kUujsKIzjqGWNWaBjPnfSoG6DPuE3ohNXMGAv+yiQ== X-Received: by 10.46.18.217 with SMTP id 86mr1799327ljs.126.1516735182709; Tue, 23 Jan 2018 11:19:42 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.41 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:41 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 6/8] ipl2tp: Use get_addr_rta() Date: Tue, 23 Jan 2018 21:19:28 +0200 Message-Id: <1516735170-20921-7-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Serhey Popovych --- ip/ipl2tp.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c index 7c5ed31..8aaee74 100644 --- a/ip/ipl2tp.c +++ b/ip/ipl2tp.c @@ -296,7 +296,7 @@ static int get_response(struct nlmsghdr *n, void *arg) struct l2tp_data *data = arg; struct l2tp_parm *p = &data->config; struct rtattr *attrs[L2TP_ATTR_MAX + 1]; - struct rtattr *nla_stats; + struct rtattr *nla_stats, *rta; int len; /* Validate message and parse attributes */ @@ -352,30 +352,25 @@ static int get_response(struct nlmsghdr *n, void *arg) if (attrs[L2TP_ATTR_RECV_TIMEOUT]) p->reorder_timeout = rta_getattr_u64(attrs[L2TP_ATTR_RECV_TIMEOUT]); - if (attrs[L2TP_ATTR_IP_SADDR]) { - p->local_ip.family = AF_INET; - p->local_ip.data[0] = rta_getattr_u32(attrs[L2TP_ATTR_IP_SADDR]); - p->local_ip.bytelen = 4; - p->local_ip.bitlen = -1; - } - if (attrs[L2TP_ATTR_IP_DADDR]) { - p->peer_ip.family = AF_INET; - p->peer_ip.data[0] = rta_getattr_u32(attrs[L2TP_ATTR_IP_DADDR]); - p->peer_ip.bytelen = 4; - p->peer_ip.bitlen = -1; - } - if (attrs[L2TP_ATTR_IP6_SADDR]) { + + rta = attrs[L2TP_ATTR_IP_SADDR]; + p->local_ip.family = AF_INET; + if (!rta) { + rta = attrs[L2TP_ATTR_IP6_SADDR]; p->local_ip.family = AF_INET6; - memcpy(&p->local_ip.data, RTA_DATA(attrs[L2TP_ATTR_IP6_SADDR]), - p->local_ip.bytelen = 16); - p->local_ip.bitlen = -1; } - if (attrs[L2TP_ATTR_IP6_DADDR]) { + if (rta && get_addr_rta(&p->local_ip, rta, p->local_ip.family)) + return -1; + + rta = attrs[L2TP_ATTR_IP_DADDR]; + p->peer_ip.family = AF_INET; + if (!rta) { + rta = attrs[L2TP_ATTR_IP6_DADDR]; p->peer_ip.family = AF_INET6; - memcpy(&p->peer_ip.data, RTA_DATA(attrs[L2TP_ATTR_IP6_DADDR]), - p->peer_ip.bytelen = 16); - p->peer_ip.bitlen = -1; } + if (rta && get_addr_rta(&p->peer_ip, rta, p->peer_ip.family)) + return -1; + if (attrs[L2TP_ATTR_UDP_SPORT]) p->local_udp_port = rta_getattr_u16(attrs[L2TP_ATTR_UDP_SPORT]); if (attrs[L2TP_ATTR_UDP_DPORT]) From patchwork Tue Jan 23 19:19:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864966 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="IA5+Ws7P"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQymZ3x5jz9s4s for ; Wed, 24 Jan 2018 06:19:58 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752138AbeAWTT4 (ORCPT ); Tue, 23 Jan 2018 14:19:56 -0500 Received: from mail-lf0-f68.google.com ([209.85.215.68]:38246 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752064AbeAWTTp (ORCPT ); Tue, 23 Jan 2018 14:19:45 -0500 Received: by mail-lf0-f68.google.com with SMTP id g72so2020019lfg.5 for ; Tue, 23 Jan 2018 11:19:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=4hPcd8/9UHe/oyrdXENfjBzCCzA8/iTlUPg4zaoe6/Y=; b=IA5+Ws7P83v6ubMY7OALkt7P+CiU8p120U9GxKHYIpdwvUO8k595FSN308zXimP9YO Bee9i9Q39+RDU0UbomRxDMepfCuccKAyzHKUlvV/h5tTnbCrzgp+CRUwtWz6+4S2Pjnx XS5ia/otgIOc2sYBec2rr6Cfe0oyJCo4Z/5eEbCWr+W3nujlDK4MwPjXuVJOXT9iJX0z TLqBeVm1tbw5hLl8Qqn1gWjMNSDEHerirBp+UeQAX+3dDnzUxKwYMSoVlq7xQhv/jKc0 zO7FIcHuC0NJbvcHoB966NEIwwkvbsMlUPqXQMUtfVyPGMZ22hGpf9J/qz1n76J4UEI9 ayRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=4hPcd8/9UHe/oyrdXENfjBzCCzA8/iTlUPg4zaoe6/Y=; b=Dsmwynwcjp1+tdgNn7rzstv2ADXgBNinOpSqD36AyGmFRR8fI4rQfVZKot8KXX/CmC mMPWAR208cOpy7iDBx8fF+KTDE3BFsfGYMJY2OHxwAg6F+bPv9TemeeJqxpWvMvJ8g2C j3VTUr/zfl2+/94g0xb7SaeH+m326aUym99cPZQ6mIRhlCI6ovOyJ/+I6ZDNmcvBczKH wZsJWq38076LOA9bI2iYwUkIfgsvOt8qA47CT57XLG6OJD5xxIbtdwn7MVRFRBWRVQdu byvWU2gXOLLBg4mC/DrkOIXUuSsgkDDQdU4RpN5Wt06mQVpOIksHj1Od++nUiQEyT0K0 7ZgQ== X-Gm-Message-State: AKwxytdF/WItH8Mpux9FzV6kIFJFcZ4zr12pZ6Pzrirtc4ZoQVuSLmf6 pEXuQs7PxHtyu8soiw2l4M07/A== X-Google-Smtp-Source: AH8x224dEcN1poWRkRgEEu1OyJUI+3siJhl4Zeb3U6DlaJvSePUIR8kJEXazbge5GX9ql9wTzTy0BA== X-Received: by 10.46.84.9 with SMTP id i9mr1819635ljb.83.1516735183939; Tue, 23 Jan 2018 11:19:43 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.42 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:43 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 7/8] tcp_metric: Use get_addr_rta() Date: Tue, 23 Jan 2018 21:19:29 +0200 Message-Id: <1516735170-20921-8-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org While there remove & from inet_prefix.data when since it is array. Signed-off-by: Serhey Popovych --- ip/tcp_metrics.c | 60 +++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/ip/tcp_metrics.c b/ip/tcp_metrics.c index 3f9790e..7e2d9eb 100644 --- a/ip/tcp_metrics.c +++ b/ip/tcp_metrics.c @@ -96,7 +96,7 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n, struct rtattr *attrs[TCP_METRICS_ATTR_MAX + 1], *a; int len = n->nlmsg_len; inet_prefix daddr, saddr; - int family, i, atype, stype, dlen = 0, slen = 0; + int i, atype, stype; if (n->nlmsg_type != genl_family) return -1; @@ -116,61 +116,61 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n, if (f.daddr.family && f.daddr.family != AF_INET) return 0; a = attrs[TCP_METRICS_ATTR_ADDR_IPV4]; - memcpy(&daddr.data, RTA_DATA(a), 4); - daddr.bytelen = 4; - family = AF_INET; + daddr.family = AF_INET; atype = TCP_METRICS_ATTR_ADDR_IPV4; - dlen = RTA_PAYLOAD(a); } else if (attrs[TCP_METRICS_ATTR_ADDR_IPV6]) { if (f.daddr.family && f.daddr.family != AF_INET6) return 0; a = attrs[TCP_METRICS_ATTR_ADDR_IPV6]; - memcpy(&daddr.data, RTA_DATA(a), 16); - daddr.bytelen = 16; - family = AF_INET6; + daddr.family = AF_INET6; atype = TCP_METRICS_ATTR_ADDR_IPV6; - dlen = RTA_PAYLOAD(a); } else { return 0; } + if (get_addr_rta(&daddr, a, daddr.family)) + return 0; + + if (f.daddr.family && f.daddr.bitlen >= 0 && + inet_addr_match(&daddr, &f.daddr, f.daddr.bitlen)) + return 0; + if (attrs[TCP_METRICS_ATTR_SADDR_IPV4]) { if (f.saddr.family && f.saddr.family != AF_INET) return 0; a = attrs[TCP_METRICS_ATTR_SADDR_IPV4]; - memcpy(&saddr.data, RTA_DATA(a), 4); - saddr.bytelen = 4; + saddr.family = AF_INET; stype = TCP_METRICS_ATTR_SADDR_IPV4; - slen = RTA_PAYLOAD(a); } else if (attrs[TCP_METRICS_ATTR_SADDR_IPV6]) { if (f.saddr.family && f.saddr.family != AF_INET6) return 0; a = attrs[TCP_METRICS_ATTR_SADDR_IPV6]; - memcpy(&saddr.data, RTA_DATA(a), 16); - saddr.bytelen = 16; + saddr.family = AF_INET6; stype = TCP_METRICS_ATTR_SADDR_IPV6; - slen = RTA_PAYLOAD(a); + } else { + saddr.family = AF_UNSPEC; + stype = 0; } - if (f.daddr.family && f.daddr.bitlen >= 0 && - inet_addr_match(&daddr, &f.daddr, f.daddr.bitlen)) - return 0; - /* Only check for the source-address if the kernel supports it, - * meaning slen != 0. - */ - if (slen && f.saddr.family && f.saddr.bitlen >= 0 && - inet_addr_match(&saddr, &f.saddr, f.saddr.bitlen)) - return 0; + /* Only get/check for the source-address if the kernel supports it. */ + if (saddr.family) { + if (get_addr_rta(&saddr, a, saddr.family)) + return 0; + + if (f.saddr.family && f.saddr.bitlen >= 0 && + inet_addr_match(&saddr, &f.saddr, f.saddr.bitlen)) + return 0; + } if (f.flushb) { struct nlmsghdr *fn; TCPM_REQUEST(req2, 128, TCP_METRICS_CMD_DEL, NLM_F_REQUEST); - addattr_l(&req2.n, sizeof(req2), atype, &daddr.data, + addattr_l(&req2.n, sizeof(req2), atype, daddr.data, daddr.bytelen); - if (slen) - addattr_l(&req2.n, sizeof(req2), stype, &saddr.data, + if (saddr.family) + addattr_l(&req2.n, sizeof(req2), stype, saddr.data, saddr.bytelen); if (NLMSG_ALIGN(f.flushp) + req2.n.nlmsg_len > f.flushe) { @@ -190,7 +190,7 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n, fprintf(fp, "Deleted "); fprintf(fp, "%s", - format_host(family, dlen, &daddr.data)); + format_host(daddr.family, daddr.bytelen, daddr.data)); a = attrs[TCP_METRICS_ATTR_AGE]; if (a) { @@ -292,9 +292,9 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n, fprintf(fp, " fo_cookie %s", cookie); } - if (slen) { + if (saddr.family) { fprintf(fp, " source %s", - format_host(family, slen, &saddr.data)); + format_host(saddr.family, saddr.bytelen, saddr.data)); } fprintf(fp, "\n"); From patchwork Tue Jan 23 19:19:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 864965 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="eI5cools"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zQymR3tt3z9s4s for ; Wed, 24 Jan 2018 06:19:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752123AbeAWTTu (ORCPT ); Tue, 23 Jan 2018 14:19:50 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:38246 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751998AbeAWTTr (ORCPT ); Tue, 23 Jan 2018 14:19:47 -0500 Received: by mail-lf0-f66.google.com with SMTP id g72so2020093lfg.5 for ; Tue, 23 Jan 2018 11:19:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=6KwVT0gnD1r0iUVUkWUISB+Z3xYe7KvzxL4yqu5E2Pk=; b=eI5coolsdnqgCF9NFmen7SzagmAqSsS+gjK//HJaUWtAXX1Qydw3AYyckHWtNMm12q D8PG6LywC6Aqnvr6a7exvzXMz5PpJC+/u3ljs60Yfxg9GoNbtxq1uRIsCIkTAcJQ2H8u hxVFWQX7KtfENv1AyP3/kpJTJ0RkAlXRKZ6RPJj6/KJTUHh/HxkBPPbgZk6hESLGiB/A KN7WY1Ui9YLGAojuDfOKTsIujdb1lvp1+Y1hXwUundUOXK7Xft346F9/np9LdibDe+id mGvBccHJ4qQ61G2T4fgMt3FATbAom/yJQNPU2bv+evNOnLEeqI3ZWqvyAVMN5bqo3a8H FiHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=6KwVT0gnD1r0iUVUkWUISB+Z3xYe7KvzxL4yqu5E2Pk=; b=F7tSMk35zzpkGUhbfBwOlzmby2tdPO/YgVsdAo8OK0ofSs7dqO4jEiKyuUvsKY0vkh ysYlb4lBxob3dYGX7ZY6yd8w+664ophBgITGlOuhZ82XMauNH3hmuZzkztcRCBkTkq8A lqGBJILiF274FN2l2fpL0+PM+HhtIT5be2QypelY21X5Jj1b7Gi5Oq5N5KKYqHy1aj8w 8LYZ/gTxSWXYLD+ayHtJdK7MDeWUVqZf3wa3W8/kHxxo8UurtV1ZK+CltNyJ3T4hpMki 7CTlhBlKzXo8F0XD9zkbewgalqX2gXBsE5IigiofpkBvFCKYgelItpeLVlE+GTMLvC1k olfg== X-Gm-Message-State: AKwxyte5GseHQsIhcdNNm5H+Gof5V0R+pIlB+kQC4Mtd4gOa3Gwj/JcM r6Y6pgUrLY79EOpOBBiEUeFB1g== X-Google-Smtp-Source: AH8x226VkuDZlKKs6erq6+bUa/39eEi8La7Fzx8oq6st64sNfGBNjV9Lph2AWQTTtj64xjAGyMW10g== X-Received: by 10.46.67.6 with SMTP id q6mr1758936lja.16.1516735185206; Tue, 23 Jan 2018 11:19:45 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id u87sm162394lfk.8.2018.01.23.11.19.43 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 11:19:44 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 8/8] ip/tunnel: Unify local/remote endpoint address printing Date: Tue, 23 Jan 2018 21:19:30 +0200 Message-Id: <1516735170-20921-9-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> References: <1516735170-20921-1-git-send-email-serhe.popovych@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Introduce and use tnl_print_endpoint() helper to print of tunnel endpoint address. Note that for AF_INET and AF_INET6 inet_ntop(3) is used that may return NULL in case of failure and while unlikely format_host_rta() might return NULL too. Handle this case when passing local/remote to print_string(). Signed-off-by: Serhey Popovych --- ip/link_gre.c | 21 ++------------------- ip/link_gre6.c | 26 ++------------------------ ip/link_ip6tnl.c | 15 ++------------- ip/link_iptnl.c | 21 ++------------------- ip/link_vti.c | 21 ++------------------- ip/link_vti6.c | 21 ++------------------- ip/tunnel.c | 27 +++++++++++++++++++++++++++ ip/tunnel.h | 2 ++ 8 files changed, 41 insertions(+), 113 deletions(-) diff --git a/ip/link_gre.c b/ip/link_gre.c index a430ab8..6b2c49d 100644 --- a/ip/link_gre.c +++ b/ip/link_gre.c @@ -398,30 +398,13 @@ get_failed: static void gre_print_direct_opt(FILE *f, struct rtattr *tb[]) { char s2[64]; - const char *local = "any"; - const char *remote = "any"; unsigned int iflags = 0; unsigned int oflags = 0; __u8 ttl = 0; __u8 tos = 0; - if (tb[IFLA_GRE_REMOTE]) { - unsigned int addr = rta_getattr_u32(tb[IFLA_GRE_REMOTE]); - - if (addr) - remote = format_host(AF_INET, 4, &addr); - } - - print_string(PRINT_ANY, "remote", "remote %s ", remote); - - if (tb[IFLA_GRE_LOCAL]) { - unsigned int addr = rta_getattr_u32(tb[IFLA_GRE_LOCAL]); - - if (addr) - local = format_host(AF_INET, 4, &addr); - } - - print_string(PRINT_ANY, "local", "local %s ", local); + tnl_print_endpoint("remote", tb[IFLA_GRE_REMOTE], AF_INET); + tnl_print_endpoint("local", tb[IFLA_GRE_LOCAL], AF_INET); if (tb[IFLA_GRE_LINK]) { unsigned int link = rta_getattr_u32(tb[IFLA_GRE_LINK]); diff --git a/ip/link_gre6.c b/ip/link_gre6.c index 5f465fe..78e7a91 100644 --- a/ip/link_gre6.c +++ b/ip/link_gre6.c @@ -425,13 +425,10 @@ get_failed: static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) { char s2[64]; - const char *local = "any"; - const char *remote = "any"; unsigned int iflags = 0; unsigned int oflags = 0; unsigned int flags = 0; __u32 flowinfo = 0; - struct in6_addr in6_addr_any = IN6ADDR_ANY_INIT; __u8 ttl = 0; if (!tb) @@ -448,27 +445,8 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) if (tb[IFLA_GRE_FLOWINFO]) flowinfo = rta_getattr_u32(tb[IFLA_GRE_FLOWINFO]); - if (tb[IFLA_GRE_REMOTE]) { - struct in6_addr addr; - - memcpy(&addr, RTA_DATA(tb[IFLA_GRE_REMOTE]), sizeof(addr)); - - if (memcmp(&addr, &in6_addr_any, sizeof(addr))) - remote = format_host(AF_INET6, sizeof(addr), &addr); - } - - print_string(PRINT_ANY, "remote", "remote %s ", remote); - - if (tb[IFLA_GRE_LOCAL]) { - struct in6_addr addr; - - memcpy(&addr, RTA_DATA(tb[IFLA_GRE_LOCAL]), sizeof(addr)); - - if (memcmp(&addr, &in6_addr_any, sizeof(addr))) - local = format_host(AF_INET6, sizeof(addr), &addr); - } - - print_string(PRINT_ANY, "local", "local %s ", local); + tnl_print_endpoint("remote", tb[IFLA_GRE_REMOTE], AF_INET6); + tnl_print_endpoint("local", tb[IFLA_GRE_LOCAL], AF_INET6); if (tb[IFLA_GRE_LINK]) { unsigned int link = rta_getattr_u32(tb[IFLA_GRE_LINK]); diff --git a/ip/link_ip6tnl.c b/ip/link_ip6tnl.c index 8f5c9bd..562ef7d 100644 --- a/ip/link_ip6tnl.c +++ b/ip/link_ip6tnl.c @@ -364,19 +364,8 @@ static void ip6tunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb } } - if (tb[IFLA_IPTUN_REMOTE]) { - print_string(PRINT_ANY, - "remote", - "remote %s ", - rt_addr_n2a_rta(AF_INET6, tb[IFLA_IPTUN_REMOTE])); - } - - if (tb[IFLA_IPTUN_LOCAL]) { - print_string(PRINT_ANY, - "local", - "local %s ", - rt_addr_n2a_rta(AF_INET6, tb[IFLA_IPTUN_LOCAL])); - } + tnl_print_endpoint("remote", tb[IFLA_IPTUN_REMOTE], AF_INET6); + tnl_print_endpoint("local", tb[IFLA_IPTUN_LOCAL], AF_INET6); if (tb[IFLA_IPTUN_LINK]) { unsigned int link = rta_getattr_u32(tb[IFLA_IPTUN_LINK]); diff --git a/ip/link_iptnl.c b/ip/link_iptnl.c index ce3855c..eb0a9f4 100644 --- a/ip/link_iptnl.c +++ b/ip/link_iptnl.c @@ -361,8 +361,6 @@ get_failed: static void iptunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) { char s2[64]; - const char *local = "any"; - const char *remote = "any"; __u16 prefixlen; __u8 ttl = 0; __u8 tos = 0; @@ -390,23 +388,8 @@ static void iptunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[ } } - if (tb[IFLA_IPTUN_REMOTE]) { - unsigned int addr = rta_getattr_u32(tb[IFLA_IPTUN_REMOTE]); - - if (addr) - remote = format_host(AF_INET, 4, &addr); - } - - print_string(PRINT_ANY, "remote", "remote %s ", remote); - - if (tb[IFLA_IPTUN_LOCAL]) { - unsigned int addr = rta_getattr_u32(tb[IFLA_IPTUN_LOCAL]); - - if (addr) - local = format_host(AF_INET, 4, &addr); - } - - print_string(PRINT_ANY, "local", "local %s ", local); + tnl_print_endpoint("remote", tb[IFLA_IPTUN_REMOTE], AF_INET); + tnl_print_endpoint("local", tb[IFLA_IPTUN_LOCAL], AF_INET); if (tb[IFLA_IPTUN_LINK]) { unsigned int link = rta_getattr_u32(tb[IFLA_IPTUN_LINK]); diff --git a/ip/link_vti.c b/ip/link_vti.c index 1439e53..f756140 100644 --- a/ip/link_vti.c +++ b/ip/link_vti.c @@ -165,30 +165,13 @@ get_failed: static void vti_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) { - const char *local = "any"; - const char *remote = "any"; char s2[64]; if (!tb) return; - if (tb[IFLA_VTI_REMOTE]) { - unsigned int addr = rta_getattr_u32(tb[IFLA_VTI_REMOTE]); - - if (addr) - remote = format_host(AF_INET, 4, &addr); - } - - print_string(PRINT_ANY, "remote", "remote %s ", remote); - - if (tb[IFLA_VTI_LOCAL]) { - unsigned int addr = rta_getattr_u32(tb[IFLA_VTI_LOCAL]); - - if (addr) - local = format_host(AF_INET, 4, &addr); - } - - print_string(PRINT_ANY, "local", "local %s ", local); + tnl_print_endpoint("remote", tb[IFLA_VTI_REMOTE], AF_INET); + tnl_print_endpoint("local", tb[IFLA_VTI_LOCAL], AF_INET); if (tb[IFLA_VTI_LINK]) { unsigned int link = rta_getattr_u32(tb[IFLA_VTI_LINK]); diff --git a/ip/link_vti6.c b/ip/link_vti6.c index 2a86d59..d786e8c 100644 --- a/ip/link_vti6.c +++ b/ip/link_vti6.c @@ -169,30 +169,13 @@ get_failed: static void vti6_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) { - const char *local = "any"; - const char *remote = "any"; - struct in6_addr saddr; - struct in6_addr daddr; char s2[64]; if (!tb) return; - if (tb[IFLA_VTI_REMOTE]) { - memcpy(&daddr, RTA_DATA(tb[IFLA_VTI_REMOTE]), sizeof(daddr)); - - remote = format_host(AF_INET6, 16, &daddr); - } - - print_string(PRINT_ANY, "remote", "remote %s ", remote); - - if (tb[IFLA_VTI_LOCAL]) { - memcpy(&saddr, RTA_DATA(tb[IFLA_VTI_LOCAL]), sizeof(saddr)); - - local = format_host(AF_INET6, 16, &saddr); - } - - print_string(PRINT_ANY, "local", "local %s ", local); + tnl_print_endpoint("remote", tb[IFLA_VTI_REMOTE], AF_INET6); + tnl_print_endpoint("local", tb[IFLA_VTI_LOCAL], AF_INET6); if (tb[IFLA_VTI_LINK]) { unsigned int link = rta_getattr_u32(tb[IFLA_VTI_LINK]); diff --git a/ip/tunnel.c b/ip/tunnel.c index 0414804..39f22df 100644 --- a/ip/tunnel.c +++ b/ip/tunnel.c @@ -280,6 +280,33 @@ void tnl_print_encap(struct rtattr *tb[], } } +void tnl_print_endpoint(const char *name, const struct rtattr *rta, int family) +{ + const char *value; + inet_prefix dst; + + if (!rta) { + value = "any"; + } else if (get_addr_rta(&dst, rta, family)) { + value = "unknown"; + } else if (dst.flags & ADDRTYPE_UNSPEC) { + value = "any"; + } else { + value = format_host(family, dst.bytelen, dst.data); + if (!value) + value = "unknown"; + } + + if (is_json_context()) { + print_string(PRINT_JSON, name, NULL, value); + } else { + SPRINT_BUF(b1); + + snprintf(b1, sizeof(b1), "%s %%s ", name); + print_string(PRINT_FP, NULL, b1, value); + } +} + /* tnl_print_stats - print tunnel statistics * * @buf - tunnel interface's line in /proc/net/dev, diff --git a/ip/tunnel.h b/ip/tunnel.h index a5c537c..5bd27c3 100644 --- a/ip/tunnel.h +++ b/ip/tunnel.h @@ -37,6 +37,8 @@ __be32 tnl_parse_key(const char *name, const char *key); void tnl_print_encap(struct rtattr *tb[], int encap_type, int encap_flags, int encap_sport, int encap_dport); +void tnl_print_endpoint(const char *name, + const struct rtattr *rta, int family); void tnl_print_stats(const char *buf); #endif