Module Name:    src
Committed By:   rmind
Date:           Sun Feb 16 22:10:40 UTC 2014

Modified Files:
        src/sys/net/npf: npf_alg.c npf_alg_icmp.c npf_impl.h

Log Message:
NPF: pass ALG functions via npfa_funcs_t structure.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/net/npf/npf_alg.c
cvs rdiff -u -r1.18 -r1.19 src/sys/net/npf/npf_alg_icmp.c
cvs rdiff -u -r1.47 -r1.48 src/sys/net/npf/npf_impl.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/npf/npf_alg.c
diff -u src/sys/net/npf/npf_alg.c:1.10 src/sys/net/npf/npf_alg.c:1.11
--- src/sys/net/npf/npf_alg.c:1.10	Fri Dec  6 01:33:37 2013
+++ src/sys/net/npf/npf_alg.c	Sun Feb 16 22:10:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_alg.c,v 1.10 2013/12/06 01:33:37 rmind Exp $	*/
+/*	$NetBSD: npf_alg.c,v 1.11 2014/02/16 22:10:40 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2010-2013 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_alg.c,v 1.10 2013/12/06 01:33:37 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_alg.c,v 1.11 2014/02/16 22:10:40 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -63,10 +63,8 @@ static pserialize_t	alg_psz			__cachelin
 static npf_alg_t	alg_list[NPF_MAX_ALGS]	__read_mostly;
 static u_int		alg_count		__read_mostly;
 
-/* Session, matching and translation functions. */
-static npf_alg_sfunc_t	alg_sfunc[NPF_MAX_ALGS]	__read_mostly;
-static npf_alg_func_t	alg_mfunc[NPF_MAX_ALGS]	__read_mostly;
-static npf_alg_func_t	alg_tfunc[NPF_MAX_ALGS]	__read_mostly;
+/* Matching, inspection and translation functions. */
+static npfa_funcs_t	alg_funcs[NPF_MAX_ALGS]	__read_mostly;
 
 static const char	alg_prefix[] = "npf_alg_";
 #define	NPF_EXT_PREFLEN	(sizeof(alg_prefix) - 1)
@@ -75,12 +73,9 @@ void
 npf_alg_sysinit(void)
 {
 	alg_psz = pserialize_create();
-	memset(&alg_list, 0, sizeof(alg_list));
+	memset(alg_list, 0, sizeof(alg_list));
+	memset(alg_funcs, 0, sizeof(alg_funcs));
 	alg_count = 0;
-
-	memset(&alg_mfunc, 0, sizeof(alg_mfunc));
-	memset(&alg_tfunc, 0, sizeof(alg_tfunc));
-	memset(&alg_sfunc, 0, sizeof(alg_sfunc));
 }
 
 void
@@ -129,8 +124,7 @@ npf_alg_construct(const char *name)
  * npf_alg_register: register application-level gateway.
  */
 npf_alg_t *
-npf_alg_register(const char *name, npf_alg_func_t mfunc, npf_alg_func_t tfunc,
-    npf_alg_sfunc_t sfunc)
+npf_alg_register(const char *name, const npfa_funcs_t *funcs)
 {
 	npf_alg_t *alg;
 	u_int i;
@@ -158,12 +152,13 @@ npf_alg_register(const char *name, npf_a
 	alg->na_slot = i;
 
 	/* Assign the functions. */
-	alg_mfunc[i] = mfunc;
-	alg_tfunc[i] = tfunc;
-	alg_sfunc[i] = sfunc;
+	alg_funcs[i].match = funcs->match;
+	alg_funcs[i].translate = funcs->translate;
+	alg_funcs[i].inspect = funcs->inspect;
 
 	alg_count = MAX(alg_count, i + 1);
 	npf_config_exit();
+
 	return alg;
 }
 
@@ -177,9 +172,9 @@ npf_alg_unregister(npf_alg_t *alg)
 
 	/* Deactivate the functions first. */
 	npf_config_enter();
-	alg_mfunc[i] = NULL;
-	alg_tfunc[i] = NULL;
-	alg_sfunc[i] = NULL;
+	alg_funcs[i].match = NULL;
+	alg_funcs[i].translate = NULL;
+	alg_funcs[i].inspect = NULL;
 	pserialize_perform(alg_psz);
 
 	/* Finally, unregister the ALG. */
@@ -201,9 +196,9 @@ npf_alg_match(npf_cache_t *npc, nbuf_t *
 
 	s = pserialize_read_enter();
 	for (u_int i = 0; i < alg_count; i++) {
-		npf_alg_func_t func = alg_mfunc[i];
+		const npfa_funcs_t *f = &alg_funcs[i];
 
-		if (func && func(npc, nbuf, nt, di)) {
+		if (f->match && f->match(npc, nbuf, nt, di)) {
 			match = true;
 			break;
 		}
@@ -222,10 +217,10 @@ npf_alg_exec(npf_cache_t *npc, nbuf_t *n
 
 	s = pserialize_read_enter();
 	for (u_int i = 0; i < alg_count; i++) {
-		npf_alg_func_t func;
+		const npfa_funcs_t *f = &alg_funcs[i];
 
-		if ((func = alg_tfunc[i]) != NULL) {
-			func(npc, nbuf, nt, (int)forw);
+		if (f->translate) {
+			f->translate(npc, nbuf, nt, forw);
 		}
 	}
 	pserialize_read_exit(s);
@@ -239,11 +234,12 @@ npf_alg_session(npf_cache_t *npc, nbuf_t
 
 	s = pserialize_read_enter();
 	for (u_int i = 0; i < alg_count; i++) {
-		npf_alg_sfunc_t func = alg_sfunc[i];
+		const npfa_funcs_t *f = &alg_funcs[i];
 
-		if (func && (se = func(npc, nbuf, di)) != NULL) {
+		if (f->inspect)
+			continue;
+		if ((se = f->inspect(npc, nbuf, di)) != NULL)
 			break;
-		}
 	}
 	pserialize_read_exit(s);
 	return se;

Index: src/sys/net/npf/npf_alg_icmp.c
diff -u src/sys/net/npf/npf_alg_icmp.c:1.18 src/sys/net/npf/npf_alg_icmp.c:1.19
--- src/sys/net/npf/npf_alg_icmp.c:1.18	Fri Dec  6 01:33:37 2013
+++ src/sys/net/npf/npf_alg_icmp.c	Sun Feb 16 22:10:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_alg_icmp.c,v 1.18 2013/12/06 01:33:37 rmind Exp $	*/
+/*	$NetBSD: npf_alg_icmp.c,v 1.19 2014/02/16 22:10:40 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_alg_icmp.c,v 1.18 2013/12/06 01:33:37 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_alg_icmp.c,v 1.19 2014/02/16 22:10:40 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/module.h>
@@ -65,48 +65,8 @@ MODULE(MODULE_CLASS_MISC, npf_alg_icmp, 
 
 static npf_alg_t *	alg_icmp	__read_mostly;
 
-static bool	npfa_icmp_match(npf_cache_t *, nbuf_t *, npf_nat_t *, int);
-static bool	npfa_icmp_nat(npf_cache_t *, nbuf_t *, npf_nat_t *, int);
-static npf_session_t *npfa_icmp_session(npf_cache_t *, nbuf_t *, int);
-
-/*
- * npf_alg_icmp_{init,fini,modcmd}: ICMP ALG initialization, destruction
- * and module interface.
- */
-
-static int
-npf_alg_icmp_init(void)
-{
-	alg_icmp = npf_alg_register("icmp", npfa_icmp_match,
-	    npfa_icmp_nat, npfa_icmp_session);
-	return alg_icmp ? 0 : ENOMEM;
-}
-
-static int
-npf_alg_icmp_fini(void)
-{
-	KASSERT(alg_icmp != NULL);
-	return npf_alg_unregister(alg_icmp);
-}
-
-static int
-npf_alg_icmp_modcmd(modcmd_t cmd, void *arg)
-{
-	switch (cmd) {
-	case MODULE_CMD_INIT:
-		return npf_alg_icmp_init();
-	case MODULE_CMD_FINI:
-		return npf_alg_icmp_fini();
-	case MODULE_CMD_AUTOUNLOAD:
-		return EBUSY;
-	default:
-		return ENOTTY;
-	}
-	return 0;
-}
-
 /*
- * npfa_icmp_match: match inspector - determines ALG case and associates
+ * npfa_icmp_match: matching insperctor determines ALG case and associates
  * our ALG with the NAT entry.
  */
 static bool
@@ -343,7 +303,7 @@ npfa_icmp_session(npf_cache_t *npc, nbuf
  * which is embedded in ICMP packet.  Note: backwards stream only.
  */
 static bool
-npfa_icmp_nat(npf_cache_t *npc, nbuf_t *nbuf, npf_nat_t *nt, int forw)
+npfa_icmp_nat(npf_cache_t *npc, nbuf_t *nbuf, npf_nat_t *nt, bool forw)
 {
 	npf_cache_t enpc;
 
@@ -435,3 +395,43 @@ npfa_icmp_nat(npf_cache_t *npc, nbuf_t *
 	ic->icmp_cksum = cksum;
 	return true;
 }
+
+/*
+ * npf_alg_icmp_{init,fini,modcmd}: ICMP ALG initialization, destruction
+ * and module interface.
+ */
+
+static int
+npf_alg_icmp_init(void)
+{
+	static const npfa_funcs_t icmp = {
+		.match		= npfa_icmp_match,
+		.translate	= npfa_icmp_nat,
+		.inspect	= npfa_icmp_session,
+	};
+	alg_icmp = npf_alg_register("icmp", &icmp);
+	return alg_icmp ? 0 : ENOMEM;
+}
+
+static int
+npf_alg_icmp_fini(void)
+{
+	KASSERT(alg_icmp != NULL);
+	return npf_alg_unregister(alg_icmp);
+}
+
+static int
+npf_alg_icmp_modcmd(modcmd_t cmd, void *arg)
+{
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		return npf_alg_icmp_init();
+	case MODULE_CMD_FINI:
+		return npf_alg_icmp_fini();
+	case MODULE_CMD_AUTOUNLOAD:
+		return EBUSY;
+	default:
+		return ENOTTY;
+	}
+	return 0;
+}

Index: src/sys/net/npf/npf_impl.h
diff -u src/sys/net/npf/npf_impl.h:1.47 src/sys/net/npf/npf_impl.h:1.48
--- src/sys/net/npf/npf_impl.h:1.47	Thu Feb 13 03:34:40 2014
+++ src/sys/net/npf/npf_impl.h	Sun Feb 16 22:10:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_impl.h,v 1.47 2014/02/13 03:34:40 rmind Exp $	*/
+/*	$NetBSD: npf_impl.h,v 1.48 2014/02/16 22:10:40 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2014 The NetBSD Foundation, Inc.
@@ -96,8 +96,6 @@ typedef struct npf_tableset	npf_tableset
  * DEFINITIONS.
  */
 
-typedef bool (*npf_alg_func_t)(npf_cache_t *, nbuf_t *, npf_nat_t *, int);
-typedef npf_session_t *(*npf_alg_sfunc_t)(npf_cache_t *, nbuf_t *, int);
 typedef void (*npf_workfunc_t)(void);
 
 /*
@@ -131,6 +129,16 @@ typedef struct {
 } npf_state_t;
 
 /*
+ * ALG FUNCTIONS.
+ */
+
+typedef struct {
+	bool		(*match)(npf_cache_t *, nbuf_t *, npf_nat_t *, int);
+	bool		(*translate)(npf_cache_t *, nbuf_t *, npf_nat_t *, bool);
+	npf_session_t * (*inspect)(npf_cache_t *, nbuf_t *, int);
+} npfa_funcs_t;
+
+/*
  * INTERFACES.
  */
 
@@ -345,8 +353,7 @@ npf_nat_t *	npf_nat_restore(prop_diction
 /* ALG interface. */
 void		npf_alg_sysinit(void);
 void		npf_alg_sysfini(void);
-npf_alg_t *	npf_alg_register(const char *, npf_alg_func_t, npf_alg_func_t,
-		    npf_alg_sfunc_t);
+npf_alg_t *	npf_alg_register(const char *, const npfa_funcs_t *);
 int		npf_alg_unregister(npf_alg_t *);
 npf_alg_t *	npf_alg_construct(const char *);
 bool		npf_alg_match(npf_cache_t *, nbuf_t *, npf_nat_t *, int);

Reply via email to