shithub: riscv

Download patch

ref: 934d81ae4e55fb48f7d15ee7302d455f3ba33a82
parent: 8a1c1c951066705b98b417f26eebcb293e3b549d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jul 23 18:22:09 EDT 2023

devip: add gratious arp ctl message to /net/arp

writing "garp <ip>" will send a gratious arp for
the provided ip address (if it can be found on
any interface).

--- a/sys/src/9/ip/arp.c
+++ b/sys/src/9/ip/arp.c
@@ -501,9 +501,9 @@
 		}
 		runlock(ifc);
 	} else if(strcmp(f[0], "del") == 0){
-		if (n != 2)
+		if(n != 2)
 			error(Ebadarg);
-		if (parseip(ip, f[1]) == -1)
+		if(parseip(ip, f[1]) == -1)
 			error(Ebadip);
 		wlock(arp);
 		for(a = arp->hash[hashipa(ip)]; a != nil; a = x){
@@ -512,6 +512,26 @@
 				cleanarpent(arp, a);
 		}
 		wunlock(arp);
+	} else if(strcmp(f[0], "garp") == 0){
+		Iplifc *lifc;
+
+		if(n != 2)
+			error(Ebadarg);
+		if(parseip(ip, f[1]) == -1)
+			error(Ebadip);
+
+		if((ifc = findipifc(fs, ip, ip, Runi)) == nil)
+			error("no interface");
+
+		rlock(ifc);
+		if(waserror()){
+			runlock(ifc);
+			nexterror();
+		}
+		if(ifc->m != nil && ifc->m->areg != nil && (lifc = iplocalonifc(ifc, ip)) != nil)
+			(*ifc->m->areg)(fs, ifc, lifc, ip);
+		runlock(ifc);
+		poperror();
 	} else
 		error(Ebadarp);