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