From patchwork Mon Feb 12 20:17:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 872364 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="tfR9fOUz"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zgH6b5x2Yz9sRm for ; Tue, 13 Feb 2018 07:18:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752319AbeBLUSN (ORCPT ); Mon, 12 Feb 2018 15:18:13 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:37399 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752972AbeBLUSL (ORCPT ); Mon, 12 Feb 2018 15:18:11 -0500 Received: by mail-lf0-f66.google.com with SMTP id f137so22113013lfe.4 for ; Mon, 12 Feb 2018 12:18:10 -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=JaRLeDLD3b9JRyL7EeDUKN69L0AplSbUvqddaZk/fWY=; b=tfR9fOUzxoqIV1CNSwAACG3g8ADtUiKSnN2XltWJWCtPNDzeBO3Wj3v5faMveFERif HGxnS078bg24DIRuH6kN2Me15LbkAKZtYBmNejQuCrOcWbyDrjRtfBcfLD57np79CGPu 3i3/f/unjWqiKH8NYrCIqYtaRa7/EBOpMwSYTeJWNkWmejHxbK2JzyXqAhGMt2u4YB6K TEBdzLPHtMdMx7+9/fIztBrzT+jkBJWmXYXhPl1RGCtNeOf6z5meRKQhS9KaAFoLQdvx uNt3zp/3v/fjW9yXitQNePoKpnYayTjI3y21gzal5MC/6GJjlDd+1/SvqqqOtelZllI2 8F8g== 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=JaRLeDLD3b9JRyL7EeDUKN69L0AplSbUvqddaZk/fWY=; b=assNkOMghxB3j52CoHZxCkmz8pjFEWi7vs5z5uxZ7kB3BA4cXaT9KzovHnIoDgn2DC EhRwd65N/m3/kd7RLURzhjjeWiE/4X18omnSfINv4C0aknuWfKhzrFbwlllQED28SqLJ 0AzWCu9VlbdvQxdvBKQ94QaRUWszam2/6OLkxufUAM5+Xq2Sa+dcVw9H8y8iGNu6bKni 01N8YK9B2Rh+P2ViO09X/zT2nG3YG7LMzges/LU4zsniWLLZN9yvsH1GKYxur+IHZpZu x3aH9MNo4DSm0mOcicDRJ6S19EALEiA9B/rll+UGNTgFvj2J4jiT+lFT1uWqVx6j+hvu LqZA== X-Gm-Message-State: APf1xPBtnwTY8enugqkc3rCW1OTS61uIXo2kjbQbhVZhajGThP4q4FgC 09m35xVBHF4jfFv9kyl4GoPntA== X-Google-Smtp-Source: AH8x224B1dtbTCIg3HyJumAvYfHKobPL5TuhylUlBgfvEUaZ8G9mo5KrDpfrgXLj2yBxRntwWOL5cw== X-Received: by 10.25.211.206 with SMTP id k197mr7724004lfg.93.1518466689250; Mon, 12 Feb 2018 12:18:09 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id f199sm230269lfg.44.2018.02.12.12.18.08 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Feb 2018 12:18:08 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v3 3/4] gre/gre6: Unify local/remote endpoint address parsing Date: Mon, 12 Feb 2018 22:17:58 +0200 Message-Id: <1518466679-3605-4-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1518466679-3605-1-git-send-email-serhe.popovych@gmail.com> References: <1518466679-3605-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 We are going to merge link_gre.c and link_gre6.c and this is final step to make their diffs clear and show what needs to be changed during merge. Note that it is safe to omit endpoint address(es) from netlink create request as kernel is aware of such case and will use zero for that endpoint(s). Signed-off-by: Serhey Popovych --- ip/link_gre.c | 57 +++++++++++++++++++++++++++++++++----------------------- ip/link_gre6.c | 38 +++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/ip/link_gre.c b/ip/link_gre.c index e3e5323..64588d7 100644 --- a/ip/link_gre.c +++ b/ip/link_gre.c @@ -86,8 +86,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, __u16 oflags = 0; __be32 ikey = 0; __be32 okey = 0; - unsigned int saddr = 0; - unsigned int daddr = 0; + inet_prefix saddr, daddr; __u8 pmtudisc = 1; __u8 ignore_df = 0; __u8 tos = 0; @@ -104,7 +103,12 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, __u8 erspan_dir = 0; __u16 erspan_hwid = 0; + inet_prefix_reset(&saddr); + inet_prefix_reset(&daddr); + if (!(n->nlmsg_flags & NLM_F_CREATE)) { + const struct rtattr *rta; + if (rtnl_talk(&rth, &req.n, &answer) < 0) { get_failed: fprintf(stderr, @@ -130,6 +134,14 @@ get_failed: parse_rtattr_nested(greinfo, IFLA_GRE_MAX, linkinfo[IFLA_INFO_DATA]); + rta = greinfo[IFLA_GRE_LOCAL]; + if (rta && get_addr_rta(&saddr, rta, AF_INET)) + goto get_failed; + + rta = greinfo[IFLA_GRE_REMOTE]; + if (rta && get_addr_rta(&daddr, rta, AF_INET)) + goto get_failed; + if (greinfo[IFLA_GRE_IKEY]) ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]); @@ -142,12 +154,6 @@ get_failed: if (greinfo[IFLA_GRE_OFLAGS]) oflags = rta_getattr_u16(greinfo[IFLA_GRE_OFLAGS]); - if (greinfo[IFLA_GRE_LOCAL]) - saddr = rta_getattr_u32(greinfo[IFLA_GRE_LOCAL]); - - if (greinfo[IFLA_GRE_REMOTE]) - daddr = rta_getattr_u32(greinfo[IFLA_GRE_REMOTE]); - if (greinfo[IFLA_GRE_PMTUDISC]) pmtudisc = rta_getattr_u8( greinfo[IFLA_GRE_PMTUDISC]); @@ -232,10 +238,10 @@ get_failed: pmtudisc = 1; } else if (!matches(*argv, "remote")) { NEXT_ARG(); - daddr = get_addr32(*argv); + get_addr(&daddr, *argv, AF_INET); } else if (!matches(*argv, "local")) { NEXT_ARG(); - saddr = get_addr32(*argv); + get_addr(&saddr, *argv, AF_INET); } else if (!matches(*argv, "dev")) { NEXT_ARG(); link = ll_name_to_index(*argv); @@ -343,17 +349,20 @@ get_failed: argc--; argv++; } - if (!ikey && IN_MULTICAST(ntohl(daddr))) { - ikey = daddr; - iflags |= GRE_KEY; - } - if (!okey && IN_MULTICAST(ntohl(daddr))) { - okey = daddr; - oflags |= GRE_KEY; - } - if (IN_MULTICAST(ntohl(daddr)) && !saddr) { - fprintf(stderr, "A broadcast tunnel requires a source address.\n"); - return -1; + if (is_addrtype_inet_multi(&daddr)) { + if (!ikey) { + ikey = daddr.data[0]; + iflags |= GRE_KEY; + } + if (!okey) { + okey = daddr.data[0]; + oflags |= GRE_KEY; + } + if (!is_addrtype_inet_not_unspec(&saddr)) { + fprintf(stderr, + "A broadcast tunnel requires a source address.\n"); + return -1; + } } if (metadata) { @@ -365,8 +374,10 @@ get_failed: addattr32(n, 1024, IFLA_GRE_OKEY, okey); addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2); addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2); - addattr_l(n, 1024, IFLA_GRE_LOCAL, &saddr, 4); - addattr_l(n, 1024, IFLA_GRE_REMOTE, &daddr, 4); + if (is_addrtype_inet(&saddr)) + addattr_l(n, 1024, IFLA_GRE_LOCAL, saddr.data, saddr.bytelen); + if (is_addrtype_inet(&daddr)) + addattr_l(n, 1024, IFLA_GRE_REMOTE, daddr.data, daddr.bytelen); addattr_l(n, 1024, IFLA_GRE_PMTUDISC, &pmtudisc, 1); if (ignore_df) addattr8(n, 1024, IFLA_GRE_IGNORE_DF, ignore_df & 1); diff --git a/ip/link_gre6.c b/ip/link_gre6.c index 251ae0e..6c77038 100644 --- a/ip/link_gre6.c +++ b/ip/link_gre6.c @@ -97,8 +97,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, __u16 oflags = 0; __be32 ikey = 0; __be32 okey = 0; - struct in6_addr raddr = IN6ADDR_ANY_INIT; - struct in6_addr laddr = IN6ADDR_ANY_INIT; + inet_prefix saddr, daddr; __u8 hop_limit = DEFAULT_TNL_HOP_LIMIT; __u8 encap_limit = IPV6_DEFAULT_TNL_ENCAP_LIMIT; __u32 flowinfo = 0; @@ -115,7 +114,12 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, __u8 erspan_dir = 0; __u16 erspan_hwid = 0; + inet_prefix_reset(&saddr); + inet_prefix_reset(&daddr); + if (!(n->nlmsg_flags & NLM_F_CREATE)) { + const struct rtattr *rta; + if (rtnl_talk(&rth, &req.n, &answer) < 0) { get_failed: fprintf(stderr, @@ -141,6 +145,14 @@ get_failed: parse_rtattr_nested(greinfo, IFLA_GRE_MAX, linkinfo[IFLA_INFO_DATA]); + rta = greinfo[IFLA_GRE_LOCAL]; + if (rta && get_addr_rta(&saddr, rta, AF_INET6)) + goto get_failed; + + rta = greinfo[IFLA_GRE_REMOTE]; + if (rta && get_addr_rta(&daddr, rta, AF_INET6)) + goto get_failed; + if (greinfo[IFLA_GRE_IKEY]) ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]); @@ -153,12 +165,6 @@ get_failed: if (greinfo[IFLA_GRE_OFLAGS]) oflags = rta_getattr_u16(greinfo[IFLA_GRE_OFLAGS]); - if (greinfo[IFLA_GRE_LOCAL]) - memcpy(&laddr, RTA_DATA(greinfo[IFLA_GRE_LOCAL]), sizeof(laddr)); - - if (greinfo[IFLA_GRE_REMOTE]) - memcpy(&raddr, RTA_DATA(greinfo[IFLA_GRE_REMOTE]), sizeof(raddr)); - if (greinfo[IFLA_GRE_TTL]) hop_limit = rta_getattr_u8(greinfo[IFLA_GRE_TTL]); @@ -236,17 +242,11 @@ get_failed: } else if (!matches(*argv, "ocsum")) { oflags |= GRE_CSUM; } else if (!matches(*argv, "remote")) { - inet_prefix addr; - NEXT_ARG(); - get_addr(&addr, *argv, AF_INET6); - memcpy(&raddr, &addr.data, sizeof(raddr)); + get_addr(&daddr, *argv, AF_INET6); } else if (!matches(*argv, "local")) { - inet_prefix addr; - NEXT_ARG(); - get_addr(&addr, *argv, AF_INET6); - memcpy(&laddr, &addr.data, sizeof(laddr)); + get_addr(&saddr, *argv, AF_INET6); } else if (!matches(*argv, "dev")) { NEXT_ARG(); link = ll_name_to_index(*argv); @@ -398,8 +398,10 @@ get_failed: addattr32(n, 1024, IFLA_GRE_OKEY, okey); addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2); addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2); - addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr)); - addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr)); + if (is_addrtype_inet(&saddr)) + addattr_l(n, 1024, IFLA_GRE_LOCAL, saddr.data, saddr.bytelen); + if (is_addrtype_inet(&daddr)) + addattr_l(n, 1024, IFLA_GRE_REMOTE, daddr.data, daddr.bytelen); if (link) addattr32(n, 1024, IFLA_GRE_LINK, link); addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1);