Module Name:    src
Committed By:   ozaki-r
Date:           Fri Jun 16 02:24:54 UTC 2017

Modified Files:
        src/sys/net: route.h rtsock.c
        src/sys/netinet: if_arp.c
        src/sys/netinet6: nd6.c

Log Message:
Sending a routing message (RTM_ADD) on adding an llentry

A message used to be sent on adding a cloned route. Restore the
behavior for backward compatibility.

Requested by ryo@


To generate a diff of this commit:
cvs rdiff -u -r1.112 -r1.113 src/sys/net/route.h
cvs rdiff -u -r1.214 -r1.215 src/sys/net/rtsock.c
cvs rdiff -u -r1.250 -r1.251 src/sys/netinet/if_arp.c
cvs rdiff -u -r1.232 -r1.233 src/sys/netinet6/nd6.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/route.h
diff -u src/sys/net/route.h:1.112 src/sys/net/route.h:1.113
--- src/sys/net/route.h:1.112	Tue Apr 11 13:55:54 2017
+++ src/sys/net/route.h	Fri Jun 16 02:24:54 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.h,v 1.112 2017/04/11 13:55:54 roy Exp $	*/
+/*	$NetBSD: route.h,v 1.113 2017/06/16 02:24:54 ozaki-r Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -500,6 +500,10 @@ int	rt_msg3(int, struct rt_addrinfo *, v
 void	rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
 void	route_enqueue(struct mbuf *, int);
 
+struct llentry;
+void	rt_clonedmsg(const struct sockaddr *, const struct ifnet *,
+	    const struct rtentry *);
+
 /* rtbl */
 int	rt_addaddr(rtbl_t *, struct rtentry *, const struct sockaddr *);
 void	rt_assert_inactive(const struct rtentry *);

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.214 src/sys/net/rtsock.c:1.215
--- src/sys/net/rtsock.c:1.214	Thu Jun 15 02:51:45 2017
+++ src/sys/net/rtsock.c	Fri Jun 16 02:24:54 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.214 2017/06/15 02:51:45 ozaki-r Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.215 2017/06/16 02:24:54 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.214 2017/06/15 02:51:45 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.215 2017/06/16 02:24:54 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1628,6 +1628,44 @@ COMPATNAME(rt_ieee80211msg)(struct ifnet
 	COMPATNAME(route_enqueue)(m, 0);
 }
 
+#ifndef COMPAT_RTSOCK
+/*
+ * Send a routing message as mimicing that a cloned route is added.
+ */
+void
+rt_clonedmsg(const struct sockaddr *dst, const struct ifnet *ifp,
+    const struct rtentry *rt)
+{
+	struct rt_addrinfo info;
+	/* Mimic flags exactly */
+#define RTF_LLINFO	0x400
+#define RTF_CLONED	0x2000
+	int flags = RTF_UP | RTF_HOST | RTF_DONE | RTF_LLINFO | RTF_CLONED;
+	union {
+		struct sockaddr sa;
+		struct sockaddr_storage ss;
+		struct sockaddr_dl sdl;
+	} u;
+	uint8_t namelen = strlen(ifp->if_xname);
+	uint8_t addrlen = ifp->if_addrlen;
+
+	if (rt == NULL)
+		return; /* XXX */
+
+	memset(&info, 0, sizeof(info));
+	info.rti_info[RTAX_DST] = dst;
+	sockaddr_dl_init(&u.sdl, sizeof(u.ss), ifp->if_index, ifp->if_type,
+	    NULL, namelen, NULL, addrlen);
+	info.rti_info[RTAX_GATEWAY] = &u.sa;
+	info.rti_info[RTAX_IFP] = rt->rt_ifp->if_dl->ifa_addr;
+	info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
+
+	rt_missmsg(RTM_ADD, &info, flags, 0);
+#undef RTF_LLINFO
+#undef RTF_CLONED
+}
+#endif /* COMPAT_RTSOCK */
+
 /*
  * This is used in dumping the kernel table via sysctl().
  */

Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.250 src/sys/netinet/if_arp.c:1.251
--- src/sys/netinet/if_arp.c:1.250	Thu May 18 06:33:11 2017
+++ src/sys/netinet/if_arp.c	Fri Jun 16 02:24:54 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arp.c,v 1.250 2017/05/18 06:33:11 ozaki-r Exp $	*/
+/*	$NetBSD: if_arp.c,v 1.251 2017/06/16 02:24:54 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.250 2017/05/18 06:33:11 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.251 2017/06/16 02:24:54 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -760,8 +760,13 @@ notfound:
 		IF_AFDATA_WUNLOCK(ifp);
 		if (la == NULL)
 			ARP_STATINC(ARP_STAT_ALLOCFAIL);
-		else
+		else {
+			struct sockaddr_in sin;
+
 			arp_init_llentry(ifp, la);
+			sockaddr_in_init(&sin, &la->r_l3addr.addr4, 0);
+			rt_clonedmsg(sintosa(&sin), ifp, rt);
+		}
 	} else if (LLE_TRY_UPGRADE(la) == 0) {
 		create_lookup = "lookup";
 		LLE_RUNLOCK(la);

Index: src/sys/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.232 src/sys/netinet6/nd6.c:1.233
--- src/sys/netinet6/nd6.c:1.232	Thu Jun  1 02:45:14 2017
+++ src/sys/netinet6/nd6.c	Fri Jun 16 02:24:54 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.c,v 1.232 2017/06/01 02:45:14 chs Exp $	*/
+/*	$NetBSD: nd6.c,v 1.233 2017/06/16 02:24:54 ozaki-r Exp $	*/
 /*	$KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.232 2017/06/01 02:45:14 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.233 2017/06/16 02:24:54 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -2298,6 +2298,7 @@ nd6_resolve(struct ifnet *ifp, const str
 	/* Slow path */
 	ln = nd6_lookup(&dst->sin6_addr, ifp, true);
 	if (ln == NULL && nd6_is_addr_neighbor(dst, ifp))  {
+		struct sockaddr_in6 sin6;
 		/*
 		 * Since nd6_is_addr_neighbor() internally calls nd6_lookup(),
 		 * the condition below is not very efficient.  But we believe
@@ -2313,6 +2314,10 @@ nd6_resolve(struct ifnet *ifp, const str
 			m_freem(m);
 			return ENOBUFS;
 		}
+
+		sockaddr_in6_init(&sin6, &ln->r_l3addr.addr6, 0, 0, 0);
+		rt_clonedmsg(sin6tosa(&sin6), ifp, rt);
+
 		created = true;
 	}
 

Reply via email to