eventhandler: Implement ifnet_event
authorAaron LI <aly@aaronly.me>
Mon, 25 Jun 2018 09:00:21 +0000 (17:00 +0800)
committerAaron LI <aly@aaronly.me>
Wed, 8 Aug 2018 08:43:32 +0000 (16:43 +0800)
Implement the "ifnet_event" which is triggered on interface up and down.

Taken-from: FreeBSD

share/man/man9/EVENTHANDLER.9
sys/net/if.c
sys/net/if_var.h

index 7516f87..1da5c05 100644 (file)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man9/EVENTHANDLER.9,v 1.4 2005/10/11 16:05:35 keramida Exp $
 .\"
-.Dd June 22, 2018
+.Dd June 25, 2018
 .Dt EVENTHANDLER 9
 .Os
 .Sh NAME
@@ -204,6 +204,8 @@ Callbacks invoked when an address is set up on a network interface.
 Callbacks invoked when a new network interface appears.
 .It Vt ifnet_detach_event
 Callbacks invoked when a network interface is removed.
+.It Vt ifnet_event
+Callbacks invoked when a network interface is brought up or down.
 .It Vt power_profile_change
 Callbacks invoked when the power profile of the system changes.
 .It Vt shutdown_pre_sync
index fdb7db8..f2157f8 100644 (file)
@@ -1764,6 +1764,7 @@ if_route(struct ifnet *ifp, int flag, int fam)
 void
 if_down(struct ifnet *ifp)
 {
+       EVENTHANDLER_INVOKE(ifnet_event, ifp, IFNET_EVENT_DOWN);
        if_unroute(ifp, IFF_UP, AF_UNSPEC);
        netmsg_service_sync();
 }
@@ -1777,6 +1778,7 @@ void
 if_up(struct ifnet *ifp)
 {
        if_route(ifp, IFF_UP, AF_UNSPEC);
+       EVENTHANDLER_INVOKE(ifnet_event, ifp, IFNET_EVENT_UP);
 }
 
 /*
index 06f7930..9ee015d 100644 (file)
@@ -717,6 +717,11 @@ EVENTHANDLER_DECLARE(ifnet_attach_event, ifnet_attach_event_handler_t);
 /* interface detach event */
 typedef void (*ifnet_detach_event_handler_t)(void *, struct ifnet *);
 EVENTHANDLER_DECLARE(ifnet_detach_event, ifnet_detach_event_handler_t);
+/* Interface up/down event */
+#define IFNET_EVENT_UP         0
+#define IFNET_EVENT_DOWN       1
+typedef void (*ifnet_event_fn)(void *, struct ifnet *ifp, int event);
+EVENTHANDLER_DECLARE(ifnet_event, ifnet_event_fn);
 
 /* Array of all ifnets in the system */
 struct ifnet_array {