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>
