Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Do ND in L2_output in the same manner as arpresolve



details:   https://anonhg.NetBSD.org/src/rev/23defb37c188
branches:  trunk
changeset: 821711:23defb37c188
user:      ozaki-r <ozaki-r%NetBSD.org@localhost>
date:      Tue Feb 14 03:05:06 2017 +0000

description:
Do ND in L2_output in the same manner as arpresolve

The benefits of this change are:
- The flow is consistent with IPv4 (and FreeBSD and OpenBSD)
  - old: ip6_output => nd6_output (do ND if needed) => L2_output (lookup a stored cache)
  - new: ip6_output => L2_output (lookup a cache. Do ND if cache not found)
- We can remove some workarounds in nd6_output
- We can move L2 specific operations to their own place
- The performance slightly improves because one cache lookup is reduced

diffstat:

 sys/dist/pf/net/pf.c                         |    6 +-
 sys/external/bsd/ipf/netinet/ip_fil_netbsd.c |    6 +-
 sys/net/if_arcsubr.c                         |   14 +-
 sys/net/if_ethersubr.c                       |   17 +-
 sys/net/if_fddisubr.c                        |   19 +-
 sys/net/if_ieee1394subr.c                    |   23 ++-
 sys/net/if_srt.c                             |    7 +-
 sys/netinet6/in6_offload.c                   |    7 +-
 sys/netinet6/ip6_forward.c                   |    6 +-
 sys/netinet6/ip6_mroute.c                    |   11 +-
 sys/netinet6/ip6_output.c                    |   33 ++++-
 sys/netinet6/ip6_var.h                       |    5 +-
 sys/netinet6/nd6.c                           |  194 +++++---------------------
 sys/netinet6/nd6.h                           |   10 +-
 14 files changed, 145 insertions(+), 213 deletions(-)

diffs (truncated from 720 to 300 lines):

diff -r 4b91add7cfe3 -r 23defb37c188 sys/dist/pf/net/pf.c
--- a/sys/dist/pf/net/pf.c      Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/dist/pf/net/pf.c      Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pf.c,v 1.75 2016/12/08 05:16:33 ozaki-r Exp $  */
+/*     $NetBSD: pf.c,v 1.76 2017/02/14 03:05:06 ozaki-r Exp $  */
 /*     $OpenBSD: pf.c,v 1.552.2.1 2007/11/27 16:37:57 henning Exp $ */
 
 /*
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf.c,v 1.75 2016/12/08 05:16:33 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf.c,v 1.76 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #include "pflog.h"
 
@@ -5553,7 +5553,7 @@
        if (IN6_IS_SCOPE_EMBEDDABLE(&dst.sin6_addr))
                dst.sin6_addr.s6_addr16[1] = htons(ifp->if_index);
        if ((u_long)m0->m_pkthdr.len <= ifp->if_mtu) {
-               (void)nd6_output(ifp, ifp, m0, &dst, NULL);
+               (void)ip6_if_output(ifp, ifp, m0, &dst, NULL);
        } else {
                in6_ifstat_inc(ifp, ifs6_in_toobig);
                if (r->rt != PF_DUPTO)
diff -r 4b91add7cfe3 -r 23defb37c188 sys/external/bsd/ipf/netinet/ip_fil_netbsd.c
--- a/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c      Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c      Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip_fil_netbsd.c,v 1.21 2016/12/28 19:53:02 christos Exp $      */
+/*     $NetBSD: ip_fil_netbsd.c,v 1.22 2017/02/14 03:05:06 ozaki-r Exp $       */
 
 /*
  * Copyright (C) 2012 by Darren Reed.
@@ -8,7 +8,7 @@
 #if !defined(lint)
 #if defined(__NetBSD__)
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_fil_netbsd.c,v 1.21 2016/12/28 19:53:02 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_fil_netbsd.c,v 1.22 2017/02/14 03:05:06 ozaki-r Exp $");
 #else
 static const char sccsid[] = "@(#)ip_fil.c     2.41 6/5/96 (C) 1993-2000 Darren Reed";
 static const char rcsid[] = "@(#)Id: ip_fil_netbsd.c,v 1.1.1.2 2012/07/22 13:45:17 darrenr Exp";
@@ -1478,7 +1478,7 @@
 # endif
                if ((error == 0) && (m0->m_pkthdr.len <= mtu)) {
 # if __NetBSD_Version__ >= 499001100
-                       error = nd6_output(ifp, ifp, m0, satocsin6(dst), rt);
+                       error = ip6_if_output(ifp, ifp, m0, satocsin6(dst), rt);
 # else
                        error = nd6_output(ifp, ifp, m0, dst6, rt);
 # endif
diff -r 4b91add7cfe3 -r 23defb37c188 sys/net/if_arcsubr.c
--- a/sys/net/if_arcsubr.c      Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/net/if_arcsubr.c      Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_arcsubr.c,v 1.76 2017/01/24 18:37:20 maxv Exp $     */
+/*     $NetBSD: if_arcsubr.c,v 1.77 2017/02/14 03:05:06 ozaki-r Exp $  */
 
 /*
  * Copyright (c) 1994, 1995 Ignatios Souvatzis
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.76 2017/01/24 18:37:20 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.77 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -218,8 +218,14 @@
 #endif
 #ifdef INET6
        case AF_INET6:
-               if (!nd6_storelladdr(ifp, rt, m, dst, &adst, sizeof(adst)))
-                       return (0); /* it must be impossible, but... */
+               if (m->m_flags & M_MCAST) {
+                       adst = 0;
+               } else {
+                       error = nd6_resolve(ifp, rt, m, dst, &adst,
+                           sizeof(adst));
+                       if (error != 0)
+                               return error == EWOULDBLOCK ? 0 : error;
+               }
                atype = htons(ARCTYPE_INET6);
                newencoding = 1;
                break;
diff -r 4b91add7cfe3 -r 23defb37c188 sys/net/if_ethersubr.c
--- a/sys/net/if_ethersubr.c    Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/net/if_ethersubr.c    Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_ethersubr.c,v 1.237 2017/02/12 09:36:05 skrll Exp $ */
+/*     $NetBSD: if_ethersubr.c,v 1.238 2017/02/14 03:05:06 ozaki-r Exp $       */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.237 2017/02/12 09:36:05 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.238 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -303,9 +303,16 @@
 #endif
 #ifdef INET6
        case AF_INET6:
-               if (!nd6_storelladdr(ifp, rt, m, dst, edst, sizeof(edst))){
-                       /* something bad happened */
-                       return (0);
+               if (m->m_flags & M_BCAST)
+                       (void)memcpy(edst, etherbroadcastaddr, sizeof(edst));
+               else if (m->m_flags & M_MCAST) {
+                       ETHER_MAP_IPV6_MULTICAST(&satocsin6(dst)->sin6_addr,
+                           edst);
+               } else {
+                       error = nd6_resolve(ifp, rt, m, dst, edst,
+                           sizeof(edst));
+                       if (error != 0)
+                               return error == EWOULDBLOCK ? 0 : error;
                }
                etype = htons(ETHERTYPE_IPV6);
                break;
diff -r 4b91add7cfe3 -r 23defb37c188 sys/net/if_fddisubr.c
--- a/sys/net/if_fddisubr.c     Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/net/if_fddisubr.c     Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_fddisubr.c,v 1.104 2017/01/24 18:37:20 maxv Exp $   */
+/*     $NetBSD: if_fddisubr.c,v 1.105 2017/02/14 03:05:06 ozaki-r Exp $        */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -96,7 +96,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_fddisubr.c,v 1.104 2017/01/24 18:37:20 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_fddisubr.c,v 1.105 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_gateway.h"
@@ -250,9 +250,18 @@
 #endif
 #ifdef INET6
        case AF_INET6:
-               if (!nd6_storelladdr(ifp, rt, m, dst, edst, sizeof(edst))){
-                       /* something bad happened */
-                       return (0);
+               if (m->m_flags & M_BCAST)
+                       (void)memcpy(edst, fddibroadcastaddr, sizeof(edst));
+               else if (m->m_flags & M_MCAST) {
+                       ETHER_MAP_IPV6_MULTICAST(&satocsin6(dst)->sin6_addr,
+                           edst);
+               } else {
+                       error = nd6_resolve(ifp, rt, m, dst, edst,
+                           sizeof(edst));
+                       if (error != 0) {
+                               error = error == EWOULDBLOCK ? 0 : error;
+                               return error;
+                       }
                }
                etype = htons(ETHERTYPE_IPV6);
                break;
diff -r 4b91add7cfe3 -r 23defb37c188 sys/net/if_ieee1394subr.c
--- a/sys/net/if_ieee1394subr.c Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/net/if_ieee1394subr.c Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_ieee1394subr.c,v 1.58 2016/10/03 11:06:06 ozaki-r Exp $     */
+/*     $NetBSD: if_ieee1394subr.c,v 1.59 2017/02/14 03:05:06 ozaki-r Exp $     */
 
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ieee1394subr.c,v 1.58 2016/10/03 11:06:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ieee1394subr.c,v 1.59 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -154,10 +154,21 @@
 #endif /* INET */
 #ifdef INET6
        case AF_INET6:
-               if (unicast && (!nd6_storelladdr(ifp, rt, m0, dst,
-                   hwdst->iha_uid, IEEE1394_ADDR_LEN))) {
-                       /* something bad happened */
-                       return 0;
+#if 0
+               /*
+                * XXX This code was in nd6_storelladdr, which was replaced with
+                * nd6_resolve, but it never be used because nd6_storelladdr was
+                * called only if unicast. Should it be enabled?
+                */
+               if (m0->m_flags & M_BCAST)
+                       memcpy(hwdst->iha_uid, ifp->if_broadcastaddr,
+                           MIN(IEEE1394_ADDR_LEN, ifp->if_addrlen));
+#endif
+               if (unicast) {
+                       error = nd6_resolve(ifp, rt, m0, dst, hwdst->iha_uid,
+                           IEEE1394_ADDR_LEN);
+                       if (error != 0)
+                               return error == EWOULDBLOCK ? 0 : error;
                }
                etype = htons(ETHERTYPE_IPV6);
                break;
diff -r 4b91add7cfe3 -r 23defb37c188 sys/net/if_srt.c
--- a/sys/net/if_srt.c  Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/net/if_srt.c  Tue Feb 14 03:05:06 2017 +0000
@@ -1,8 +1,8 @@
-/* $NetBSD: if_srt.c,v 1.25 2017/02/09 11:43:32 kre Exp $ */
+/* $NetBSD: if_srt.c,v 1.26 2017/02/14 03:05:06 ozaki-r Exp $ */
 /* This file is in the public domain. */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.25 2017/02/09 11:43:32 kre Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.26 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -36,6 +36,7 @@
 #include <netinet/ip.h>
 #include <netinet/ip6.h>
 #include <netinet6/in6_var.h>
+#include <netinet6/ip6_var.h>
 #include <netinet6/nd6.h>
 #include <netinet6/scope6_var.h>
 #include <net/if_types.h>
@@ -240,7 +241,7 @@
        }
        /* XXX is 0 the right last arg here? */
        if (to->sa_family == AF_INET6)
-               return nd6_output(r->u.dstifp, r->u.dstifp, m, &r->dst.sin6, 0);
+               return ip6_if_output(r->u.dstifp, r->u.dstifp, m, &r->dst.sin6, 0);
        return if_output_lock(r->u.dstifp, r->u.dstifp, m, &r->dst.sa, 0);
 }
 
diff -r 4b91add7cfe3 -r 23defb37c188 sys/netinet6/in6_offload.c
--- a/sys/netinet6/in6_offload.c        Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/netinet6/in6_offload.c        Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in6_offload.c,v 1.6 2011/04/25 22:07:57 yamt Exp $     */
+/*     $NetBSD: in6_offload.c,v 1.7 2017/02/14 03:05:06 ozaki-r Exp $  */
 
 /*-
  * Copyright (c)2006 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_offload.c,v 1.6 2011/04/25 22:07:57 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_offload.c,v 1.7 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -39,6 +39,7 @@
 #include <netinet/ip6.h>
 #include <netinet/tcp.h>
 #include <netinet6/in6_var.h>
+#include <netinet6/ip6_var.h>
 #include <netinet6/nd6.h>
 #include <netinet6/in6_offload.h>
 
@@ -56,7 +57,7 @@
 {
        struct ip6_tso_output_args *args = vp;
 
-       return nd6_output(args->ifp, args->origifp, m, args->dst, args->rt);
+       return ip6_if_output(args->ifp, args->origifp, m, args->dst, args->rt);
 }
 
 int
diff -r 4b91add7cfe3 -r 23defb37c188 sys/netinet6/ip6_forward.c
--- a/sys/netinet6/ip6_forward.c        Tue Feb 14 01:18:39 2017 +0000
+++ b/sys/netinet6/ip6_forward.c        Tue Feb 14 03:05:06 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip6_forward.c,v 1.85 2017/01/16 15:44:47 christos Exp $        */
+/*     $NetBSD: ip6_forward.c,v 1.86 2017/02/14 03:05:06 ozaki-r Exp $ */
 /*     $KAME: ip6_forward.c,v 1.109 2002/09/11 08:10:17 sakane Exp $   */
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.85 2017/01/16 15:44:47 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.86 2017/02/14 03:05:06 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_gateway.h"
@@ -401,7 +401,7 @@
                goto freecopy;
        ip6 = mtod(m, struct ip6_hdr *);
 
-       error = nd6_output(rt->rt_ifp, origifp, m, dst, rt);



Home | Main Index | Thread Index | Old Index