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);