From fcddd1b6c3b2924a8a022caf183b8f186e7d5cae Mon Sep 17 00:00:00 2001 From: Aaron LI Date: Mon, 25 Jun 2018 17:00:21 +0800 Subject: [PATCH] eventhandler: Implement ifnet_event Implement the "ifnet_event" which is triggered on interface up and down. Taken-from: FreeBSD --- share/man/man9/EVENTHANDLER.9 | 4 +++- sys/net/if.c | 2 ++ sys/net/if_var.h | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/share/man/man9/EVENTHANDLER.9 b/share/man/man9/EVENTHANDLER.9 index 7516f87ad3..1da5c05105 100644 --- a/share/man/man9/EVENTHANDLER.9 +++ b/share/man/man9/EVENTHANDLER.9 @@ -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 diff --git a/sys/net/if.c b/sys/net/if.c index fdb7db80cd..f2157f8022 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -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); } /* diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 06f79303ac..9ee015d14b 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -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 { -- 2.41.0