Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Oct 2003 11:14:00 -0700 (PDT)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 39849 for review
Message-ID:  <200310171814.h9HIE0Oh024004@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=39849

Change 39849 by sam@sam_ebb on 2003/10/17 11:13:27

	IFC @ 39848

Affected files ...

.. //depot/projects/netperf/sys/dev/ath/if_ath.c#23 integrate
.. //depot/projects/netperf/sys/ia64/ia64/machdep.c#11 integrate
.. //depot/projects/netperf/sys/kern/kern_idle.c#2 integrate
.. //depot/projects/netperf/sys/kern/sched_4bsd.c#6 integrate
.. //depot/projects/netperf/sys/kern/sched_ule.c#10 integrate
.. //depot/projects/netperf/sys/kern/vfs_subr.c#7 integrate
.. //depot/projects/netperf/sys/net/if.c#7 integrate
.. //depot/projects/netperf/sys/net/if_var.h#2 integrate
.. //depot/projects/netperf/sys/net/route.c#16 integrate
.. //depot/projects/netperf/sys/netinet/icmp6.h#4 integrate
.. //depot/projects/netperf/sys/netinet/ip_dummynet.c#11 integrate
.. //depot/projects/netperf/sys/netinet/ip_input.c#13 integrate
.. //depot/projects/netperf/sys/netinet/tcp_input.c#3 integrate
.. //depot/projects/netperf/sys/netinet6/icmp6.c#7 integrate
.. //depot/projects/netperf/sys/netinet6/in6.c#8 integrate
.. //depot/projects/netperf/sys/netinet6/in6_ifattach.c#9 integrate
.. //depot/projects/netperf/sys/netinet6/in6_proto.c#5 integrate
.. //depot/projects/netperf/sys/netinet6/in6_src.c#6 integrate
.. //depot/projects/netperf/sys/netinet6/in6_var.h#3 integrate
.. //depot/projects/netperf/sys/netinet6/ip6_input.c#10 integrate
.. //depot/projects/netperf/sys/netinet6/ip6_output.c#14 integrate
.. //depot/projects/netperf/sys/netinet6/nd6.c#11 integrate
.. //depot/projects/netperf/sys/netinet6/nd6.h#4 integrate
.. //depot/projects/netperf/sys/netinet6/nd6_nbr.c#4 integrate
.. //depot/projects/netperf/sys/netinet6/nd6_rtr.c#7 integrate
.. //depot/projects/netperf/sys/netinet6/scope6.c#4 integrate
.. //depot/projects/netperf/sys/netinet6/scope6_var.h#3 integrate
.. //depot/projects/netperf/sys/sys/domain.h#4 integrate
.. //depot/projects/netperf/sys/sys/kernel.h#2 integrate
.. //depot/projects/netperf/sys/ufs/ffs/ffs_snapshot.c#4 integrate
.. //depot/projects/netperf/sys/vm/vm_pageout.c#7 integrate

Differences ...

==== //depot/projects/netperf/sys/dev/ath/if_ath.c#23 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.25 2003/10/14 22:51:45 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.26 2003/10/16 16:13:11 sam Exp $");
 
 /*
  * Driver for the Atheros Wireless LAN controller.

==== //depot/projects/netperf/sys/ia64/ia64/machdep.c#11 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.157 2003/10/03 03:50:29 marcel Exp $
+ * $FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.158 2003/10/17 02:24:59 marcel Exp $
  */
 
 #include "opt_compat.h"
@@ -272,13 +272,21 @@
 }
 
 void
-cpu_halt(void)
+cpu_halt()
 {
 
 	ia64_efi_runtime->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, 0);
 }
 
 void
+cpu_idle()
+{
+	struct ia64_pal_result res;
+
+	res = ia64_call_pal_static(PAL_HALT_LIGHT, 0, 0, 0);
+}
+
+void
 cpu_reset()
 {
 

==== //depot/projects/netperf/sys/kern/kern_idle.c#2 (text+ko) ====

@@ -4,7 +4,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_idle.c,v 1.32 2003/06/11 00:56:55 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_idle.c,v 1.34 2003/10/17 03:49:03 peter Exp $");
 
 #include "opt_ktrace.h"
 
@@ -112,7 +112,7 @@
 				    " for a process");
 #endif
 
-#ifdef __i386__
+#if defined(__i386__) || defined(__amd64__) || defined(__ia64__)
 			cpu_idle();
 #endif
 		}

==== //depot/projects/netperf/sys/kern/sched_4bsd.c#6 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.24 2003/10/16 08:53:46 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.25 2003/10/16 21:13:14 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -723,5 +723,11 @@
 fixpt_t
 sched_pctcpu(struct thread *td)
 {
-	return (td->td_kse->ke_pctcpu);
+	struct kse *ke;
+
+	ke = td->td_kse;
+	if (ke)
+		return (ke->ke_pctcpu);
+
+	return (0);
 }

==== //depot/projects/netperf/sys/kern/sched_ule.c#10 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.63 2003/10/16 10:04:54 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.65 2003/10/16 20:32:57 jeff Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -462,7 +462,7 @@
 	kseq_rem(from, ke);
 
 	ke->ke_cpu = cpu;
-	sched_add(ke);
+	sched_add(ke->ke_thread);
 }
 #endif
 
@@ -815,14 +815,16 @@
 			runq_add(ke->ke_runq, ke);
 			/* setrunqueue(td); */
 		}
-	} else if (ke->ke_runq)
-		kseq_rem(KSEQ_CPU(ke->ke_cpu), ke);
-	/*
-	 * We will not be on the run queue. So we must be
-	 * sleeping or similar.
-	 */
-	if (td->td_proc->p_flag & P_SA)
-		kse_reassign(ke);
+	} else {
+		if (ke->ke_runq)
+			kseq_rem(KSEQ_CPU(ke->ke_cpu), ke);
+		/*
+		 * We will not be on the run queue. So we must be
+		 * sleeping or similar.
+		 */
+		if (td->td_proc->p_flag & P_SA)
+			kse_reassign(ke);
+	}
 	sched_nest = sched_lock.mtx_recurse;
 	newtd = choosethread();
 	if (td != newtd)

==== //depot/projects/netperf/sys/kern/vfs_subr.c#7 (text+ko) ====

@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_subr.c,v 1.467 2003/10/12 14:04:39 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_subr.c,v 1.468 2003/10/17 11:56:48 phk Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mac.h"
@@ -2838,12 +2838,12 @@
 count_dev(dev)
 	dev_t dev;
 {
-	struct vnode *vp;
+	int count;
 
-	vp = SLIST_FIRST(&dev->si_hlist);
-	if (vp == NULL)
-		return (0);
-	return(vcount(vp));
+	mtx_lock(&spechash_mtx);
+	count = dev->si_usecount;
+	mtx_unlock(&spechash_mtx);
+	return(count);
 }
 
 /*

==== //depot/projects/netperf/sys/net/if.c#7 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)if.c	8.5 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/net/if.c,v 1.167 2003/10/16 13:38:29 ume Exp $
+ * $FreeBSD: src/sys/net/if.c,v 1.168 2003/10/17 15:46:30 ume Exp $
  */
 
 #include "opt_compat.h"
@@ -54,6 +54,7 @@
 #include <sys/sockio.h>
 #include <sys/syslog.h>
 #include <sys/sysctl.h>
+#include <sys/domain.h>
 #include <sys/jail.h>
 #include <machine/stdarg.h>
 
@@ -78,6 +79,8 @@
 #include <netinet/if_ether.h>
 #endif
 
+static void	if_attachdomain(void *);
+static void	if_attachdomain1(struct ifnet *);
 static int	ifconf(u_long, caddr_t);
 static void	if_grow(void);
 static void	if_init(void *);
@@ -442,10 +445,48 @@
 	}
 	ifp->if_broadcastaddr = 0; /* reliably crash if used uninitialized */
 
+	if (domains)
+		if_attachdomain1(ifp);
+
 	/* Announce the interface. */
 	rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
 }
 
+static void
+if_attachdomain(dummy)
+	void *dummy;
+{
+	struct ifnet *ifp;
+	int s;
+
+	s = splnet();
+	for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list))
+		if_attachdomain1(ifp);
+	splx(s);
+}
+SYSINIT(domainifattach, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST,
+    if_attachdomain, NULL);
+
+static void
+if_attachdomain1(ifp)
+	struct ifnet *ifp;
+{
+	struct domain *dp;
+	int s;
+
+	s = splnet();
+
+	/* address family dependent data region */
+	bzero(ifp->if_afdata, sizeof(ifp->if_afdata));
+	for (dp = domains; dp; dp = dp->dom_next) {
+		if (dp->dom_ifattach)
+			ifp->if_afdata[dp->dom_family] =
+			    (*dp->dom_ifattach)(ifp);
+	}
+
+	splx(s);
+}
+
 /*
  * Detach an interface, removing it from the
  * list of "active" interfaces.
@@ -458,6 +499,7 @@
 	struct radix_node_head	*rnh;
 	int s;
 	int i;
+	struct domain *dp;
 
 	/*
 	 * Remove routes and flush queues.
@@ -538,6 +580,12 @@
 	/* Announce that the interface is gone. */
 	rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
 
+	for (dp = domains; dp; dp = dp->dom_next) {
+		if (dp->dom_ifdetach && ifp->if_afdata[dp->dom_family])
+			(*dp->dom_ifdetach)(ifp,
+			    ifp->if_afdata[dp->dom_family]);
+	}
+
 #ifdef MAC
 	mac_destroy_ifnet(ifp);
 #endif /* MAC */

==== //depot/projects/netperf/sys/net/if_var.h#2 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	From: @(#)if.h	8.1 (Berkeley) 6/10/93
- * $FreeBSD: src/sys/net/if_var.h,v 1.58 2003/01/01 18:48:54 schweikh Exp $
+ * $FreeBSD: src/sys/net/if_var.h,v 1.59 2003/10/17 15:46:30 ume Exp $
  */
 
 #ifndef	_NET_IF_VAR_H_
@@ -178,6 +178,8 @@
 	struct	ifprefixhead if_prefixhead; /* list of prefixes per if */
 	u_int8_t *if_broadcastaddr;	/* linklevel broadcast bytestring */
 	struct	label if_label;		/* interface MAC label */
+
+	void	*if_afdata[AF_MAX];
 };
 
 typedef void if_init_f_t(void *);

==== //depot/projects/netperf/sys/net/route.c#16 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)route.c	8.3.1.1 (Berkeley) 2/23/95
- * $FreeBSD: src/sys/net/route.c,v 1.86 2003/10/11 04:48:35 sam Exp $
+ * $FreeBSD: src/sys/net/route.c,v 1.87 2003/10/16 16:17:17 sam Exp $
  */
 
 #include "opt_inet.h"

==== //depot/projects/netperf/sys/netinet/icmp6.h#4 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet/icmp6.h,v 1.11 2003/10/07 15:14:33 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet/icmp6.h,v 1.12 2003/10/17 15:46:30 ume Exp $	*/
 /*	$KAME: icmp6.h,v 1.46 2001/04/27 15:09:48 itojun Exp $	*/
 
 /*
@@ -649,11 +649,8 @@
 /* XXX: is this the right place for these macros? */
 #define icmp6_ifstat_inc(ifp, tag) \
 do {								\
-	if ((ifp) && (ifp)->if_index <= if_index			\
-	 && (ifp)->if_index < icmp6_ifstatmax			\
-	 && icmp6_ifstat && icmp6_ifstat[(ifp)->if_index]) {	\
-		icmp6_ifstat[(ifp)->if_index]->tag++;		\
-	}							\
+	if (ifp)						\
+		((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->icmp6_ifstat->tag++; \
 } while (/*CONSTCOND*/ 0)
 
 #define icmp6_ifoutstat_inc(ifp, type, code) \
@@ -661,7 +658,7 @@
 		icmp6_ifstat_inc(ifp, ifs6_out_msg); \
  		if (type < ICMP6_INFOMSG_MASK) \
  			icmp6_ifstat_inc(ifp, ifs6_out_error); \
-		switch(type) { \
+		switch (type) { \
 		 case ICMP6_DST_UNREACH: \
 			 icmp6_ifstat_inc(ifp, ifs6_out_dstunreach); \
 			 if (code == ICMP6_DST_UNREACH_ADMIN) \

==== //depot/projects/netperf/sys/netinet/ip_dummynet.c#11 (text+ko) ====

@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/netinet/ip_dummynet.c,v 1.69 2003/09/17 00:54:04 sam Exp $
+ * $FreeBSD: src/sys/netinet/ip_dummynet.c,v 1.70 2003/10/16 16:21:25 sam Exp $
  */
 
 #define	DUMMYNET_DEBUG

==== //depot/projects/netperf/sys/netinet/ip_input.c#13 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)ip_input.c	8.2 (Berkeley) 1/4/94
- * $FreeBSD: src/sys/netinet/ip_input.c,v 1.245 2003/10/15 18:19:28 sam Exp $
+ * $FreeBSD: src/sys/netinet/ip_input.c,v 1.246 2003/10/16 16:25:25 sam Exp $
  */
 
 #include "opt_bootp.h"

==== //depot/projects/netperf/sys/netinet/tcp_input.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)tcp_input.c	8.12 (Berkeley) 5/24/95
- * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.208 2003/08/13 08:46:54 harti Exp $
+ * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.209 2003/10/17 15:46:30 ume Exp $
  */
 
 #include "opt_ipfw.h"		/* for ipfw_fwd		*/
@@ -2712,8 +2712,7 @@
 		mss = rt->rt_rmx.rmx_mtu - min_protoh;
 	else {
 		if (isipv6) {
-			mss = nd_ifinfo[rt->rt_ifp->if_index].linkmtu -
-				min_protoh;
+			mss = ND_IFINFO(rt->rt_ifp)->linkmtu - min_protoh;
 			if (!in6_localaddr(&inp->in6p_faddr))
 				mss = min(mss, tcp_v6mssdflt);
 		} else {

==== //depot/projects/netperf/sys/netinet6/icmp6.c#7 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/icmp6.c,v 1.38 2003/10/10 16:04:00 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/icmp6.c,v 1.39 2003/10/17 15:46:31 ume Exp $	*/
 /*	$KAME: icmp6.c,v 1.211 2001/04/04 05:56:20 itojun Exp $	*/
 
 /*
@@ -2158,7 +2158,7 @@
 	ip6->ip6_nxt = IPPROTO_ICMPV6;
 	if (m->m_pkthdr.rcvif) {
 		/* XXX: This may not be the outgoing interface */
-		ip6->ip6_hlim = nd_ifinfo[m->m_pkthdr.rcvif->if_index].chlim;
+		ip6->ip6_hlim = ND_IFINFO(m->m_pkthdr.rcvif)->chlim;
 	} else
 		ip6->ip6_hlim = ip6_defhlim;
 

==== //depot/projects/netperf/sys/netinet6/in6.c#8 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/in6.c,v 1.30 2003/10/10 16:04:00 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/in6.c,v 1.33 2003/10/17 17:50:09 ume Exp $	*/
 /*	$KAME: in6.c,v 1.259 2002/01/21 11:37:50 keiichi Exp $	*/
 
 /*
@@ -281,30 +281,6 @@
 }
 
 int
-in6_ifindex2scopeid(idx)
-	int idx;
-{
-	struct ifnet *ifp;
-	struct ifaddr *ifa;
-	struct sockaddr_in6 *sin6;
-
-	if (idx < 0 || if_index < idx)
-		return -1;
-	ifp = ifnet_byindex(idx);
-
-	TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list)
-	{
-		if (ifa->ifa_addr->sa_family != AF_INET6)
-			continue;
-		sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
-		if (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))
-			return sin6->sin6_scope_id & 0xffff;
-	}
-
-	return -1;
-}
-
-int
 in6_mask2len(mask, lim0)
 	struct in6_addr *mask;
 	u_char *lim0;
@@ -342,20 +318,6 @@
 	return x * 8 + y;
 }
 
-void
-in6_len2mask(mask, len)
-	struct in6_addr *mask;
-	int len;
-{
-	int i;
-
-	bzero(mask, sizeof(*mask));
-	for (i = 0; i < len / 8; i++)
-		mask->s6_addr8[i] = 0xff;
-	if (len % 8)
-		mask->s6_addr8[i] = (0xff00 >> (len % 8)) & 0xff;
-}
-
 #define ifa2ia6(ifa)	((struct in6_ifaddr *)(ifa))
 #define ia62ifa(ia6)	(&((ia6)->ia_ifa))
 
@@ -420,14 +382,14 @@
 	case SIOCSSCOPE6:
 		if (!privileged)
 			return (EPERM);
-		return (scope6_set(ifp, ifr->ifr_ifru.ifru_scope_id));
-		break;
+		return (scope6_set(ifp,
+		    (struct scope6_id *)ifr->ifr_ifru.ifru_scope_id));
 	case SIOCGSCOPE6:
-		return (scope6_get(ifp, ifr->ifr_ifru.ifru_scope_id));
-		break;
+		return (scope6_get(ifp,
+		    (struct scope6_id *)ifr->ifr_ifru.ifru_scope_id));
 	case SIOCGSCOPE6DEF:
-		return (scope6_get_default(ifr->ifr_ifru.ifru_scope_id));
-		break;
+		return (scope6_get_default((struct scope6_id *)
+		    ifr->ifr_ifru.ifru_scope_id));
 	}
 
 	switch (cmd) {
@@ -562,26 +524,19 @@
 	case SIOCGIFSTAT_IN6:
 		if (ifp == NULL)
 			return EINVAL;
-		if (in6_ifstat == NULL || ifp->if_index >= in6_ifstatmax
-		 || in6_ifstat[ifp->if_index] == NULL) {
-			/* return EAFNOSUPPORT? */
-			bzero(&ifr->ifr_ifru.ifru_stat,
-			    sizeof(ifr->ifr_ifru.ifru_stat));
-		} else
-			ifr->ifr_ifru.ifru_stat = *in6_ifstat[ifp->if_index];
+		bzero(&ifr->ifr_ifru.ifru_stat,
+		    sizeof(ifr->ifr_ifru.ifru_stat));
+		ifr->ifr_ifru.ifru_stat =
+		    *((struct in6_ifextra *)ifp->if_afdata[AF_INET6])->in6_ifstat;
 		break;
 
 	case SIOCGIFSTAT_ICMP6:
 		if (ifp == NULL)
 			return EINVAL;
-		if (icmp6_ifstat == NULL || ifp->if_index >= icmp6_ifstatmax ||
-		    icmp6_ifstat[ifp->if_index] == NULL) {
-			/* return EAFNOSUPPORT? */
-			bzero(&ifr->ifr_ifru.ifru_stat,
-			    sizeof(ifr->ifr_ifru.ifru_icmp6stat));
-		} else
-			ifr->ifr_ifru.ifru_icmp6stat =
-				*icmp6_ifstat[ifp->if_index];
+		bzero(&ifr->ifr_ifru.ifru_stat,
+		    sizeof(ifr->ifr_ifru.ifru_icmp6stat));
+		ifr->ifr_ifru.ifru_icmp6stat =
+		    *((struct in6_ifextra *)ifp->if_afdata[AF_INET6])->icmp6_ifstat;
 		break;
 
 	case SIOCGIFALIFETIME_IN6:
@@ -1110,13 +1065,6 @@
 		ia->ia6_lifetime.ia6t_preferred = 0;
 
 	/*
-	 * make sure to initialize ND6 information.  this is to workaround
-	 * issues with interfaces with IPv6 addresses, which have never brought
-	 * up.  We are assuming that it is safe to nd6_ifattach multiple times.
-	 */
-	nd6_ifattach(ifp);
-
-	/*
 	 * Perform DAD, if needed.
 	 * XXX It may be of use, if we can administratively
 	 * disable DAD.
@@ -1401,7 +1349,7 @@
 		}
 
 		ifra.ifra_prefixmask.sin6_len = sizeof(struct sockaddr_in6);
-		in6_len2mask(&ifra.ifra_prefixmask.sin6_addr, prefixlen);
+		in6_prefixlen2mask(&ifra.ifra_prefixmask.sin6_addr, prefixlen);
 
 		ifra.ifra_flags = iflr->flags & ~IFLR_PREFIX;
 		return in6_control(so, SIOCAIFADDR_IN6, (caddr_t)&ifra, ifp, td);
@@ -1417,7 +1365,7 @@
 		bzero(&mask, sizeof(mask));
 		if (iflr->flags & IFLR_PREFIX) {
 			/* lookup a prefix rather than address. */
-			in6_len2mask(&mask, iflr->prefixlen);
+			in6_prefixlen2mask(&mask, iflr->prefixlen);
 
 			sin6 = (struct sockaddr_in6 *)&iflr->addr;
 			bcopy(&sin6->sin6_addr, &match, sizeof(match));
@@ -1437,7 +1385,7 @@
 				cmp = 0;	/* XXX */
 			} else {
 				/* on deleting an address, do exact match */
-				in6_len2mask(&mask, 128);
+				in6_prefixlen2mask(&mask, 128);
 				sin6 = (struct sockaddr_in6 *)&iflr->addr;
 				bcopy(&sin6->sin6_addr, &match, sizeof(match));
 
@@ -2341,14 +2289,51 @@
 	IFNET_RLOCK();
 	for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) {
 		if ((ifp->if_flags & IFF_LOOPBACK) == 0 &&
-		    nd_ifinfo[ifp->if_index].linkmtu > maxmtu)
-			maxmtu =  nd_ifinfo[ifp->if_index].linkmtu;
+		    ND_IFINFO(ifp)->linkmtu > maxmtu)
+			maxmtu =  ND_IFINFO(ifp)->linkmtu;
 	}
 	IFNET_RUNLOCK();
 	if (maxmtu)	     /* update only when maxmtu is positive */
 		in6_maxmtu = maxmtu;
 }
 
+void *
+in6_domifattach(ifp)
+	struct ifnet *ifp;
+{
+	struct in6_ifextra *ext;
+
+	ext = (struct in6_ifextra *)malloc(sizeof(*ext), M_IFADDR, M_WAITOK);
+	bzero(ext, sizeof(*ext));
+
+	ext->in6_ifstat = (struct in6_ifstat *)malloc(sizeof(struct in6_ifstat),
+	    M_IFADDR, M_WAITOK);
+	bzero(ext->in6_ifstat, sizeof(*ext->in6_ifstat));
+
+	ext->icmp6_ifstat =
+	    (struct icmp6_ifstat *)malloc(sizeof(struct icmp6_ifstat),
+	    M_IFADDR, M_WAITOK);
+	bzero(ext->icmp6_ifstat, sizeof(*ext->icmp6_ifstat));
+
+	ext->nd_ifinfo = nd6_ifattach(ifp);
+	ext->scope6_id = scope6_ifattach(ifp);
+	return ext;
+}
+
+void
+in6_domifdetach(ifp, aux)
+	struct ifnet *ifp;
+	void *aux;
+{
+	struct in6_ifextra *ext = (struct in6_ifextra *)aux;
+
+	scope6_ifdetach(ext->scope6_id);
+	nd6_ifdetach(ext->nd_ifinfo);
+	free(ext->in6_ifstat, M_IFADDR);
+	free(ext->icmp6_ifstat, M_IFADDR);
+	free(ext, M_IFADDR);
+}
+
 /*
  * Convert sockaddr_in6 to sockaddr_in.  Original sockaddr_in6 must be
  * v4 mapped addr or v4 compat addr

==== //depot/projects/netperf/sys/netinet6/in6_ifattach.c#9 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/in6_ifattach.c,v 1.17 2003/10/10 16:04:00 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/in6_ifattach.c,v 1.18 2003/10/17 15:46:31 ume Exp $	*/
 /*	$KAME: in6_ifattach.c,v 1.118 2001/05/24 07:44:00 itojun Exp $	*/
 
 /*
@@ -60,10 +60,6 @@
 
 #include <net/net_osdep.h>
 
-struct in6_ifstat **in6_ifstat = NULL;
-struct icmp6_ifstat **icmp6_ifstat = NULL;
-size_t in6_ifstatmax = 0;
-size_t icmp6_ifstatmax = 0;
 unsigned long in6_maxmtu = 0;
 
 #ifdef IP6_AUTO_LINKLOCAL
@@ -727,7 +723,6 @@
 	struct ifnet *ifp;
 	struct ifnet *altifp;	/* secondary EUI64 source */
 {
-	static size_t if_indexlim = 8;
 	struct in6_ifaddr *ia;
 	struct in6_addr in6;
 
@@ -740,50 +735,6 @@
 	}
 
 	/*
-	 * We have some arrays that should be indexed by if_index.
-	 * since if_index will grow dynamically, they should grow too.
-	 *	struct in6_ifstat **in6_ifstat
-	 *	struct icmp6_ifstat **icmp6_ifstat
-	 */
-	if (in6_ifstat == NULL || icmp6_ifstat == NULL ||
-	    if_index >= if_indexlim) {
-		size_t n;
-		caddr_t q;
-		size_t olim;
-
-		olim = if_indexlim;
-		while (if_index >= if_indexlim)
-			if_indexlim <<= 1;
-
-		/* grow in6_ifstat */
-		n = if_indexlim * sizeof(struct in6_ifstat *);
-		q = (caddr_t)malloc(n, M_IFADDR, M_WAITOK);
-		bzero(q, n);
-		if (in6_ifstat) {
-			bcopy((caddr_t)in6_ifstat, q,
-				olim * sizeof(struct in6_ifstat *));
-			free((caddr_t)in6_ifstat, M_IFADDR);
-		}
-		in6_ifstat = (struct in6_ifstat **)q;
-		in6_ifstatmax = if_indexlim;
-
-		/* grow icmp6_ifstat */
-		n = if_indexlim * sizeof(struct icmp6_ifstat *);
-		q = (caddr_t)malloc(n, M_IFADDR, M_WAITOK);
-		bzero(q, n);
-		if (icmp6_ifstat) {
-			bcopy((caddr_t)icmp6_ifstat, q,
-				olim * sizeof(struct icmp6_ifstat *));
-			free((caddr_t)icmp6_ifstat, M_IFADDR);
-		}
-		icmp6_ifstat = (struct icmp6_ifstat **)q;
-		icmp6_ifstatmax = if_indexlim;
-	}
-
-	/* initialize scope identifiers */
-	scope6_ifattach(ifp);
-
-	/*
 	 * quirks based on interface type
 	 */
 	switch (ifp->if_type) {
@@ -844,20 +795,6 @@
 	/* update dynamically. */
 	if (in6_maxmtu < ifp->if_mtu)
 		in6_maxmtu = ifp->if_mtu;
-
-	if (in6_ifstat[ifp->if_index] == NULL) {
-		in6_ifstat[ifp->if_index] = (struct in6_ifstat *)
-			malloc(sizeof(struct in6_ifstat), M_IFADDR, M_WAITOK);
-		bzero(in6_ifstat[ifp->if_index], sizeof(struct in6_ifstat));
-	}
-	if (icmp6_ifstat[ifp->if_index] == NULL) {
-		icmp6_ifstat[ifp->if_index] = (struct icmp6_ifstat *)
-			malloc(sizeof(struct icmp6_ifstat), M_IFADDR, M_WAITOK);
-		bzero(icmp6_ifstat[ifp->if_index], sizeof(struct icmp6_ifstat));
-	}
-
-	/* initialize NDP variables */
-	nd6_ifattach(ifp);
 }
 
 /*
@@ -987,7 +924,7 @@
 	int generate;
 {
 	u_int8_t nullbuf[8];
-	struct nd_ifinfo *ndi = &nd_ifinfo[ifp->if_index];
+	struct nd_ifinfo *ndi = ND_IFINFO(ifp);
 
 	bzero(nullbuf, sizeof(nullbuf));
 	if (bcmp(ndi->randomid, nullbuf, sizeof(nullbuf)) == 0) {
@@ -1009,9 +946,9 @@
 in6_tmpaddrtimer(ignored_arg)
 	void *ignored_arg;
 {
-	int i;
 	struct nd_ifinfo *ndi;
 	u_int8_t nullbuf[8];
+	struct ifnet *ifp;
 	int s = splnet();
 
 	callout_reset(&in6_tmpaddrtimer_ch,
@@ -1019,8 +956,8 @@
 	    ip6_temp_regen_advance) * hz, in6_tmpaddrtimer, NULL);
 
 	bzero(nullbuf, sizeof(nullbuf));
-	for (i = 1; i < if_index + 1; i++) {
-		ndi = &nd_ifinfo[i];
+	for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) {
+		ndi = ND_IFINFO(ifp);
 		if (bcmp(ndi->randomid, nullbuf, sizeof(nullbuf)) != 0) {
 			/*
 			 * We've been generating a random ID on this interface.

==== //depot/projects/netperf/sys/netinet6/in6_proto.c#5 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/in6_proto.c,v 1.24 2003/10/08 18:26:08 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/in6_proto.c,v 1.25 2003/10/17 15:46:31 ume Exp $	*/
 /*	$KAME: in6_proto.c,v 1.91 2001/05/27 13:28:35 itojun Exp $	*/
 
 /*
@@ -264,7 +264,8 @@
       (struct protosw *)&inet6sw[sizeof(inet6sw)/sizeof(inet6sw[0])], 0,
       in6_inithead,
       offsetof(struct sockaddr_in6, sin6_addr) << 3,
-      sizeof(struct sockaddr_in6) };
+      sizeof(struct sockaddr_in6),
+      in6_domifattach, in6_domifdetach, };
 
 DOMAIN_SET(inet6);
 

==== //depot/projects/netperf/sys/netinet6/in6_src.c#6 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/in6_src.c,v 1.13 2003/10/08 18:26:08 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/in6_src.c,v 1.14 2003/10/17 15:46:31 ume Exp $	*/
 /*	$KAME: in6_src.c,v 1.37 2001/03/29 05:34:31 itojun Exp $	*/
 
 /*
@@ -300,7 +300,7 @@
 	if (in6p && in6p->in6p_hops >= 0)
 		return (in6p->in6p_hops);
 	else if (ifp)
-		return (nd_ifinfo[ifp->if_index].chlim);
+		return (ND_IFINFO(ifp)->chlim);
 	else
 		return (ip6_defhlim);
 }

==== //depot/projects/netperf/sys/netinet6/in6_var.h#3 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/in6_var.h,v 1.13 2003/10/08 18:26:08 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/in6_var.h,v 1.15 2003/10/17 17:50:09 ume Exp $	*/
 /*	$KAME: in6_var.h,v 1.56 2001/03/29 05:34:31 itojun Exp $	*/
 
 /*
@@ -90,6 +90,15 @@
 	u_int32_t ia6t_pltime;	/* prefix lifetime */
 };
 
+struct nd_ifinfo;
+struct scope6_id;
+struct in6_ifextra {
+	struct in6_ifstat *in6_ifstat;
+	struct icmp6_ifstat *icmp6_ifstat;
+	struct nd_ifinfo *nd_ifinfo;
+	struct scope6_id *scope6_id;
+};
+
 struct	in6_ifaddr {
 	struct	ifaddr ia_ifa;		/* protocol-independent info */
 #define	ia_ifp		ia_ifa.ifa_ifp
@@ -445,18 +454,11 @@
 #ifdef _KERNEL
 extern struct in6_ifaddr *in6_ifaddr;
 
-extern struct in6_ifstat **in6_ifstat;
-extern size_t in6_ifstatmax;
 extern struct icmp6stat icmp6stat;
-extern struct icmp6_ifstat **icmp6_ifstat;
-extern size_t icmp6_ifstatmax;
 #define in6_ifstat_inc(ifp, tag) \
 do {								\
-	if ((ifp) && (ifp)->if_index <= if_index		\
-	 && (ifp)->if_index < in6_ifstatmax			\
-	 && in6_ifstat && in6_ifstat[(ifp)->if_index]) {	\
-		in6_ifstat[(ifp)->if_index]->tag++;		\
-	}							\
+	if (ifp)						\
+		((struct in6_ifextra *)((ifp)->if_afdata[AF_INET6]))->in6_ifstat->tag++; \
 } while (/*CONSTCOND*/ 0)
 
 extern struct in6_addr zeroin6_addr;
@@ -565,9 +567,7 @@
 struct	in6_multi *in6_addmulti __P((struct in6_addr *, struct ifnet *,
 	int *));
 void	in6_delmulti __P((struct in6_multi *));
-extern int in6_ifindex2scopeid __P((int));
-extern int in6_mask2len __P((struct in6_addr *, u_char *));
-extern void in6_len2mask __P((struct in6_addr *, int));
+int	in6_mask2len __P((struct in6_addr *, u_char *));
 int	in6_control __P((struct socket *, u_long, caddr_t, struct ifnet *,
 	struct thread *));
 int	in6_update_ifa __P((struct ifnet *, struct in6_aliasreq *,
@@ -576,6 +576,8 @@
 int	in6if_do_dad __P((struct ifnet *));
 void	in6_purgeif __P((struct ifnet *));
 void	in6_savemkludge __P((struct in6_ifaddr *));
+void	*in6_domifattach __P((struct ifnet *));
+void	in6_domifdetach __P((struct ifnet *, void *));
 void	in6_setmaxmtu   __P((void));
 void	in6_restoremkludge __P((struct in6_ifaddr *, struct ifnet *));
 void	in6_purgemkludge __P((struct ifnet *));

==== //depot/projects/netperf/sys/netinet6/ip6_input.c#10 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/ip6_input.c,v 1.54 2003/10/10 19:49:52 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/ip6_input.c,v 1.57 2003/10/17 15:46:31 ume Exp $	*/
 /*	$KAME: ip6_input.c,v 1.259 2002/01/21 04:58:09 jinmei Exp $	*/
 
 /*
@@ -106,6 +106,7 @@
 #include <netinet6/ip6_var.h>
 #include <netinet/in_pcb.h>
 #include <netinet/icmp6.h>
+#include <netinet6/scope6_var.h>
 #include <netinet6/in6_ifattach.h>
 #include <netinet6/nd6.h>
 #include <netinet6/in6_prefix.h>
@@ -196,6 +197,7 @@
 	ip6intrq.ifq_maxlen = ip6qmaxlen;
 	mtx_init(&ip6intrq.ifq_mtx, "ip6_inq", NULL, MTX_DEF);
 	netisr_register(NETISR_IPV6, ip6_input, &ip6intrq);
+	scope6_init();
 	nd6_init();
 	frag6_init();
 #ifndef RANDOM_IP_ID
@@ -209,12 +211,6 @@
 	void *dummy;
 {
 
-	/*
-	 * to route local address of p2p link to loopback,
-	 * assign loopback address first.
-	 */
-	in6_ifattach(&loif[0], NULL);
-
 	/* nd6_timer_init */
 	callout_init(&nd6_timer_ch, 0);
 	callout_reset(&nd6_timer_ch, hz, nd6_timer, NULL);

==== //depot/projects/netperf/sys/netinet6/ip6_output.c#14 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/ip6_output.c,v 1.58 2003/10/10 16:04:00 ume Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/ip6_output.c,v 1.59 2003/10/17 15:46:31 ume Exp $	*/
 /*	$KAME: ip6_output.c,v 1.279 2002/01/26 06:12:30 jinmei Exp $	*/
 
 /*
@@ -794,7 +794,7 @@
 		}
 	}
 	if (ro_pmtu->ro_rt != NULL) {
-		u_int32_t ifmtu = nd_ifinfo[ifp->if_index].linkmtu;
+		u_int32_t ifmtu = ND_IFINFO(ifp)->linkmtu;
 
 		mtu = ro_pmtu->ro_rt->rt_rmx.rmx_mtu;
 		if (mtu > ifmtu || mtu == 0) {
@@ -814,7 +814,7 @@
 				 ro_pmtu->ro_rt->rt_rmx.rmx_mtu = mtu; /* XXX */
 		}
 	} else {
-		mtu = nd_ifinfo[ifp->if_index].linkmtu;
+		mtu = ND_IFINFO(ifp)->linkmtu;
 	}
 
 	/*

==== //depot/projects/netperf/sys/netinet6/nd6.c#11 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/nd6.c,v 1.31 2003/10/14 18:49:08 sam Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/nd6.c,v 1.32 2003/10/17 15:46:31 ume Exp $	*/
 /*	$KAME: nd6.c,v 1.144 2001/05/24 07:44:00 itojun Exp $	*/
 
 /*
@@ -98,14 +98,13 @@
 static int nd6_inuse, nd6_allocated;
 
 struct llinfo_nd6 llinfo_nd6 = {&llinfo_nd6, &llinfo_nd6};
-static size_t nd_ifinfo_indexlim = 8;
-struct nd_ifinfo *nd_ifinfo = NULL;
 struct nd_drhead nd_defrouter;
 struct nd_prhead nd_prefix = { 0 };
 
 int nd6_recalc_reachtm_interval = ND6_RECALC_REACHTM_INTERVAL;
 static struct sockaddr_in6 all1_sa;
 
+static void nd6_setmtu0 __P((struct ifnet *, struct nd_ifinfo *));
 static void nd6_slowtimo __P((void *));
 static int regen_tmpaddr __P((struct in6_ifaddr *));
 
@@ -139,59 +138,42 @@
 	    nd6_slowtimo, NULL);
 }
 
-void
+struct nd_ifinfo *
 nd6_ifattach(ifp)
 	struct ifnet *ifp;
 {
+	struct nd_ifinfo *nd;
 
-	/*
-	 * We have some arrays that should be indexed by if_index.
-	 * since if_index will grow dynamically, they should grow too.
-	 */
-	if (nd_ifinfo == NULL || if_index >= nd_ifinfo_indexlim) {
-		size_t n;
-		caddr_t q;
+	nd = (struct nd_ifinfo *)malloc(sizeof(*nd), M_IP6NDP, M_WAITOK);
+	bzero(nd, sizeof(*nd));
 
-		while (if_index >= nd_ifinfo_indexlim)
-			nd_ifinfo_indexlim <<= 1;
+	nd->initialized = 1;
 
-		/* grow nd_ifinfo */
-		n = nd_ifinfo_indexlim * sizeof(struct nd_ifinfo);
-		q = (caddr_t)malloc(n, M_IP6NDP, M_WAITOK);

>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200310171814.h9HIE0Oh024004>