diff --git a/sbin/devd/devd.conf.5 b/sbin/devd/devd.conf.5 --- a/sbin/devd/devd.conf.5 +++ b/sbin/devd/devd.conf.5 @@ -469,6 +469,10 @@ The network interface is detached from the system. .It Li IFNET Ta Em inet Ta Li RENAME Ta The network interface is renamed. +.It Li IFNET Ta Em inet Ta Li ADDR_ADD Ta +The network interface address added. +.It Li IFNET Ta Em inet Ta Li ADDR_DEL Ta +The network interface address removed. .El .Pp .Bl -column "System" "Subsystem" "1234567" -compact diff --git a/sys/net/route.c b/sys/net/route.c --- a/sys/net/route.c +++ b/sys/net/route.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -67,6 +68,7 @@ #include #include +#include VNET_PCPUSTAT_DEFINE(struct rtstat, rtstat); @@ -685,6 +687,10 @@ int rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum) { +#if defined(INET) || defined(INET6) + struct sockaddr *sa = ifa->ifa_addr; + struct ifnet *ifp = ifa->ifa_ifp; +#endif KASSERT(cmd == RTM_ADD || cmd == RTM_DELETE, ("unexpected cmd %d", cmd)); @@ -693,6 +699,29 @@ EVENTHANDLER_DIRECT_INVOKE(rt_addrmsg, ifa, cmd); +#ifdef INET + if (sa->sa_family == AF_INET) { + char addrstr[INET_ADDRSTRLEN]; + char strbuf[INET_ADDRSTRLEN + 12]; + + inet_ntoa_r(((struct sockaddr_in *)sa)->sin_addr, addrstr); + snprintf(strbuf, sizeof(strbuf), "address=%s", addrstr); + devctl_notify("IFNET", ifp->if_xname, + (cmd == RTM_ADD) ? "ADDR_ADD" : "ADDR_DEL", strbuf); + } +#endif +#ifdef INET6 + if (sa->sa_family == AF_INET6) { + char addrstr[INET6_ADDRSTRLEN]; + char strbuf[INET6_ADDRSTRLEN + 12]; + + ip6_sprintf(addrstr, IFA_IN6(ifa)); + snprintf(strbuf, sizeof(strbuf), "address=%s", addrstr); + devctl_notify("IFNET", ifp->if_xname, + (cmd == RTM_ADD) ? "ADDR_ADD" : "ADDR_DEL", strbuf); + } +#endif + if (V_rt_add_addr_allfibs) fibnum = RT_ALL_FIBS; return (rtsock_addrmsg(cmd, ifa, fibnum));