shithub: riscv

Download patch

ref: 874701d1934617a5992511b713c8a0fe08491dd9
parent: eac7a2b12a9a6df73164132def672c681cf36820
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Apr 11 18:56:25 EDT 2018

devip: make v4 ifc broadcast and multicast routes specific to address

this allows one to access the same network via multiple interfaces,
the local address then determines which interface is used.

--- a/sys/src/9/ip/ipifc.c
+++ b/sys/src/9/ip/ipifc.c
@@ -86,14 +86,6 @@
 #define v6addrcurr(lifc) ((lifc)->preflt == ~0L || \
 			(lifc)->origint + (lifc)->preflt >= NOW/1000)
 
-static uchar*
-defsmask(uchar *a)
-{
-	if(v6addrtype(a) == linklocalv6)
-		return IPallbits;
-	return IPnoaddr;
-}
-
 static int
 comprefixlen(uchar *a, uchar *b, int n)
 {
@@ -516,7 +508,10 @@
 		;
 	*l = lifc;
 
-	addroute(f, rem, mask, ip, defsmask(ip), rem, type, ifc, tifc);
+	/* 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);
 
 	addselfcache(f, ifc, lifc, ip, Runi);
 
@@ -606,8 +601,12 @@
 
 	/* remove the route for this logical interface */
 	remroute(f, lifc->remote, lifc->mask,
-		lifc->local, defsmask(lifc->local),
+		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){
@@ -887,7 +886,9 @@
 
 		/* add to routing table */
 		addroute(f, a, IPallbits,
-			lifc->local, defsmask(a),
+			lifc->local, 
+			((type & (Rbcast|Rmulti)) != 0 || v6addrtype(a) == linklocalv6) ?
+				IPallbits : IPnoaddr,
 			a, type, ifc, tifc);
 
 		if((type & Rmulti) && ifc->m->addmulti != nil)
@@ -1005,7 +1006,9 @@
 
 	/* remove from routing table */
 	remroute(f, a, IPallbits,
-		lifc->local, defsmask(a),
+		lifc->local, 
+		((p->type & (Rbcast|Rmulti)) != 0 || v6addrtype(a) == linklocalv6) ?
+			IPallbits : IPnoaddr,
 		a, p->type, ifc, tifc);
 
 	if((p->type & Rmulti) && ifc->m->remmulti != nil){