Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Jun 2021 19:37:44 +0300
From:      Rozhuk Ivan <rozhuk.im@gmail.com>
To:        "dmilith ." <dmilith@gmail.com>
Cc:        freebsd-net@freebsd.org, freebsd-hackers@FreeBSD.org
Subject:   Re: How to run script on network address change?
Message-ID:  <20210620193744.39eae64f@rimwks.local>
In-Reply-To: <CAJQ5JngsD4VTkoPQW4xE%2BfLOAA4L-JBeYcHeaFSs4LNzQNL6Ag@mail.gmail.com>
References:  <20210620165215.0f3dd15c@rimwks.local> <CAJQ5JngsD4VTkoPQW4xE%2BfLOAA4L-JBeYcHeaFSs4LNzQNL6Ag@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--MP_/M9MCt26LwExmTW7V=bzbtL8
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

On Sun, 20 Jun 2021 16:23:38 +0200
"dmilith ." <dmilith@gmail.com> wrote:

> Have you tried `route monitor`?
 
No, and I do not want keep running some daemon that will parse output.

But thanks, I found good place to add devctl_notify() calls.
Now devd have new events.


run:
ifconfig lan0 alias 192.168.1.1/24
ifconfig lan0 -alias 192.168.1.1
ifconfig lan0 inet6 1111::

devd output:
!system=IFNET subsystem=lan0 type=ADDR_ADD 192.168.1.1
!system=IFNET subsystem=lan0 type=ADDR_DEL 192.168.1.1
!system=IFNET subsystem=lan0 type=ADDR_ADD 1111::


And even for netif rename:
ifconfig lan0 name lan1
ifconfig lan1 name lan0

devd output:
!system=IFNET subsystem=lan0 type=RENAME lan1
!system=IFNET subsystem=lan1 type=RENAME lan0

--MP_/M9MCt26LwExmTW7V=bzbtL8
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=18a08c5f17.patch

>From 18a08c5f17d3b54f029a4e8c9ffbcd1370dbf3b1 Mon Sep 17 00:00:00 2001
From: Rozhuk Ivan <rozhuk.im@gmail.com>
Date: Sun, 20 Jun 2021 19:10:36 +0300
Subject: [PATCH] sys/net/if.c: add RENAME devctl event

!system=IFNET subsystem=lan0 type=RENAME lan1
!system=IFNET subsystem=lan1 type=RENAME lan0
---
 sys/net/if.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sys/net/if.c b/sys/net/if.c
index f6926c43ef9..8c8a7f6f4f0 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -2681,6 +2681,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
 		EVENTHANDLER_INVOKE(ifnet_departure_event, ifp);
 
 		if_printf(ifp, "changing name to '%s'\n", new_name);
+		devctl_notify("IFNET", ifp->if_xname, "RENAME", new_name);
 
 		IF_ADDR_WLOCK(ifp);
 		strlcpy(ifp->if_xname, new_name, sizeof(ifp->if_xname));

--MP_/M9MCt26LwExmTW7V=bzbtL8
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=ece5aba37a.patch

>From ece5aba37afe51e7ffa1ec14b4cf9b3430a608b4 Mon Sep 17 00:00:00 2001
From: Rozhuk Ivan <rozhuk.im@gmail.com>
Date: Sun, 20 Jun 2021 19:22:55 +0300
Subject: [PATCH] sys/net/route.c: add devctl event handler

ifconfig lan0 alias 192.168.1.1/24
ifconfig lan0 -alias 192.168.1.1

output:
!system=IFNET subsystem=lan0 type=ADDR_ADD 192.168.1.1
!system=IFNET subsystem=lan0 type=ADDR_DEL 192.168.1.1
---
 sys/net/route.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/sys/net/route.c b/sys/net/route.c
index f07cb3f6581..4c1fed90caa 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -50,6 +50,7 @@
 #include <sys/syslog.h>
 #include <sys/sysproto.h>
 #include <sys/proc.h>
+#include <sys/devctl.h>
 #include <sys/domain.h>
 #include <sys/eventhandler.h>
 #include <sys/kernel.h>
@@ -67,6 +68,7 @@
 
 #include <netinet/in.h>
 #include <netinet/ip_mroute.h>
+#include <netinet6/in6_var.h>
 
 VNET_PCPUSTAT_DEFINE(struct rtstat, rtstat);
 
@@ -693,6 +695,8 @@ rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst, struct sockaddr *netma
 int
 rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum)
 {
+	struct sockaddr *sa = ifa->ifa_addr;
+	struct ifnet *ifp = ifa->ifa_ifp;
 
 	KASSERT(cmd == RTM_ADD || cmd == RTM_DELETE,
 	    ("unexpected cmd %d", cmd));
@@ -701,6 +705,24 @@ rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum)
 
 	EVENTHANDLER_DIRECT_INVOKE(rt_addrmsg, ifa, cmd);
 
+#ifdef INET
+	if (sa->sa_family == AF_INET) {
+		char addrstr[INET_ADDRSTRLEN];
+		inet_ntoa_r((((struct sockaddr_in*)sa)->sin_addr),
+		    addrstr);
+		devctl_notify("IFNET", ifp->if_xname,
+		    (cmd == RTM_ADD) ? "ADDR_ADD" : "ADDR_DEL", addrstr);
+	}
+#endif
+#ifdef INET6
+	if (sa->sa_family == AF_INET6) {
+		char addrstr[INET6_ADDRSTRLEN];
+		ip6_sprintf(addrstr, IFA_IN6(ifa));
+		devctl_notify("IFNET", ifp->if_xname,
+		    (cmd == RTM_ADD) ? "ADDR_ADD" : "ADDR_DEL", addrstr);
+	}
+#endif
+
 	if (V_rt_add_addr_allfibs)
 		fibnum = RT_ALL_FIBS;
 	return (rtsock_addrmsg(cmd, ifa, fibnum));

--MP_/M9MCt26LwExmTW7V=bzbtL8--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20210620193744.39eae64f>