Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jan 2014 01:44:35 +0000 (UTC)
From:      Glen Barber <gjb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r260500 - in user/gjb/hacking/release-embedded: contrib/atf/atf-c++/detail sbin/geom/class/part sys/arm/arm sys/arm/include sys/conf sys/net sys/netinet6
Message-ID:  <201401100144.s0A1iZCW043639@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gjb
Date: Fri Jan 10 01:44:34 2014
New Revision: 260500
URL: http://svnweb.freebsd.org/changeset/base/260500

Log:
  MFH: tracking commit (head@r260487)
    - Unbreak all the things.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  user/gjb/hacking/release-embedded/contrib/atf/atf-c++/detail/test_helpers.cpp
  user/gjb/hacking/release-embedded/sbin/geom/class/part/geom_part.c   (contents, props changed)
  user/gjb/hacking/release-embedded/sys/arm/arm/devmap.c
  user/gjb/hacking/release-embedded/sys/arm/arm/machdep.c
  user/gjb/hacking/release-embedded/sys/arm/include/devmap.h
  user/gjb/hacking/release-embedded/sys/conf/Makefile.arm
  user/gjb/hacking/release-embedded/sys/net/route.c
  user/gjb/hacking/release-embedded/sys/net/route.h
  user/gjb/hacking/release-embedded/sys/net/rtsock.c
  user/gjb/hacking/release-embedded/sys/netinet6/ip6_mroute.h
Directory Properties:
  user/gjb/hacking/release-embedded/   (props changed)

Modified: user/gjb/hacking/release-embedded/contrib/atf/atf-c++/detail/test_helpers.cpp
==============================================================================
--- user/gjb/hacking/release-embedded/contrib/atf/atf-c++/detail/test_helpers.cpp	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/contrib/atf/atf-c++/detail/test_helpers.cpp	Fri Jan 10 01:44:34 2014	(r260500)
@@ -67,14 +67,14 @@ build_check_cxx_o(const atf::tests::tc& 
 void
 header_check(const char *hdrname)
 {
-    std::ofstream srcfile("test.c");
+    std::ofstream srcfile("test.cpp");
     ATF_REQUIRE(srcfile);
     srcfile << "#include <" << hdrname << ">\n";
     srcfile.close();
 
     const std::string failmsg = std::string("Header check failed; ") +
         hdrname + " is not self-contained";
-    build_check_cxx_o_aux(atf::fs::path("test.c"), failmsg.c_str(), true);
+    build_check_cxx_o_aux(atf::fs::path("test.cpp"), failmsg.c_str(), true);
 }
 
 atf::fs::path

Modified: user/gjb/hacking/release-embedded/sbin/geom/class/part/geom_part.c
==============================================================================
--- user/gjb/hacking/release-embedded/sbin/geom/class/part/geom_part.c	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sbin/geom/class/part/geom_part.c	Fri Jan 10 01:44:34 2014	(r260500)
@@ -454,8 +454,19 @@ gpart_autofill(struct gctl_req *req)
 	if (s == NULL)
 		abort();
 	gp = find_geom(cp, s);
-	if (gp == NULL)
-		errx(EXIT_FAILURE, "No such geom: %s.", s);
+	if (gp == NULL) {
+		if (g_device_path(s) == NULL) {
+			errx(EXIT_FAILURE, "No such geom %s.", s);
+		} else {
+			/*
+			 * We don't free memory allocated by g_device_path() as
+			 * we are about to exit.
+			 */
+			errx(EXIT_FAILURE,
+			    "No partitioning scheme found on geom %s. Create one first using 'gpart create'.",
+			    s);
+		}
+	}
 	pp = LIST_FIRST(&gp->lg_consumer)->lg_provider;
 	if (pp == NULL)
 		errx(EXIT_FAILURE, "Provider for geom %s not found.", s);

Modified: user/gjb/hacking/release-embedded/sys/arm/arm/devmap.c
==============================================================================
--- user/gjb/hacking/release-embedded/sys/arm/arm/devmap.c	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/arm/arm/devmap.c	Fri Jan 10 01:44:34 2014	(r260500)
@@ -31,6 +31,8 @@ __FBSDID("$FreeBSD$");
  * Routines for mapping device memory.
  */
 
+#include "opt_ddb.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <vm/vm.h>
@@ -54,6 +56,36 @@ static u_int			akva_devmap_idx;
 static vm_offset_t		akva_devmap_vaddr = ARM_VECTORS_HIGH;
 
 /*
+ * Print the contents of the static mapping table using the provided printf-like
+ * output function (which will be either printf or db_printf).
+ */
+static void
+devmap_dump_table(int (*prfunc)(const char *, ...))
+{
+	const struct arm_devmap_entry *pd;
+
+	if (devmap_table == NULL || devmap_table[0].pd_size == 0) {
+		prfunc("No static device mappings.\n");
+		return;
+	}
+
+	prfunc("Static device mappings:\n");
+	for (pd = devmap_table; pd->pd_size != 0; ++pd) {
+		prfunc("  0x%08x - 0x%08x mapped at VA 0x%08x\n",
+		    pd->pd_pa, pd->pd_pa + pd->pd_size - 1, pd->pd_va);
+	}
+}
+
+/*
+ * Print the contents of the static mapping table.  Used for bootverbose.
+ */
+void
+arm_devmap_print_table()
+{
+	devmap_dump_table(printf);
+}
+
+/*
  * Return the "last" kva address used by the registered devmap table.  It's
  * actually the lowest address used by the static mappings, i.e., the address of
  * the first unusable byte of KVA.
@@ -266,3 +298,13 @@ pmap_unmapdev(vm_offset_t va, vm_size_t 
 	kva_free(va, origsize);
 }
 
+#ifdef DDB
+#include <ddb/ddb.h>
+
+DB_SHOW_COMMAND(devmap, db_show_devmap)
+{
+	devmap_dump_table(db_printf);
+}
+
+#endif /* DDB */
+

Modified: user/gjb/hacking/release-embedded/sys/arm/arm/machdep.c
==============================================================================
--- user/gjb/hacking/release-embedded/sys/arm/arm/machdep.c	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/arm/arm/machdep.c	Fri Jan 10 01:44:34 2014	(r260500)
@@ -379,10 +379,10 @@ cpu_startup(void *dummy)
 			vm_paddr_t size;
 
 			size = phys_avail[indx + 1] - phys_avail[indx];
-			printf("%#08jx - %#08jx, %ju bytes (%ju pages)\n",
+			printf("  0x%08jx - 0x%08jx, %ju KBytes (%ju pages)\n",
 			    (uintmax_t)phys_avail[indx],
 			    (uintmax_t)phys_avail[indx + 1] - 1,
-			    (uintmax_t)size, (uintmax_t)size / PAGE_SIZE);
+			    (uintmax_t)size / 1024, (uintmax_t)size / PAGE_SIZE);
 		}
 	}
 
@@ -392,6 +392,9 @@ cpu_startup(void *dummy)
 	    (uintmax_t)ptoa(cnt.v_free_count),
 	    (uintmax_t)ptoa(cnt.v_free_count) / 1048576);
 
+	if (bootverbose)
+		arm_devmap_print_table();
+
 	bufinit();
 	vm_pager_bufferinit();
 	pcb->un_32.pcb32_und_sp = (u_int)thread0.td_kstack +

Modified: user/gjb/hacking/release-embedded/sys/arm/include/devmap.h
==============================================================================
--- user/gjb/hacking/release-embedded/sys/arm/include/devmap.h	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/arm/include/devmap.h	Fri Jan 10 01:44:34 2014	(r260500)
@@ -87,4 +87,7 @@ void arm_devmap_bootstrap(vm_offset_t _l
 void *     arm_devmap_ptov(vm_paddr_t _pa, vm_size_t _sz);
 vm_paddr_t arm_devmap_vtop(void * _va, vm_size_t _sz);
 
+/* Print the static mapping table; used for bootverbose output. */
+void arm_devmap_print_table(void);
+
 #endif

Modified: user/gjb/hacking/release-embedded/sys/conf/Makefile.arm
==============================================================================
--- user/gjb/hacking/release-embedded/sys/conf/Makefile.arm	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/conf/Makefile.arm	Fri Jan 10 01:44:34 2014	(r260500)
@@ -39,16 +39,20 @@ SYSTEM_DEP:= ${SYSTEM_DEP:$S/conf/ldscri
 STRIP_FLAGS = -S
 .endif
 
-CFLAGS.gcc += -mno-thumb-interwork
+.if ${COMPILER_TYPE} != "clang"
+CFLAGS += -mno-thumb-interwork
+.endif
 
 .if empty(DDB_ENABLED)
-.if defined(WITHOUT_ARM_EABI)
-CFLAGS.gcc += -mno-apcs-frame
+.if defined(WITHOUT_ARM_EABI) && ${COMPILER_TYPE} != "clang"
+CFLAGS += -mno-apcs-frame
 .endif
 .elif !defined(WITHOUT_ARM_EABI)
 CFLAGS += -funwind-tables
+.if ${COMPILER_TYPE} == "clang"
 # clang requires us to tell it to emit assembly with unwind information
-CFLAGS.clang += -mllvm -arm-enable-ehabi
+CFLAGS += -mllvm -arm-enable-ehabi
+.endif
 .endif
 
 SYSTEM_LD_ = ${LD} -Bdynamic -T ldscript.$M.noheader ${LDFLAGS} \

Modified: user/gjb/hacking/release-embedded/sys/net/route.c
==============================================================================
--- user/gjb/hacking/release-embedded/sys/net/route.c	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/net/route.c	Fri Jan 10 01:44:34 2014	(r260500)
@@ -37,6 +37,7 @@
 #include "opt_inet.h"
 #include "opt_inet6.h"
 #include "opt_route.h"
+#include "opt_sctp.h"
 #include "opt_mrouting.h"
 #include "opt_mpath.h"
 
@@ -52,6 +53,7 @@
 #include <sys/proc.h>
 #include <sys/domain.h>
 #include <sys/kernel.h>
+#include <sys/kdb.h>
 
 #include <net/if.h>
 #include <net/if_var.h>
@@ -86,6 +88,13 @@
 #define	RT_NUMFIBS	1
 #endif
 
+#if defined(INET) || defined(INET6)
+#ifdef SCTP
+extern void sctp_addr_change(struct ifaddr *ifa, int cmd);
+#endif /* SCTP */
+#endif
+
+
 /* This is read-only.. */
 u_int rt_numfibs = RT_NUMFIBS;
 SYSCTL_UINT(_net, OID_AUTO, fibs, CTLFLAG_RD, &rt_numfibs, 0, "");
@@ -118,7 +127,8 @@ VNET_DEFINE(int, rttrash);		/* routes no
 
 
 /* compare two sockaddr structures */
-#define	sa_equal(a1, a2) (bcmp((a1), (a2), (a1)->sa_len) == 0)
+#define	sa_equal(a1, a2) (((a1)->sa_len == (a2)->sa_len) && \
+    (bcmp((a1), (a2), (a1)->sa_len) == 0))
 
 /*
  * Convert a 'struct radix_node *' to a 'struct rtentry *'.
@@ -1731,3 +1741,99 @@ rtinit(struct ifaddr *ifa, int cmd, int 
 	}
 	return (rtinit1(ifa, cmd, flags, fib));
 }
+
+/*
+ * Announce interface address arrival/withdraw
+ * Returns 0 on success.
+ */
+int
+rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum)
+{
+
+	KASSERT(cmd == RTM_ADD || cmd == RTM_DELETE,
+		("unexpected cmd %u", cmd));
+	
+	if (fibnum != RT_ALL_FIBS) {
+		KASSERT(fibnum >= 0 && fibnum < rt_numfibs, ("%s: "
+		    "fibnum out of range 0 <= %d < %d", __func__,
+		     fibnum, rt_numfibs));
+	}
+
+	return (rtsock_addrmsg(cmd, ifa, fibnum));
+}
+
+
+/*
+ * Announce route addition/removal
+ * Users of this function MUST validate input data BEFORE calling.
+ * However we have to be able to handle invalid data:
+ * if some userland app sends us "invalid" route message (invalid mask,
+ * no dst, wrokg address families, etc...) we need to pass it back
+ * to app (and any other rtsock consumers) with rtm_errno field set to
+ * non-zero value.
+ * Returns 0 on success.
+ */
+int
+rt_routemsg(int cmd, struct ifnet *ifp, int error, struct rtentry *rt,
+    int fibnum)
+{
+
+	KASSERT(cmd == RTM_ADD || cmd == RTM_DELETE,
+		("unexpected cmd %u", cmd));
+	
+	if (fibnum != RT_ALL_FIBS) {
+		KASSERT(fibnum >= 0 && fibnum < rt_numfibs, ("%s: "
+		    "fibnum out of range 0 <= %d < %d", __func__,
+		     fibnum, rt_numfibs));
+	}
+
+	KASSERT(rt_key(rt) != NULL, (":%s: rt_key must be supplied", __func__));
+
+	return (rtsock_routemsg(cmd, ifp, error, rt, fibnum));
+}
+
+void
+rt_newaddrmsg(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt)
+{
+
+	rt_newaddrmsg_fib(cmd, ifa, error, rt, RT_ALL_FIBS);
+}
+
+/*
+ * This is called to generate messages from the routing socket
+ * indicating a network interface has had addresses associated with it.
+ */
+void
+rt_newaddrmsg_fib(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt,
+    int fibnum)
+{
+
+	KASSERT(cmd == RTM_ADD || cmd == RTM_DELETE,
+		("unexpected cmd %u", cmd));
+	if (fibnum != RT_ALL_FIBS) {
+		KASSERT(fibnum >= 0 && fibnum < rt_numfibs, ("%s: "
+		    "fibnum out of range 0 <= %d < %d", __func__,
+		     fibnum, rt_numfibs));
+	}
+
+#if defined(INET) || defined(INET6)
+#ifdef SCTP
+	/*
+	 * notify the SCTP stack
+	 * this will only get called when an address is added/deleted
+	 * XXX pass the ifaddr struct instead if ifa->ifa_addr...
+	 */
+	sctp_addr_change(ifa, cmd);
+#endif /* SCTP */
+#endif
+	if (cmd == RTM_ADD) {
+		rt_addrmsg(cmd, ifa, fibnum);
+		if (rt != NULL)
+			rt_routemsg(cmd, ifa->ifa_ifp, error, rt, fibnum);
+	} else {
+		if (rt != NULL)
+			rt_routemsg(cmd, ifa->ifa_ifp, error, rt, fibnum);
+		rt_addrmsg(cmd, ifa, fibnum);
+	}
+}
+

Modified: user/gjb/hacking/release-embedded/sys/net/route.h
==============================================================================
--- user/gjb/hacking/release-embedded/sys/net/route.h	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/net/route.h	Fri Jan 10 01:44:34 2014	(r260500)
@@ -369,10 +369,15 @@ void	 rt_missmsg(int, struct rt_addrinfo
 void	 rt_missmsg_fib(int, struct rt_addrinfo *, int, int, int);
 void	 rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
 void	 rt_newaddrmsg_fib(int, struct ifaddr *, int, struct rtentry *, int);
+int	 rt_addrmsg(int, struct ifaddr *, int);
+int	 rt_routemsg(int, struct ifnet *ifp, int, struct rtentry *, int);
 void	 rt_newmaddrmsg(int, struct ifmultiaddr *);
 int	 rt_setgate(struct rtentry *, struct sockaddr *, struct sockaddr *);
 void 	 rt_maskedcopy(struct sockaddr *, struct sockaddr *, struct sockaddr *);
 
+int	rtsock_addrmsg(int, struct ifaddr *, int);
+int	rtsock_routemsg(int, struct ifnet *ifp, int, struct rtentry *, int);
+
 /*
  * Note the following locking behavior:
  *

Modified: user/gjb/hacking/release-embedded/sys/net/rtsock.c
==============================================================================
--- user/gjb/hacking/release-embedded/sys/net/rtsock.c	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/net/rtsock.c	Fri Jan 10 01:44:34 2014	(r260500)
@@ -30,7 +30,6 @@
  * $FreeBSD$
  */
 #include "opt_compat.h"
-#include "opt_sctp.h"
 #include "opt_mpath.h"
 #include "opt_inet.h"
 #include "opt_inet6.h"
@@ -70,12 +69,6 @@
 #include <netinet6/scope6_var.h>
 #endif
 
-#if defined(INET) || defined(INET6)
-#ifdef SCTP
-extern void sctp_addr_change(struct ifaddr *ifa, int cmd);
-#endif /* SCTP */
-#endif
-
 #ifdef COMPAT_FREEBSD32
 #include <sys/mount.h>
 #include <compat/freebsd32/freebsd32.h>
@@ -1334,91 +1327,95 @@ rt_ifmsg(struct ifnet *ifp)
 }
 
 /*
- * This is called to generate messages from the routing socket
- * indicating a network interface has had addresses associated with it.
- * if we ever reverse the logic and replace messages TO the routing
- * socket indicate a request to configure interfaces, then it will
- * be unnecessary as the routing socket will automatically generate
- * copies of it.
+ * Announce interface address arrival/withdraw.
+ * Please do not call directly, use rt_addrmsg().
+ * Assume input data to be valid.
+ * Returns 0 on success.
  */
-void
-rt_newaddrmsg_fib(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt,
-    int fibnum)
+int
+rtsock_addrmsg(int cmd, struct ifaddr *ifa, int fibnum)
 {
 	struct rt_addrinfo info;
-	struct sockaddr *sa = NULL;
-	int pass;
-	struct mbuf *m = NULL;
+	struct sockaddr *sa;
+	int ncmd;
+	struct mbuf *m;
+	struct ifa_msghdr *ifam;
 	struct ifnet *ifp = ifa->ifa_ifp;
 
-	KASSERT(cmd == RTM_ADD || cmd == RTM_DELETE,
-		("unexpected cmd %u", cmd));
-#if defined(INET) || defined(INET6)
-#ifdef SCTP
-	/*
-	 * notify the SCTP stack
-	 * this will only get called when an address is added/deleted
-	 * XXX pass the ifaddr struct instead if ifa->ifa_addr...
-	 */
-	sctp_addr_change(ifa, cmd);
-#endif /* SCTP */
-#endif
 	if (route_cb.any_count == 0)
-		return;
-	for (pass = 1; pass < 3; pass++) {
-		bzero((caddr_t)&info, sizeof(info));
-		if ((cmd == RTM_ADD && pass == 1) ||
-		    (cmd == RTM_DELETE && pass == 2)) {
-			struct ifa_msghdr *ifam;
-			int ncmd = cmd == RTM_ADD ? RTM_NEWADDR : RTM_DELADDR;
+		return (0);
 
-			info.rti_info[RTAX_IFA] = sa = ifa->ifa_addr;
-			info.rti_info[RTAX_IFP] = ifp->if_addr->ifa_addr;
-			info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask;
-			info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr;
-			if ((m = rt_msg1(ncmd, &info)) == NULL)
-				continue;
-			ifam = mtod(m, struct ifa_msghdr *);
-			ifam->ifam_index = ifp->if_index;
-			ifam->ifam_metric = ifa->ifa_metric;
-			ifam->ifam_flags = ifa->ifa_flags;
-			ifam->ifam_addrs = info.rti_addrs;
-		}
-		if ((cmd == RTM_ADD && pass == 2) ||
-		    (cmd == RTM_DELETE && pass == 1)) {
-			struct rt_msghdr *rtm;
+	ncmd = cmd == RTM_ADD ? RTM_NEWADDR : RTM_DELADDR;
 
-			if (rt == NULL)
-				continue;
-			info.rti_info[RTAX_NETMASK] = rt_mask(rt);
-			info.rti_info[RTAX_DST] = sa = rt_key(rt);
-			info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
-			if ((m = rt_msg1(cmd, &info)) == NULL)
-				continue;
-			rtm = mtod(m, struct rt_msghdr *);
-			rtm->rtm_index = ifp->if_index;
-			rtm->rtm_flags |= rt->rt_flags;
-			rtm->rtm_errno = error;
-			rtm->rtm_addrs = info.rti_addrs;
-		}
-		if (fibnum != RT_ALL_FIBS) {
-			KASSERT(fibnum >= 0 && fibnum < rt_numfibs, ("%s: "
-			    "fibnum out of range 0 <= %d < %d", __func__,
-			     fibnum, rt_numfibs));
-			M_SETFIB(m, fibnum);
-			m->m_flags |= RTS_FILTER_FIB;
-		}
-		rt_dispatch(m, sa ? sa->sa_family : AF_UNSPEC);
+	bzero((caddr_t)&info, sizeof(info));
+	info.rti_info[RTAX_IFA] = sa = ifa->ifa_addr;
+	info.rti_info[RTAX_IFP] = ifp->if_addr->ifa_addr;
+	info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask;
+	info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr;
+	if ((m = rt_msg1(ncmd, &info)) == NULL)
+		return (ENOBUFS);
+	ifam = mtod(m, struct ifa_msghdr *);
+	ifam->ifam_index = ifp->if_index;
+	ifam->ifam_metric = ifa->ifa_metric;
+	ifam->ifam_flags = ifa->ifa_flags;
+	ifam->ifam_addrs = info.rti_addrs;
+
+	if (fibnum != RT_ALL_FIBS) {
+		M_SETFIB(m, fibnum);
+		m->m_flags |= RTS_FILTER_FIB;
 	}
+
+	rt_dispatch(m, sa ? sa->sa_family : AF_UNSPEC);
+
+	return (0);
 }
 
-void
-rt_newaddrmsg(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt)
+/*
+ * Announce route addition/removal.
+ * Please do not call directly, use rt_routemsg().
+ * Note that @rt data MAY be inconsistent/invalid:
+ * if some userland app sends us "invalid" route message (invalid mask,
+ * no dst, wrong address families, etc...) we need to pass it back
+ * to app (and any other rtsock consumers) with rtm_errno field set to
+ * non-zero value.
+ *
+ * Returns 0 on success.
+ */
+int
+rtsock_routemsg(int cmd, struct ifnet *ifp, int error, struct rtentry *rt,
+    int fibnum)
 {
+	struct rt_addrinfo info;
+	struct sockaddr *sa;
+	struct mbuf *m;
+	struct rt_msghdr *rtm;
 
-	rt_newaddrmsg_fib(cmd, ifa, error, rt, RT_ALL_FIBS);
+	if (route_cb.any_count == 0)
+		return (0);
+
+	bzero((caddr_t)&info, sizeof(info));
+	info.rti_info[RTAX_NETMASK] = rt_mask(rt);
+	info.rti_info[RTAX_DST] = sa = rt_key(rt);
+	info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+	if ((m = rt_msg1(cmd, &info)) == NULL)
+		return (ENOBUFS);
+	rtm = mtod(m, struct rt_msghdr *);
+	rtm->rtm_index = ifp->if_index;
+	rtm->rtm_flags |= rt->rt_flags;
+	rtm->rtm_errno = error;
+	rtm->rtm_addrs = info.rti_addrs;
+
+	if (fibnum != RT_ALL_FIBS) {
+		M_SETFIB(m, fibnum);
+		m->m_flags |= RTS_FILTER_FIB;
+	}
+
+	rt_dispatch(m, sa ? sa->sa_family : AF_UNSPEC);
+
+	return (0);
 }
 
+
 /*
  * This is the analogue to the rt_newaddrmsg which performs the same
  * function but for multicast group memberhips.  This is easier since

Modified: user/gjb/hacking/release-embedded/sys/netinet6/ip6_mroute.h
==============================================================================
--- user/gjb/hacking/release-embedded/sys/netinet6/ip6_mroute.h	Thu Jan  9 23:52:55 2014	(r260499)
+++ user/gjb/hacking/release-embedded/sys/netinet6/ip6_mroute.h	Fri Jan 10 01:44:34 2014	(r260500)
@@ -194,7 +194,7 @@ struct sioc_mif_req6 {
 	u_quad_t obytes;	/* Output byte count on mif		*/
 };
 
-#ifdef _KERNEL
+#if defined(_KERNEL) || defined(KERNEL)
 /*
  * The kernel's multicast-interface structure.
  */



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