{"id":811338,"url":"http://patchwork.ozlabs.org/api/patches/811338/?format=json","web_url":"http://patchwork.ozlabs.org/project/ubuntu-kernel/patch/20170908070018.4141-6-daniel.axtens@canonical.com/","project":{"id":15,"url":"http://patchwork.ozlabs.org/api/projects/15/?format=json","name":"Ubuntu Kernel","link_name":"ubuntu-kernel","list_id":"kernel-team.lists.ubuntu.com","list_email":"kernel-team@lists.ubuntu.com","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170908070018.4141-6-daniel.axtens@canonical.com>","list_archive_url":null,"date":"2017-09-08T07:00:16","name":"[SRU,Zesty,5/7] net: add confirm_neigh method to dst_ops","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"0e3938baaf0d5f48c158f32b82c1af709dafcb51","submitter":{"id":71548,"url":"http://patchwork.ozlabs.org/api/people/71548/?format=json","name":"Daniel Axtens","email":"daniel.axtens@canonical.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/ubuntu-kernel/patch/20170908070018.4141-6-daniel.axtens@canonical.com/mbox/","series":[{"id":2111,"url":"http://patchwork.ozlabs.org/api/series/2111/?format=json","web_url":"http://patchwork.ozlabs.org/project/ubuntu-kernel/list/?series=2111","date":"2017-09-08T07:00:11","name":"Fixes for LP#1715812","version":1,"mbox":"http://patchwork.ozlabs.org/series/2111/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/811338/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/811338/checks/","tags":{},"related":[],"headers":{"Return-Path":"<kernel-team-bounces@lists.ubuntu.com>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.ubuntu.com\n\t(client-ip=91.189.94.19; helo=huckleberry.canonical.com;\n\tenvelope-from=kernel-team-bounces@lists.ubuntu.com;\n\treceiver=<UNKNOWN>)","Received":["from huckleberry.canonical.com (huckleberry.canonical.com\n\t[91.189.94.19])\n\tby ozlabs.org (Postfix) with ESMTP id 3xpSrs1qpCz9sDB;\n\tFri,  8 Sep 2017 17:00:45 +1000 (AEST)","from localhost ([127.0.0.1] helo=huckleberry.canonical.com)\n\tby huckleberry.canonical.com with esmtp (Exim 4.86_2)\n\t(envelope-from <kernel-team-bounces@lists.ubuntu.com>)\n\tid 1dqDHO-0000sJ-B2; Fri, 08 Sep 2017 07:00:42 +0000","from youngberry.canonical.com ([91.189.89.112])\n\tby huckleberry.canonical.com with esmtps\n\t(TLS1.0:DHE_RSA_AES_128_CBC_SHA1:128)\n\t(Exim 4.86_2) (envelope-from <daniel.axtens@canonical.com>)\n\tid 1dqDHM-0000qF-R0\n\tfor kernel-team@lists.canonical.com; Fri, 08 Sep 2017 07:00:40 +0000","from mail-pg0-f71.google.com ([74.125.83.71])\n\tby youngberry.canonical.com with esmtps\n\t(TLS1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.76) (envelope-from <daniel.axtens@canonical.com>)\n\tid 1dqDHM-00039f-FL\n\tfor kernel-team@lists.canonical.com; Fri, 08 Sep 2017 07:00:40 +0000","by mail-pg0-f71.google.com with SMTP id 6so3680370pgh.0\n\tfor <kernel-team@lists.canonical.com>;\n\tFri, 08 Sep 2017 00:00:40 -0700 (PDT)","from localhost.localdomain (124-171-202-56.dyn.iinet.net.au.\n\t[124.171.202.56]) by smtp.gmail.com with ESMTPSA id\n\t125sm2138129pff.5.2017.09.08.00.00.36\n\tfor <kernel-team@lists.canonical.com>\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tFri, 08 Sep 2017 00:00:38 -0700 (PDT)"],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=ZKkU74er4YHs7Awyazs/slBZ/mZx8/vxdMaODP+rZ1c=;\n\tb=bu6TzAl1G2fPbcdC/f1DFAkzzQ+v8IUI4VEIZQHde7RKUDmjIEGFxqfFw9v1lbyxmz\n\tiGDRt61fAiGSwQ5B2KqnEJrj2reDxRXCS+PrDLb4pItBD4maaLi3i56qIPbjtPWiD857\n\t6odeCvIMeb/pxv0fKrU7NOHrPeYfgad1iVyk4PA7dyJhKxADxQEBByuh7ZmqZSGCBs1F\n\twA9PvEJ45bKb2UQteKvzB9uukRZdxHZo14pW6xkjasWhVdsYcYEk9Uy/Rprbqd1TQ/ER\n\tv1eggzqDfmbUXdGKwGdGV1VHSel/4WfDIMIatf31JdCPp0hqdVkuaRo2XJKnRkQseYll\n\tt6FA==","X-Gm-Message-State":"AHPjjUh+I9hivzV7EFbzWvSpvjAouJX/E53KVr9J9+KwsnpothwZNDcU\n\tpBnZBuu9iAXw4q4+KinQ2W3mls9DHqycHaNhJdqnhcB4Ww7/BlxDsXF6iwQNccBU06O2HcjQKZR\n\tMsl7MxHPlL1+2ypaSKSc5TeZgLvd+zkpRP8Qk+Ls=","X-Received":["by 10.84.236.69 with SMTP id h5mr2293149pln.338.1504854038828;\n\tFri, 08 Sep 2017 00:00:38 -0700 (PDT)","by 10.84.236.69 with SMTP id h5mr2293137pln.338.1504854038589;\n\tFri, 08 Sep 2017 00:00:38 -0700 (PDT)"],"X-Google-Smtp-Source":"ADKCNb4yfylNkDcZtWbRyr6sQaSAXhclflwKZHZJrNmeQxu+FjYozJBwFcVRZHWR9NxMf71/X0i7Gw==","From":"Daniel Axtens <daniel.axtens@canonical.com>","To":"kernel-team@lists.canonical.com","Subject":"[SRU][Zesty][PATCH 5/7] net: add confirm_neigh method to dst_ops","Date":"Fri,  8 Sep 2017 17:00:16 +1000","Message-Id":"<20170908070018.4141-6-daniel.axtens@canonical.com>","X-Mailer":"git-send-email 2.11.0","In-Reply-To":"<20170908070018.4141-1-daniel.axtens@canonical.com>","References":"<20170908070018.4141-1-daniel.axtens@canonical.com>","X-BeenThere":"kernel-team@lists.ubuntu.com","X-Mailman-Version":"2.1.20","Precedence":"list","List-Id":"Kernel team discussions <kernel-team.lists.ubuntu.com>","List-Unsubscribe":"<https://lists.ubuntu.com/mailman/options/kernel-team>,\n\t<mailto:kernel-team-request@lists.ubuntu.com?subject=unsubscribe>","List-Archive":"<https://lists.ubuntu.com/archives/kernel-team>","List-Post":"<mailto:kernel-team@lists.ubuntu.com>","List-Help":"<mailto:kernel-team-request@lists.ubuntu.com?subject=help>","List-Subscribe":"<https://lists.ubuntu.com/mailman/listinfo/kernel-team>,\n\t<mailto:kernel-team-request@lists.ubuntu.com?subject=subscribe>","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"kernel-team-bounces@lists.ubuntu.com","Sender":"\"kernel-team\" <kernel-team-bounces@lists.ubuntu.com>"},"content":"From: Julian Anastasov <ja@ssi.bg>\n\nBugLink: https://bugs.launchpad.net/bugs/1715812\n\nAdd confirm_neigh method to dst_ops and use it from IPv4 and IPv6\nto lookup and confirm the neighbour. Its usage via the new helper\ndst_confirm_neigh() should be restricted to MSG_PROBE users for\nperformance reasons.\n\nFor XFRM prefer the last tunnel address, if present. With help\nfrom Steffen Klassert.\n\nSigned-off-by: Julian Anastasov <ja@ssi.bg>\nAcked-by: Steffen Klassert <steffen.klassert@secunet.com>\nSigned-off-by: David S. Miller <davem@davemloft.net>\n(cherry picked from commit 63fca65d08632fbec9d9b655f671cf08aa1aeeb8)\nSigned-off-by: Daniel Axtens <daniel.axtens@canonical.com>\n---\n include/net/arp.h      | 16 ++++++++++++++++\n include/net/dst.h      |  7 +++++++\n include/net/dst_ops.h  |  2 ++\n include/net/ndisc.h    | 17 +++++++++++++++++\n net/ipv4/route.c       | 19 +++++++++++++++++++\n net/ipv6/route.c       | 16 ++++++++++++++++\n net/xfrm/xfrm_policy.c | 19 +++++++++++++++++++\n 7 files changed, 96 insertions(+)","diff":"diff --git a/include/net/arp.h b/include/net/arp.h\nindex 5e0f891d476c..65619a2de6f4 100644\n--- a/include/net/arp.h\n+++ b/include/net/arp.h\n@@ -35,6 +35,22 @@ static inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32\n \treturn n;\n }\n \n+static inline void __ipv4_confirm_neigh(struct net_device *dev, u32 key)\n+{\n+\tstruct neighbour *n;\n+\n+\trcu_read_lock_bh();\n+\tn = __ipv4_neigh_lookup_noref(dev, key);\n+\tif (n) {\n+\t\tunsigned long now = jiffies;\n+\n+\t\t/* avoid dirtying neighbour */\n+\t\tif (n->confirmed != now)\n+\t\t\tn->confirmed = now;\n+\t}\n+\trcu_read_unlock_bh();\n+}\n+\n void arp_init(void);\n int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg);\n void arp_send(int type, int ptype, __be32 dest_ip,\ndiff --git a/include/net/dst.h b/include/net/dst.h\nindex 6835d224d47b..3a3b34b83b00 100644\n--- a/include/net/dst.h\n+++ b/include/net/dst.h\n@@ -477,6 +477,13 @@ static inline struct neighbour *dst_neigh_lookup_skb(const struct dst_entry *dst\n \treturn IS_ERR(n) ? NULL : n;\n }\n \n+static inline void dst_confirm_neigh(const struct dst_entry *dst,\n+\t\t\t\t     const void *daddr)\n+{\n+\tif (dst->ops->confirm_neigh)\n+\t\tdst->ops->confirm_neigh(dst, daddr);\n+}\n+\n static inline void dst_link_failure(struct sk_buff *skb)\n {\n \tstruct dst_entry *dst = skb_dst(skb);\ndiff --git a/include/net/dst_ops.h b/include/net/dst_ops.h\nindex a0d443ca16fc..0d0481827098 100644\n--- a/include/net/dst_ops.h\n+++ b/include/net/dst_ops.h\n@@ -33,6 +33,8 @@ struct dst_ops {\n \tstruct neighbour *\t(*neigh_lookup)(const struct dst_entry *dst,\n \t\t\t\t\t\tstruct sk_buff *skb,\n \t\t\t\t\t\tconst void *daddr);\n+\tvoid\t\t\t(*confirm_neigh)(const struct dst_entry *dst,\n+\t\t\t\t\t\t const void *daddr);\n \n \tstruct kmem_cache\t*kmem_cachep;\n \ndiff --git a/include/net/ndisc.h b/include/net/ndisc.h\nindex d562a2fe4860..8a0214654b6b 100644\n--- a/include/net/ndisc.h\n+++ b/include/net/ndisc.h\n@@ -391,6 +391,23 @@ static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, cons\n \treturn n;\n }\n \n+static inline void __ipv6_confirm_neigh(struct net_device *dev,\n+\t\t\t\t\tconst void *pkey)\n+{\n+\tstruct neighbour *n;\n+\n+\trcu_read_lock_bh();\n+\tn = __ipv6_neigh_lookup_noref(dev, pkey);\n+\tif (n) {\n+\t\tunsigned long now = jiffies;\n+\n+\t\t/* avoid dirtying neighbour */\n+\t\tif (n->confirmed != now)\n+\t\t\tn->confirmed = now;\n+\t}\n+\trcu_read_unlock_bh();\n+}\n+\n int ndisc_init(void);\n int ndisc_late_init(void);\n \ndiff --git a/net/ipv4/route.c b/net/ipv4/route.c\nindex 6263af2f6ce8..e8b00e9df87f 100644\n--- a/net/ipv4/route.c\n+++ b/net/ipv4/route.c\n@@ -154,6 +154,7 @@ static u32 *ipv4_cow_metrics(struct dst_entry *dst, unsigned long old)\n static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,\n \t\t\t\t\t   struct sk_buff *skb,\n \t\t\t\t\t   const void *daddr);\n+static void ipv4_confirm_neigh(const struct dst_entry *dst, const void *daddr);\n \n static struct dst_ops ipv4_dst_ops = {\n \t.family =\t\tAF_INET,\n@@ -168,6 +169,7 @@ static struct dst_ops ipv4_dst_ops = {\n \t.redirect =\t\tip_do_redirect,\n \t.local_out =\t\t__ip_local_out,\n \t.neigh_lookup =\t\tipv4_neigh_lookup,\n+\t.confirm_neigh =\tipv4_confirm_neigh,\n };\n \n #define ECN_OR_COST(class)\tTC_PRIO_##class\n@@ -461,6 +463,23 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,\n \treturn neigh_create(&arp_tbl, pkey, dev);\n }\n \n+static void ipv4_confirm_neigh(const struct dst_entry *dst, const void *daddr)\n+{\n+\tstruct net_device *dev = dst->dev;\n+\tconst __be32 *pkey = daddr;\n+\tconst struct rtable *rt;\n+\n+\trt = (const struct rtable *)dst;\n+\tif (rt->rt_gateway)\n+\t\tpkey = (const __be32 *)&rt->rt_gateway;\n+\telse if (!daddr ||\n+\t\t (rt->rt_flags &\n+\t\t  (RTCF_MULTICAST | RTCF_BROADCAST | RTCF_LOCAL)))\n+\t\treturn;\n+\n+\t__ipv4_confirm_neigh(dev, *(__force u32 *)pkey);\n+}\n+\n #define IP_IDENTS_SZ 2048u\n \n static atomic_t *ip_idents __read_mostly;\ndiff --git a/net/ipv6/route.c b/net/ipv6/route.c\nindex d5c2e35c4e26..9737526aefdf 100644\n--- a/net/ipv6/route.c\n+++ b/net/ipv6/route.c\n@@ -217,6 +217,21 @@ static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst,\n \treturn neigh_create(&nd_tbl, daddr, dst->dev);\n }\n \n+static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)\n+{\n+\tstruct net_device *dev = dst->dev;\n+\tstruct rt6_info *rt = (struct rt6_info *)dst;\n+\n+\tdaddr = choose_neigh_daddr(rt, NULL, daddr);\n+\tif (!daddr)\n+\t\treturn;\n+\tif (dev->flags & (IFF_NOARP | IFF_LOOPBACK))\n+\t\treturn;\n+\tif (ipv6_addr_is_multicast((const struct in6_addr *)daddr))\n+\t\treturn;\n+\t__ipv6_confirm_neigh(dev, daddr);\n+}\n+\n static struct dst_ops ip6_dst_ops_template = {\n \t.family\t\t\t=\tAF_INET6,\n \t.gc\t\t\t=\tip6_dst_gc,\n@@ -233,6 +248,7 @@ static struct dst_ops ip6_dst_ops_template = {\n \t.redirect\t\t=\trt6_do_redirect,\n \t.local_out\t\t=\t__ip6_local_out,\n \t.neigh_lookup\t\t=\tip6_neigh_lookup,\n+\t.confirm_neigh\t\t=\tip6_confirm_neigh,\n };\n \n static unsigned int ip6_blackhole_mtu(const struct dst_entry *dst)\ndiff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c\nindex 3c8f5b70abf8..a484c24a2a54 100644\n--- a/net/xfrm/xfrm_policy.c\n+++ b/net/xfrm/xfrm_policy.c\n@@ -2856,6 +2856,23 @@ static struct neighbour *xfrm_neigh_lookup(const struct dst_entry *dst,\n \treturn dst->path->ops->neigh_lookup(dst, skb, daddr);\n }\n \n+static void xfrm_confirm_neigh(const struct dst_entry *dst, const void *daddr)\n+{\n+\tconst struct dst_entry *path = dst->path;\n+\n+\tfor (; dst != path; dst = dst->child) {\n+\t\tconst struct xfrm_state *xfrm = dst->xfrm;\n+\n+\t\tif (xfrm->props.mode == XFRM_MODE_TRANSPORT)\n+\t\t\tcontinue;\n+\t\tif (xfrm->type->flags & XFRM_TYPE_REMOTE_COADDR)\n+\t\t\tdaddr = xfrm->coaddr;\n+\t\telse if (!(xfrm->type->flags & XFRM_TYPE_LOCAL_COADDR))\n+\t\t\tdaddr = &xfrm->id.daddr;\n+\t}\n+\tpath->ops->confirm_neigh(path, daddr);\n+}\n+\n int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)\n {\n \tint err = 0;\n@@ -2882,6 +2899,8 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)\n \t\t\tdst_ops->link_failure = xfrm_link_failure;\n \t\tif (likely(dst_ops->neigh_lookup == NULL))\n \t\t\tdst_ops->neigh_lookup = xfrm_neigh_lookup;\n+\t\tif (likely(!dst_ops->confirm_neigh))\n+\t\t\tdst_ops->confirm_neigh = xfrm_confirm_neigh;\n \t\tif (likely(afinfo->garbage_collect == NULL))\n \t\t\tafinfo->garbage_collect = xfrm_garbage_collect_deferred;\n \t\trcu_assign_pointer(xfrm_policy_afinfo[afinfo->family], afinfo);\n","prefixes":["SRU","Zesty","5/7"]}