Module Name:    src
Committed By:   rmind
Date:           Mon Aug 11 01:54:13 UTC 2014

Modified Files:
        src/sys/net/npf: npf_conf.c npf_ctl.c npf_impl.h npf_rproc.c
            npf_ruleset.c npf_tableset.c

Log Message:
NPF: finish up the rework of npfctl_save() mechanism.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/net/npf/npf_conf.c
cvs rdiff -u -r1.37 -r1.38 src/sys/net/npf/npf_ctl.c
cvs rdiff -u -r1.57 -r1.58 src/sys/net/npf/npf_impl.h
cvs rdiff -u -r1.11 -r1.12 src/sys/net/npf/npf_rproc.c
cvs rdiff -u -r1.36 -r1.37 src/sys/net/npf/npf_ruleset.c
cvs rdiff -u -r1.21 -r1.22 src/sys/net/npf/npf_tableset.c

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_conf.c
diff -u src/sys/net/npf/npf_conf.c:1.7 src/sys/net/npf/npf_conf.c:1.8
--- src/sys/net/npf/npf_conf.c:1.7	Wed Jul 23 01:25:34 2014
+++ src/sys/net/npf/npf_conf.c	Mon Aug 11 01:54:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_conf.c,v 1.7 2014/07/23 01:25:34 rmind Exp $	*/
+/*	$NetBSD: npf_conf.c,v 1.8 2014/08/11 01:54:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_conf.c,v 1.7 2014/07/23 01:25:34 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_conf.c,v 1.8 2014/08/11 01:54:12 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -66,7 +66,6 @@ typedef struct {
 	npf_tableset_t *	n_tables;
 	npf_ruleset_t *		n_nat_rules;
 	npf_rprocset_t *	n_rprocs;
-	prop_dictionary_t	n_dict;
 	bool			n_default_pass;
 } npf_config_t;
 
@@ -77,7 +76,6 @@ static pserialize_t		npf_config_psz		__c
 void
 npf_config_init(void)
 {
-	prop_dictionary_t dict;
 	npf_ruleset_t *rlset, *nset;
 	npf_rprocset_t *rpset;
 	npf_tableset_t *tset;
@@ -86,19 +84,17 @@ npf_config_init(void)
 	npf_config_psz = pserialize_create();
 
 	/* Load the empty configuration. */
-	dict = prop_dictionary_create();
 	tset = npf_tableset_create(0);
 	rpset = npf_rprocset_create();
 	rlset = npf_ruleset_create(0);
 	nset = npf_ruleset_create(0);
-	npf_config_load(dict, rlset, tset, nset, rpset, NULL, true);
+	npf_config_load(rlset, tset, nset, rpset, NULL, true);
 	KASSERT(npf_config != NULL);
 }
 
 static void
 npf_config_destroy(npf_config_t *nc)
 {
-	prop_object_release(nc->n_dict);
 	npf_ruleset_destroy(nc->n_rules);
 	npf_ruleset_destroy(nc->n_nat_rules);
 	npf_rprocset_destroy(nc->n_rprocs);
@@ -127,8 +123,8 @@ npf_config_fini(void)
  * Performs the necessary synchronisation and destroys the old config.
  */
 void
-npf_config_load(prop_dictionary_t dict, npf_ruleset_t *rset,
-    npf_tableset_t *tset, npf_ruleset_t *nset, npf_rprocset_t *rpset,
+npf_config_load(npf_ruleset_t *rset, npf_tableset_t *tset,
+    npf_ruleset_t *nset, npf_rprocset_t *rpset,
     npf_conndb_t *conns, bool flush)
 {
 	npf_config_t *nc, *onc;
@@ -138,7 +134,6 @@ npf_config_load(prop_dictionary_t dict, 
 	nc->n_tables = tset;
 	nc->n_nat_rules = nset;
 	nc->n_rprocs = rpset;
-	nc->n_dict = dict;
 	nc->n_default_pass = flush;
 
 	/*
@@ -185,9 +180,6 @@ npf_config_load(prop_dictionary_t dict, 
 	 * If not flushing - enable the connection tracking.
 	 */
 	npf_conn_load(conns, !flush);
-
-	/* Sync the config proplib data. */
-	npf_tableset_syncdict(tset, dict);
 	mutex_exit(&npf_config_lock);
 
 	/* Finally, it is safe to destroy the old config. */
@@ -261,10 +253,10 @@ npf_config_tableset(void)
 	return npf_config->n_tables;
 }
 
-prop_dictionary_t
-npf_config_dict(void)
+npf_rprocset_t *
+npf_config_rprocs(void)
 {
-	return npf_config->n_dict;
+	return npf_config->n_rprocs;
 }
 
 bool

Index: src/sys/net/npf/npf_ctl.c
diff -u src/sys/net/npf/npf_ctl.c:1.37 src/sys/net/npf/npf_ctl.c:1.38
--- src/sys/net/npf/npf_ctl.c:1.37	Sun Aug 10 19:09:43 2014
+++ src/sys/net/npf/npf_ctl.c	Mon Aug 11 01:54:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_ctl.c,v 1.37 2014/08/10 19:09:43 rmind Exp $	*/
+/*	$NetBSD: npf_ctl.c,v 1.38 2014/08/11 01:54:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2014 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_ctl.c,v 1.37 2014/08/10 19:09:43 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_ctl.c,v 1.38 2014/08/11 01:54:12 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -181,7 +181,6 @@ npf_mk_tables(npf_tableset_t *tblset, pr
 			NPF_ERR_DEBUG(errdict);
 			break;
 		}
-		prop_dictionary_remove(tbldict, "entries");
 	}
 	prop_object_iterator_release(it);
 	/*
@@ -555,7 +554,6 @@ npfctl_load(u_long cmd, void *data)
 	if (error) {
 		goto fail;
 	}
-	prop_dictionary_remove(npf_dict, "nat");
 
 	/* Tables. */
 	tables = prop_dictionary_get(npf_dict, "tables");
@@ -597,7 +595,6 @@ npfctl_load(u_long cmd, void *data)
 		if (error) {
 			goto fail;
 		}
-		prop_dictionary_remove(npf_dict, "conn-list");
 	}
 
 	flush = false;
@@ -606,7 +603,7 @@ npfctl_load(u_long cmd, void *data)
 	/*
 	 * Finally - perform the load.
 	 */
-	npf_config_load(npf_dict, rlset, tblset, nset, rpset, conndb, flush);
+	npf_config_load(rlset, tblset, nset, rpset, conndb, flush);
 
 	/* Done.  Since data is consumed now, we shall not destroy it. */
 	tblset = NULL;
@@ -630,9 +627,7 @@ fail:
 	if (tblset) {
 		npf_tableset_destroy(tblset);
 	}
-	if (error) {
-		prop_object_release(npf_dict);
-	}
+	prop_object_release(npf_dict);
 
 	/* Error report. */
 #ifndef _NPF_TESTING
@@ -653,12 +648,15 @@ int
 npfctl_save(u_long cmd, void *data)
 {
 	struct plistref *pref = data;
-	prop_array_t conlist, natlist;
-	prop_dictionary_t npf_dict;
+	prop_array_t rulelist, natlist, tables, rprocs, conlist;
+	prop_dictionary_t npf_dict = NULL;
 	int error;
 
-	conlist = prop_array_create();
+	rulelist = prop_array_create();
 	natlist = prop_array_create();
+	tables = prop_array_create();
+	rprocs = prop_array_create();
+	conlist = prop_array_create();
 
 	/*
 	 * Serialise the connections and NAT policies.
@@ -668,21 +666,42 @@ npfctl_save(u_long cmd, void *data)
 	if (error) {
 		goto out;
 	}
+	error = npf_ruleset_export(npf_config_ruleset(), rulelist);
+	if (error) {
+		goto out;
+	}
 	error = npf_ruleset_export(npf_config_natset(), natlist);
 	if (error) {
 		goto out;
 	}
-	npf_dict = npf_config_dict();
+	error = npf_tableset_export(npf_config_tableset(), tables);
+	if (error) {
+		goto out;
+	}
+	error = npf_rprocset_export(npf_config_rprocs(), rprocs);
+	if (error) {
+		goto out;
+	}
+	npf_dict = prop_dictionary_create();
+	prop_dictionary_set_uint32(npf_dict, "version", NPF_VERSION);
+	prop_dictionary_set_and_rel(npf_dict, "rules", rulelist);
 	prop_dictionary_set_and_rel(npf_dict, "nat", natlist);
+	prop_dictionary_set_and_rel(npf_dict, "tables", tables);
+	prop_dictionary_set_and_rel(npf_dict, "rprocs", rprocs);
 	prop_dictionary_set_and_rel(npf_dict, "conn-list", conlist);
 	prop_dictionary_set_bool(npf_dict, "active", npf_pfil_registered_p());
 	error = prop_dictionary_copyout_ioctl(pref, cmd, npf_dict);
 out:
 	npf_config_exit();
 
-	if (error) {
-		prop_object_release(conlist);
+	if (!npf_dict) {
+		prop_object_release(rulelist);
 		prop_object_release(natlist);
+		prop_object_release(tables);
+		prop_object_release(rprocs);
+		prop_object_release(conlist);
+	} else {
+		prop_object_release(npf_dict);
 	}
 	return error;
 }

Index: src/sys/net/npf/npf_impl.h
diff -u src/sys/net/npf/npf_impl.h:1.57 src/sys/net/npf/npf_impl.h:1.58
--- src/sys/net/npf/npf_impl.h:1.57	Sun Aug 10 19:09:43 2014
+++ src/sys/net/npf/npf_impl.h	Mon Aug 11 01:54:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_impl.h,v 1.57 2014/08/10 19:09:43 rmind Exp $	*/
+/*	$NetBSD: npf_impl.h,v 1.58 2014/08/11 01:54:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2014 The NetBSD Foundation, Inc.
@@ -149,13 +149,12 @@ bool		npf_config_locked_p(void);
 int		npf_config_read_enter(void);
 void		npf_config_read_exit(int);
 
-void		npf_config_load(prop_dictionary_t, npf_ruleset_t *,
-		    npf_tableset_t *, npf_ruleset_t *, npf_rprocset_t *,
-		    npf_conndb_t *, bool);
+void		npf_config_load(npf_ruleset_t *, npf_tableset_t *,
+		    npf_ruleset_t *, npf_rprocset_t *, npf_conndb_t *, bool);
 npf_ruleset_t *	npf_config_ruleset(void);
 npf_ruleset_t *	npf_config_natset(void);
 npf_tableset_t *npf_config_tableset(void);
-prop_dictionary_t npf_config_dict(void);
+npf_rprocset_t *npf_config_rprocs(void);
 bool		npf_default_pass(void);
 
 int		npf_worker_sysinit(void);
@@ -237,7 +236,7 @@ int		npf_tableset_insert(npf_tableset_t 
 npf_table_t *	npf_tableset_getbyname(npf_tableset_t *, const char *);
 npf_table_t *	npf_tableset_getbyid(npf_tableset_t *, u_int);
 void		npf_tableset_reload(npf_tableset_t *, npf_tableset_t *);
-void		npf_tableset_syncdict(const npf_tableset_t *, prop_dictionary_t);
+int		npf_tableset_export(const npf_tableset_t *, prop_array_t);
 
 npf_table_t *	npf_table_create(const char *, u_int, int, void *, size_t);
 void		npf_table_destroy(npf_table_t *);
@@ -292,6 +291,7 @@ npf_rprocset_t *npf_rprocset_create(void
 void		npf_rprocset_destroy(npf_rprocset_t *);
 npf_rproc_t *	npf_rprocset_lookup(npf_rprocset_t *, const char *);
 void		npf_rprocset_insert(npf_rprocset_t *, npf_rproc_t *);
+int		npf_rprocset_export(const npf_rprocset_t *, prop_array_t);
 
 npf_rproc_t *	npf_rproc_create(prop_dictionary_t);
 void		npf_rproc_acquire(npf_rproc_t *);

Index: src/sys/net/npf/npf_rproc.c
diff -u src/sys/net/npf/npf_rproc.c:1.11 src/sys/net/npf/npf_rproc.c:1.12
--- src/sys/net/npf/npf_rproc.c:1.11	Sun Jul 20 00:37:41 2014
+++ src/sys/net/npf/npf_rproc.c	Mon Aug 11 01:54:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_rproc.c,v 1.11 2014/07/20 00:37:41 rmind Exp $	*/
+/*	$NetBSD: npf_rproc.c,v 1.12 2014/08/11 01:54:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2013 The NetBSD Foundation, Inc.
@@ -261,6 +261,22 @@ npf_rprocset_insert(npf_rprocset_t *rpse
 	LIST_INSERT_HEAD(&rpset->rps_list, rp, rp_entry);
 }
 
+int
+npf_rprocset_export(const npf_rprocset_t *rpset, prop_array_t rprocs)
+{
+	prop_dictionary_t rpdict;
+	const npf_rproc_t *rp;
+
+	LIST_FOREACH(rp, &rpset->rps_list, rp_entry) {
+		rpdict = prop_dictionary_create();
+		prop_dictionary_set_cstring(rpdict, "name", rp->rp_name);
+		prop_dictionary_set_uint32(rpdict, "flags", rp->rp_flags);
+		prop_array_add(rprocs, rpdict);
+		prop_object_release(rpdict);
+	}
+	return 0;
+}
+
 /*
  * npf_rproc_create: construct a new rule procedure, lookup and associate
  * the extension calls with it.

Index: src/sys/net/npf/npf_ruleset.c
diff -u src/sys/net/npf/npf_ruleset.c:1.36 src/sys/net/npf/npf_ruleset.c:1.37
--- src/sys/net/npf/npf_ruleset.c:1.36	Sun Aug 10 19:09:43 2014
+++ src/sys/net/npf/npf_ruleset.c	Mon Aug 11 01:54:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_ruleset.c,v 1.36 2014/08/10 19:09:43 rmind Exp $	*/
+/*	$NetBSD: npf_ruleset.c,v 1.37 2014/08/11 01:54:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2013 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.36 2014/08/10 19:09:43 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.37 2014/08/11 01:54:12 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -115,7 +115,11 @@ struct npf_rule {
 	prop_data_t		r_info;
 };
 
-static int	npf_rule_export(const npf_rule_t *, prop_dictionary_t);
+#define	SKIPTO_ADJ_FLAG		(1U << 31)
+#define	SKIPTO_MASK		(SKIPTO_ADJ_FLAG - 1)
+
+static int	npf_rule_export(const npf_ruleset_t *,
+    const npf_rule_t *, prop_dictionary_t);
 
 /*
  * Private attributes - must be in the NPF_RULE_PRIVMASK range.
@@ -193,7 +197,7 @@ npf_ruleset_insert(npf_ruleset_t *rlset,
 	rlset->rs_nitems++;
 
 	if (rl->r_skip_to < ++n) {
-		rl->r_skip_to = n;
+		rl->r_skip_to = SKIPTO_ADJ_FLAG | n;
 	}
 }
 
@@ -342,12 +346,13 @@ npf_ruleset_list(npf_ruleset_t *rlset, c
 		rldict = prop_dictionary_create();
 		KASSERT(rl->r_parent == rg);
 
-		if (npf_rule_export(rl, rldict) ||
-		    !prop_array_add(rules, rldict)) {
+		if (npf_rule_export(rlset, rl, rldict)) {
 			prop_object_release(rldict);
 			prop_object_release(rules);
 			return NULL;
 		}
+		prop_array_add(rules, rldict);
+		prop_object_release(rldict);
 	}
 
 	if (!prop_dictionary_set(rgdict, "rules", rules)) {
@@ -377,17 +382,19 @@ npf_ruleset_flush(npf_ruleset_t *rlset, 
 int
 npf_ruleset_export(const npf_ruleset_t *rlset, prop_array_t rules)
 {
-	const npf_rule_t *rl;
+	const u_int nitems = rlset->rs_nitems;
 	int error = 0;
+	u_int n = 0;
 
 	KASSERT(npf_config_locked_p());
 
-	LIST_FOREACH(rl, &rlset->rs_all, r_aentry) {
+	while (n < nitems) {
+		const npf_rule_t *rl = rlset->rs_rules[n];
 		const npf_natpolicy_t *natp = rl->r_natp;
 		prop_dictionary_t rldict;
 
 		rldict = prop_dictionary_create();
-		if ((error = npf_rule_export(rl, rldict)) != 0) {
+		if ((error = npf_rule_export(rlset, rl, rldict)) != 0) {
 			prop_object_release(rldict);
 			break;
 		}
@@ -395,10 +402,9 @@ npf_ruleset_export(const npf_ruleset_t *
 			prop_object_release(rldict);
 			break;
 		}
-		if (!prop_array_add(rules, rldict)) {
-			prop_object_release(rldict);
-			return ENOMEM;
-		}
+		prop_array_add(rules, rldict);
+		prop_object_release(rldict);
+		n++;
 	}
 	return error;
 }
@@ -625,14 +631,18 @@ npf_rule_alloc(prop_dictionary_t rldict)
 }
 
 static int
-npf_rule_export(const npf_rule_t *rl, prop_dictionary_t rldict)
+npf_rule_export(const npf_ruleset_t *rlset, const npf_rule_t *rl,
+    prop_dictionary_t rldict)
 {
+	u_int skip_to = 0;
 	prop_data_t d;
 
 	prop_dictionary_set_uint32(rldict, "attr", rl->r_attr);
 	prop_dictionary_set_int32(rldict, "prio", rl->r_priority);
-	prop_dictionary_set_uint32(rldict, "skip-to", rl->r_skip_to);
-
+	if ((rl->r_skip_to & SKIPTO_ADJ_FLAG) == 0) {
+		skip_to = rl->r_skip_to & SKIPTO_MASK;
+	}
+	prop_dictionary_set_uint32(rldict, "skip-to", skip_to);
 	prop_dictionary_set_int32(rldict, "code-type", rl->r_type);
 	if (rl->r_code) {
 		d = prop_data_create_data(rl->r_code, rl->r_clen);
@@ -652,7 +662,9 @@ npf_rule_export(const npf_rule_t *rl, pr
 		d = prop_data_create_data(rl->r_key, NPF_RULE_MAXKEYLEN);
 		prop_dictionary_set_and_rel(rldict, "key", d);
 	}
-	prop_dictionary_set(rldict, "info", rl->r_info);
+	if (rl->r_info) {
+		prop_dictionary_set(rldict, "info", rl->r_info);
+	}
 	return 0;
 }
 
@@ -836,7 +848,7 @@ npf_ruleset_inspect(npf_cache_t *npc, co
 
 	while (n < nitems) {
 		npf_rule_t *rl = rlset->rs_rules[n];
-		const u_int skip_to = rl->r_skip_to;
+		const u_int skip_to = rl->r_skip_to & SKIPTO_MASK;
 		const uint32_t attr = rl->r_attr;
 
 		KASSERT(!nbuf_flag_p(nbuf, NBUF_DATAREF_RESET));

Index: src/sys/net/npf/npf_tableset.c
diff -u src/sys/net/npf/npf_tableset.c:1.21 src/sys/net/npf/npf_tableset.c:1.22
--- src/sys/net/npf/npf_tableset.c:1.21	Thu Feb  6 02:51:28 2014
+++ src/sys/net/npf/npf_tableset.c	Mon Aug 11 01:54:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_tableset.c,v 1.21 2014/02/06 02:51:28 rmind Exp $	*/
+/*	$NetBSD: npf_tableset.c,v 1.22 2014/08/11 01:54:12 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2014 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_tableset.c,v 1.21 2014/02/06 02:51:28 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_tableset.c,v 1.22 2014/08/11 01:54:12 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -256,10 +256,9 @@ npf_tableset_reload(npf_tableset_t *nts,
 	}
 }
 
-void
-npf_tableset_syncdict(const npf_tableset_t *ts, prop_dictionary_t ndict)
+int
+npf_tableset_export(const npf_tableset_t *ts, prop_array_t tables)
 {
-	prop_array_t tables = prop_array_create();
 	const npf_table_t *t;
 
 	KASSERT(npf_config_locked_p());
@@ -276,9 +275,7 @@ npf_tableset_syncdict(const npf_tableset
 		prop_array_add(tables, tdict);
 		prop_object_release(tdict);
 	}
-	prop_dictionary_remove(ndict, "tables");
-	prop_dictionary_set(ndict, "tables", tables);
-	prop_object_release(tables);
+	return 0;
 }
 
 /*

Reply via email to