shithub: riscv

Download patch

ref: 02b867f01eca1fefbe8b29205c8a8d4c13d2ffd0
parent: 03bcc1520a54573c7149233cf51975e0fe077399
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Sep 28 14:13:01 EDT 2018

devip: only add interface route for "on-link" prefixes

when a prefix is added with the onlink flag clear, packets
towards that prefix needs to be send to the default gateway
so we omit adding the interface route.

when the on-link flag gets changed to 1 later, we add the
interface route.

the on-link flag is sticky, so theres no way to clear it back
to zero except removing and re-adding the prefix.

--- a/sys/src/9/ip/ipifc.c
+++ b/sys/src/9/ip/ipifc.c
@@ -505,7 +505,14 @@
 	/* ignore if this is already a local address for this ifc */
 	if((lifc = iplocalonifc(ifc, ip)) != nil){
 		if(lifcp != nil) {
-			lifc->onlink = lifcp->onlink;
+			if(!lifc->onlink && lifcp->onlink){
+				lifc->onlink = 1;
+				addroute(f, lifc->remote, lifc->mask, ip, IPallbits,
+					lifc->remote, lifc->type, ifc, tifc);
+				if(v6addrtype(ip) != linklocalv6)
+					addroute(f, lifc->remote, lifc->mask, ip, IPnoaddr,
+						lifc->remote, lifc->type, ifc, tifc);
+			}
 			lifc->autoflag = lifcp->autoflag;
 			lifc->validlt = lifcp->validlt;
 			lifc->preflt = lifcp->preflt;
@@ -546,9 +553,11 @@
 	*l = lifc;
 
 	/* add route for this logical interface */
-	addroute(f, rem, mask, ip, IPallbits, rem, type, ifc, tifc);
-	if(v6addrtype(ip) != linklocalv6)
-		addroute(f, rem, mask, ip, IPnoaddr, rem, type, ifc, tifc);
+	if(lifc->onlink){
+		addroute(f, rem, mask, ip, IPallbits, rem, type, ifc, tifc);
+		if(v6addrtype(ip) != linklocalv6)
+			addroute(f, rem, mask, ip, IPnoaddr, rem, type, ifc, tifc);
+	}
 
 	addselfcache(f, ifc, lifc, ip, Runi);
 
@@ -635,13 +644,15 @@
 		remselfcache(f, ifc, lifc, lifc->link->self->a);
 
 	/* remove the route for this logical interface */
-	remroute(f, lifc->remote, lifc->mask,
-		lifc->local, IPallbits,
-		lifc->remote, lifc->type, ifc, tifc);
-	if(v6addrtype(lifc->local) != linklocalv6)
+	if(lifc->onlink){
 		remroute(f, lifc->remote, lifc->mask,
-			lifc->local, IPnoaddr,
+			lifc->local, IPallbits,
 			lifc->remote, lifc->type, ifc, tifc);
+		if(v6addrtype(lifc->local) != linklocalv6)
+			remroute(f, lifc->remote, lifc->mask,
+				lifc->local, IPnoaddr,
+				lifc->remote, lifc->type, ifc, tifc);
+	}
 
 	/* unregister proxy */
 	if(lifc->type & Rptpt){