File:  [ELWIX - Embedded LightWeight unIX -] / fwsync / patches / alias_db.patch
Revision 1.6: download - view: text, annotated - select for diffs - revision graph
Tue Aug 23 14:27:13 2022 UTC (20 months ago) by misho
Branches: MAIN
CVS tags: fwsync1_2, fwsync1_1, HEAD, FWSYNC1_1
fix compiler scope of view for userland

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 <netinet/libalias/alias_local.h>
 #include <netinet/libalias/alias_mod.h>
 #include <net/if.h>
+#include <net/vnet.h>
 #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);
 }
 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>