diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c index 4612b32c139..7ef0282fdb8 100644 --- a/sys/netinet/libalias/alias_db.c +++ b/sys/netinet/libalias/alias_db.c @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #else #include "alias.h" #include "alias_local.h" @@ -63,6 +64,23 @@ __FBSDID("$FreeBSD$"); #include "alias_db.h" +#ifdef _KERNEL +#ifndef V_hook_alias +typedef int (*ipfw_hook_t)(const void *arg, const void *extdata); +/* callback hooks for notify on update of internal states and aliases */ +VNET_DECLARE(ipfw_hook_t, hook_state); +#define V_hook_state VNET(hook_state) +VNET_DECLARE(ipfw_hook_t, hook_alias); +#define V_hook_alias VNET(hook_alias) +VNET_DECLARE(ipfw_hook_t, sync_state); +#define V_sync_state VNET(sync_state) +VNET_DECLARE(ipfw_hook_t, sync_alias); +#define V_sync_alias VNET(sync_alias) +#endif + +VNET_DEFINE(ipfw_hook_t, hook_alias) = NULL; +#endif + static LIST_HEAD(, libalias) instancehead = LIST_HEAD_INITIALIZER(instancehead); int LibAliasTime; @@ -566,9 +584,14 @@ AddLink(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, int alias_port_param, int link_type) { struct alias_link *lnk; + int sync = 0; LIBALIAS_LOCK_ASSERT(la); + if (link_type & LINK_SYNC_MASK) + sync = 42; + link_type &= ~LINK_SYNC_MASK; + lnk = malloc(sizeof(struct alias_link)); if (lnk == NULL) { #ifdef LIBALIAS_DEBUG @@ -708,6 +731,11 @@ AddLink(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, if (la->packetAliasMode & PKT_ALIAS_LOG) ShowAliasStats(la); +#ifdef _KERNEL + if (!sync && lnk && V_hook_alias) + V_hook_alias(lnk, NULL); +#endif + return (lnk); }