Module Name:    src
Committed By:   ozaki-r
Date:           Thu Jun 22 09:56:48 UTC 2017

Modified Files:
        src/sys/net: if_llatbl.c if_llatbl.h route.c
        src/tests/net/ndp: t_ra.sh

Log Message:
Purge all related L2 caches on removing a route

The change addresses situations similar to PR 51179.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/net/if_llatbl.c
cvs rdiff -u -r1.10 -r1.11 src/sys/net/if_llatbl.h
cvs rdiff -u -r1.195 -r1.196 src/sys/net/route.c
cvs rdiff -u -r1.28 -r1.29 src/tests/net/ndp/t_ra.sh

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/if_llatbl.c
diff -u src/sys/net/if_llatbl.c:1.18 src/sys/net/if_llatbl.c:1.19
--- src/sys/net/if_llatbl.c:1.18	Fri Mar  3 06:27:20 2017
+++ src/sys/net/if_llatbl.c	Thu Jun 22 09:56:48 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_llatbl.c,v 1.18 2017/03/03 06:27:20 msaitoh Exp $	*/
+/*	$NetBSD: if_llatbl.c,v 1.19 2017/06/22 09:56:48 ozaki-r Exp $	*/
 /*
  * Copyright (c) 2004 Luigi Rizzo, Alessandro Cerri. All rights reserved.
  * Copyright (c) 2004-2008 Qing Li. All rights reserved.
@@ -486,8 +486,8 @@ lltable_drain(int af)
 }
 
 void
-lltable_prefix_free(int af, struct sockaddr *prefix, struct sockaddr *mask,
-    u_int flags)
+lltable_prefix_free(const int af, const struct sockaddr *prefix,
+    const struct sockaddr *mask, const u_int flags)
 {
 	struct lltable *llt;
 

Index: src/sys/net/if_llatbl.h
diff -u src/sys/net/if_llatbl.h:1.10 src/sys/net/if_llatbl.h:1.11
--- src/sys/net/if_llatbl.h:1.10	Wed Dec 21 08:47:02 2016
+++ src/sys/net/if_llatbl.h	Thu Jun 22 09:56:48 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_llatbl.h,v 1.10 2016/12/21 08:47:02 ozaki-r Exp $	*/
+/*	$NetBSD: if_llatbl.h,v 1.11 2017/06/22 09:56:48 ozaki-r Exp $	*/
 /*
  * Copyright (c) 2004 Luigi Rizzo, Alessandro Cerri. All rights reserved.
  * Copyright (c) 2004-2008 Qing Li. All rights reserved.
@@ -254,8 +254,8 @@ void lltableinit(void);
 struct lltable *lltable_allocate_htbl(uint32_t hsize);
 void		lltable_free(struct lltable *);
 void		lltable_link(struct lltable *llt);
-void		lltable_prefix_free(int, struct sockaddr *,
-		    struct sockaddr *, u_int);
+void		lltable_prefix_free(const int, const struct sockaddr *,
+		    const struct sockaddr *, const u_int);
 void		lltable_drain(int);
 void		lltable_purge_entries(struct lltable *);
 int		lltable_sysctl_dumparp(int, struct rt_walkarg *);

Index: src/sys/net/route.c
diff -u src/sys/net/route.c:1.195 src/sys/net/route.c:1.196
--- src/sys/net/route.c:1.195	Thu Jun 22 08:31:54 2017
+++ src/sys/net/route.c	Thu Jun 22 09:56:48 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.c,v 1.195 2017/06/22 08:31:54 ozaki-r Exp $	*/
+/*	$NetBSD: route.c,v 1.196 2017/06/22 09:56:48 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.195 2017/06/22 08:31:54 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.196 2017/06/22 09:56:48 ozaki-r Exp $");
 
 #include <sys/param.h>
 #ifdef RTFLUSH_DEBUG
@@ -123,6 +123,9 @@ __KERNEL_RCSID(0, "$NetBSD: route.c,v 1.
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/route.h>
+#if defined(INET) || defined(INET6)
+#include <net/if_llatbl.h>
+#endif
 
 #include <netinet/in.h>
 #include <netinet/in_var.h>
@@ -1249,6 +1252,10 @@ rtrequest1(int req, struct rt_addrinfo *
 		need_unlock = false;
 		rt_timer_remove_all(rt);
 		rtcache_clear_rtentry(dst->sa_family, rt);
+#if defined(INET) || defined(INET6)
+		if (netmask != NULL)
+			lltable_prefix_free(dst->sa_family, dst, netmask, 0);
+#endif
 		if (ret_nrt == NULL) {
 			/* Adjust the refcount */
 			rt_ref(rt);

Index: src/tests/net/ndp/t_ra.sh
diff -u src/tests/net/ndp/t_ra.sh:1.28 src/tests/net/ndp/t_ra.sh:1.29
--- src/tests/net/ndp/t_ra.sh:1.28	Wed Jun 21 09:05:31 2017
+++ src/tests/net/ndp/t_ra.sh	Thu Jun 22 09:56:48 2017
@@ -1,4 +1,4 @@
-#	$NetBSD: t_ra.sh,v 1.28 2017/06/21 09:05:31 ozaki-r Exp $
+#	$NetBSD: t_ra.sh,v 1.29 2017/06/22 09:56:48 ozaki-r Exp $
 #
 # Copyright (c) 2015 Internet Initiative Japan Inc.
 # All rights reserved.
@@ -334,7 +334,6 @@ ra_flush_defrouter_entries_body()
 	atf_check -s exit:0 -o empty rump.ndp -r
 	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
 	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
-	atf_check -s exit:0 -o match:"$ONEDAYISH S R" rump.ndp -n -a
 	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
 	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
 	unset RUMP_SERVER
@@ -762,7 +761,6 @@ ra_defrouter_expiration_body()
 	atf_check -s exit:0 -o not-match:'if=shmif0' rump.ndp -r
 	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
 	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
-	atf_check -s exit:0 -o match:"$ONEDAYISH S R" rump.ndp -n -a
 	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
 	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
 	unset RUMP_SERVER

Reply via email to