From patchwork Sun Feb 11 20:02:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Serhey Popovych X-Patchwork-Id: 871793 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="aC+hMJ9f"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zffqP3DVfz9t3m for ; Mon, 12 Feb 2018 07:02:57 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932093AbeBKUCm (ORCPT ); Sun, 11 Feb 2018 15:02:42 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:45611 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753587AbeBKUCl (ORCPT ); Sun, 11 Feb 2018 15:02:41 -0500 Received: by mail-lf0-f66.google.com with SMTP id x196so17751184lfd.12 for ; Sun, 11 Feb 2018 12:02: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=pgRhqW9l+PZabQRIN7KivYsFPfezJCJx/VhCDN7pmQk=; b=aC+hMJ9fxV2wcSBoeWThb/WMMa0j28VNvIZQye4+bmH4tS2H5Ai+Pt5eXEBhbJJoxL o6eTfVPe4jvdxENmBZUV3E9PiyQiVwh8STvXwS/TfE+5ZEQUn+KcIU4WOCDmYlQ8z/B5 dBwAYswu+CxZ2Q4IZgSrzWAr0yC0VRj/sex4qGQHWcdN0bJGc6fjyuu2757eFvOE7wal S3vCG2P8p8mZkEFgFDTAb9+RGkrUv2q/JYZTr+eyCdXyVurkSm2/Fqavcy10FvUQIufZ lVTrhOFr5aERZj4BrRUpRFSZkO2ZSJ/3w0gua64YkocTKMALS6JhLIxnieaUgIWV3+O4 KYFQ== 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=pgRhqW9l+PZabQRIN7KivYsFPfezJCJx/VhCDN7pmQk=; b=BhmnYPGJGhuekbN/J5udb0XHYGM/GpjAZXRCKpZCmC0mPq56SNqwUlt3WcSD8dlHf/ mfFNzamuCNt/ZhXU7dKnPjflIMiv3mxyBsv4BWQNRcLZskXEEddtfrsC76Mp6nMp8pH9 7x+MGSmFV1pBa8Fpj55btx/kXSSBEl3gSEYEo5JmsQnODNjc3LXS39+TFwRiDFVWemWs 0q4wzmnQvnBfXfcjtP+GbCSmopRRL+tipEvpzcOv2S16boXumKfQPTh/p2icrvpUt2xX ya3Hme50whKB34IwqsPFCiIYw04cW1NbEm4rUOD+2oKjFB4HREHkT7OSPnhiSICB/HzQ HvQg== X-Gm-Message-State: APf1xPAViH2mbUffadQSFJqk3ASGYS95hRV2ZtWSFDlZW4lTaAd0AR40 ZKt9dEMuILc2d64W2SVc1dRAzQ== X-Google-Smtp-Source: AH8x224tc2rDVSwI4WZUcuLG76kcaW4PdV8iS8pIhr+GYc318imVeRxR5a9zkBxm793UFJ1yp3znVQ== X-Received: by 10.46.95.74 with SMTP id t71mr6102721ljb.59.1518379359289; Sun, 11 Feb 2018 12:02:39 -0800 (PST) Received: from tuxracer.localdomain ([2a01:6d80::195:20:96:53]) by smtp.gmail.com with ESMTPSA id s20sm1283327ljd.79.2018.02.11.12.02.37 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Feb 2018 12:02:37 -0800 (PST) From: Serhey Popovych To: netdev@vger.kernel.org Subject: [PATCH iproute2-next v2 2/4] vti/vti6: Unify local/remote endpoint address parsing Date: Sun, 11 Feb 2018 22:02:31 +0200 Message-Id: <1518379353-31995-3-git-send-email-serhe.popovych@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1518379353-31995-1-git-send-email-serhe.popovych@gmail.com> References: <1518379353-31995-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_vti.c and link_vti6.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_vti.c | 32 ++++++++++++++++++++------------ ip/link_vti6.c | 38 ++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/ip/link_vti.c b/ip/link_vti.c index edd17fe..125fc20 100644 --- a/ip/link_vti.c +++ b/ip/link_vti.c @@ -64,13 +64,17 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv, struct rtattr *vtiinfo[IFLA_VTI_MAX + 1]; __be32 ikey = 0; __be32 okey = 0; - unsigned int saddr = 0; - unsigned int daddr = 0; + inet_prefix saddr, daddr; unsigned int link = 0; __u32 fwmark = 0; int len; + inet_prefix_reset_flags(&saddr); + inet_prefix_reset_flags(&daddr); + if (!(n->nlmsg_flags & NLM_F_CREATE)) { + const struct rtattr *rta; + if (rtnl_talk(&rth, &req.n, &answer) < 0) { get_failed: fprintf(stderr, @@ -96,18 +100,20 @@ get_failed: parse_rtattr_nested(vtiinfo, IFLA_VTI_MAX, linkinfo[IFLA_INFO_DATA]); + rta = vtiinfo[IFLA_VTI_LOCAL]; + if (rta && get_addr_rta(&saddr, rta, AF_INET)) + goto get_failed; + + rta = vtiinfo[IFLA_VTI_REMOTE]; + if (rta && get_addr_rta(&daddr, rta, AF_INET)) + goto get_failed; + if (vtiinfo[IFLA_VTI_IKEY]) ikey = rta_getattr_u32(vtiinfo[IFLA_VTI_IKEY]); if (vtiinfo[IFLA_VTI_OKEY]) okey = rta_getattr_u32(vtiinfo[IFLA_VTI_OKEY]); - if (vtiinfo[IFLA_VTI_LOCAL]) - saddr = rta_getattr_u32(vtiinfo[IFLA_VTI_LOCAL]); - - if (vtiinfo[IFLA_VTI_REMOTE]) - daddr = rta_getattr_u32(vtiinfo[IFLA_VTI_REMOTE]); - if (vtiinfo[IFLA_VTI_LINK]) link = rta_getattr_u8(vtiinfo[IFLA_VTI_LINK]); @@ -129,10 +135,10 @@ get_failed: okey = tnl_parse_key("okey", *argv); } 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); @@ -154,8 +160,10 @@ get_failed: addattr32(n, 1024, IFLA_VTI_IKEY, ikey); addattr32(n, 1024, IFLA_VTI_OKEY, okey); - addattr_l(n, 1024, IFLA_VTI_LOCAL, &saddr, 4); - addattr_l(n, 1024, IFLA_VTI_REMOTE, &daddr, 4); + if (is_addrtype_inet(&saddr)) + addattr_l(n, 1024, IFLA_VTI_LOCAL, saddr.data, saddr.bytelen); + if (is_addrtype_inet(&daddr)) + addattr_l(n, 1024, IFLA_VTI_REMOTE, daddr.data, daddr.bytelen); addattr32(n, 1024, IFLA_VTI_FWMARK, fwmark); if (link) addattr32(n, 1024, IFLA_VTI_LINK, link); diff --git a/ip/link_vti6.c b/ip/link_vti6.c index 1276ebd..9f2c6ac 100644 --- a/ip/link_vti6.c +++ b/ip/link_vti6.c @@ -64,15 +64,19 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv, struct rtattr *tb[IFLA_MAX + 1]; struct rtattr *linkinfo[IFLA_INFO_MAX+1]; struct rtattr *vtiinfo[IFLA_VTI_MAX + 1]; - struct in6_addr saddr = IN6ADDR_ANY_INIT; - struct in6_addr daddr = IN6ADDR_ANY_INIT; __be32 ikey = 0; __be32 okey = 0; + inet_prefix saddr, daddr; unsigned int link = 0; __u32 fwmark = 0; int len; + inet_prefix_reset_flags(&saddr); + inet_prefix_reset_flags(&daddr); + if (!(n->nlmsg_flags & NLM_F_CREATE)) { + const struct rtattr *rta; + if (rtnl_talk(&rth, &req.n, &answer) < 0) { get_failed: fprintf(stderr, @@ -98,18 +102,20 @@ get_failed: parse_rtattr_nested(vtiinfo, IFLA_VTI_MAX, linkinfo[IFLA_INFO_DATA]); + rta = vtiinfo[IFLA_VTI_LOCAL]; + if (rta && get_addr_rta(&saddr, rta, AF_INET6)) + goto get_failed; + + rta = vtiinfo[IFLA_VTI_REMOTE]; + if (rta && get_addr_rta(&daddr, rta, AF_INET6)) + goto get_failed; + if (vtiinfo[IFLA_VTI_IKEY]) ikey = rta_getattr_u32(vtiinfo[IFLA_VTI_IKEY]); if (vtiinfo[IFLA_VTI_OKEY]) okey = rta_getattr_u32(vtiinfo[IFLA_VTI_OKEY]); - if (vtiinfo[IFLA_VTI_LOCAL]) - memcpy(&saddr, RTA_DATA(vtiinfo[IFLA_VTI_LOCAL]), sizeof(saddr)); - - if (vtiinfo[IFLA_VTI_REMOTE]) - memcpy(&daddr, RTA_DATA(vtiinfo[IFLA_VTI_REMOTE]), sizeof(daddr)); - if (vtiinfo[IFLA_VTI_LINK]) link = rta_getattr_u8(vtiinfo[IFLA_VTI_LINK]); @@ -130,17 +136,11 @@ get_failed: NEXT_ARG(); okey = tnl_parse_key("okey", *argv); } else if (!matches(*argv, "remote")) { - inet_prefix addr; - NEXT_ARG(); - get_addr(&addr, *argv, AF_INET6); - memcpy(&daddr, addr.data, sizeof(daddr)); + get_addr(&daddr, *argv, AF_INET6); } else if (!matches(*argv, "local")) { - inet_prefix addr; - NEXT_ARG(); - get_addr(&addr, *argv, AF_INET6); - memcpy(&saddr, addr.data, sizeof(saddr)); + get_addr(&saddr, *argv, AF_INET6); } else if (!matches(*argv, "dev")) { NEXT_ARG(); link = ll_name_to_index(*argv); @@ -162,8 +162,10 @@ get_failed: addattr32(n, 1024, IFLA_VTI_IKEY, ikey); addattr32(n, 1024, IFLA_VTI_OKEY, okey); - addattr_l(n, 1024, IFLA_VTI_LOCAL, &saddr, sizeof(saddr)); - addattr_l(n, 1024, IFLA_VTI_REMOTE, &daddr, sizeof(daddr)); + if (is_addrtype_inet(&saddr)) + addattr_l(n, 1024, IFLA_VTI_LOCAL, saddr.data, saddr.bytelen); + if (is_addrtype_inet(&daddr)) + addattr_l(n, 1024, IFLA_VTI_REMOTE, daddr.data, daddr.bytelen); addattr32(n, 1024, IFLA_VTI_FWMARK, fwmark); if (link) addattr32(n, 1024, IFLA_VTI_LINK, link);