devctl: add ADDR_ADD and ADDR_DEL devctl event for IFNET
Add devd event on network iface address add/remove. Can be used to automate actions on any address change. Reviewed by: imp@ (and minor style tweaks) Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D30840
This commit is contained in:
parent
4fb3e0bb94
commit
a75819461e
@ -469,6 +469,10 @@ The network interface is attached to the system.
|
|||||||
The network interface is detached from the system.
|
The network interface is detached from the system.
|
||||||
.It Li IFNET Ta Em inet Ta Li RENAME Ta
|
.It Li IFNET Ta Em inet Ta Li RENAME Ta
|
||||||
The network interface is renamed.
|
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
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
.Bl -column "System" "Subsystem" "1234567" -compact
|
.Bl -column "System" "Subsystem" "1234567" -compact
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
#include <sys/syslog.h>
|
#include <sys/syslog.h>
|
||||||
#include <sys/sysproto.h>
|
#include <sys/sysproto.h>
|
||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
|
#include <sys/devctl.h>
|
||||||
#include <sys/domain.h>
|
#include <sys/domain.h>
|
||||||
#include <sys/eventhandler.h>
|
#include <sys/eventhandler.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
@ -67,6 +68,7 @@
|
|||||||
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netinet/ip_mroute.h>
|
#include <netinet/ip_mroute.h>
|
||||||
|
#include <netinet6/in6_var.h>
|
||||||
|
|
||||||
VNET_PCPUSTAT_DEFINE(struct rtstat, rtstat);
|
VNET_PCPUSTAT_DEFINE(struct rtstat, rtstat);
|
||||||
|
|
||||||
@ -685,6 +687,10 @@ rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst, struct sockaddr *netma
|
|||||||
int
|
int
|
||||||
rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum)
|
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,
|
KASSERT(cmd == RTM_ADD || cmd == RTM_DELETE,
|
||||||
("unexpected cmd %d", cmd));
|
("unexpected cmd %d", cmd));
|
||||||
@ -693,6 +699,29 @@ rt_addrmsg(int cmd, struct ifaddr *ifa, int fibnum)
|
|||||||
|
|
||||||
EVENTHANDLER_DIRECT_INVOKE(rt_addrmsg, ifa, cmd);
|
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)
|
if (V_rt_add_addr_allfibs)
|
||||||
fibnum = RT_ALL_FIBS;
|
fibnum = RT_ALL_FIBS;
|
||||||
return (rtsock_addrmsg(cmd, ifa, fibnum));
|
return (rtsock_addrmsg(cmd, ifa, fibnum));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user