Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/net/npf NPF: pass ALG functions via npfa_funcs_t structure.
details: https://anonhg.NetBSD.org/src/rev/69148c085d1f
branches: trunk
changeset: 326762:69148c085d1f
user: rmind <rmind%NetBSD.org@localhost>
date: Sun Feb 16 22:10:40 2014 +0000
description:
NPF: pass ALG functions via npfa_funcs_t structure.
diffstat:
sys/net/npf/npf_alg.c | 50 ++++++++++++--------------
sys/net/npf/npf_alg_icmp.c | 88 +++++++++++++++++++++++-----------------------
sys/net/npf/npf_impl.h | 17 ++++++--
3 files changed, 79 insertions(+), 76 deletions(-)
diffs (294 lines):
diff -r 7a8f74cff69b -r 69148c085d1f sys/net/npf/npf_alg.c
--- a/sys/net/npf/npf_alg.c Sun Feb 16 18:21:25 2014 +0000
+++ b/sys/net/npf/npf_alg.c Sun Feb 16 22:10:40 2014 +0000
@@ -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 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 @@
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_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 @@
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 @@
/* 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 @@
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 @@
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 @@
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;
diff -r 7a8f74cff69b -r 69148c085d1f sys/net/npf/npf_alg_icmp.c
--- a/sys/net/npf/npf_alg_icmp.c Sun Feb 16 18:21:25 2014 +0000
+++ b/sys/net/npf/npf_alg_icmp.c Sun Feb 16 22:10:40 2014 +0000
@@ -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 @@
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 @@
* 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 @@
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;
+}
diff -r 7a8f74cff69b -r 69148c085d1f sys/net/npf/npf_impl.h
--- a/sys/net/npf/npf_impl.h Sun Feb 16 18:21:25 2014 +0000
+++ b/sys/net/npf/npf_impl.h Sun Feb 16 22:10:40 2014 +0000
@@ -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 @@
* 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 @@
} 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 @@
/* 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);
Home |
Main Index |
Thread Index |
Old Index