Module Name: src Committed By: rmind Date: Fri Nov 22 00:25:51 UTC 2013
Modified Files: src/lib/libnpf: npf.c npf.h src/sys/net/npf: npf_conf.c npf_impl.h npf_tableset.c src/usr.sbin/npf/npfctl: npf_build.c npf_data.c npf_show.c Log Message: Add npf_tableset_syncdict() to sync the table IDs in the proplib dictionary, as they can change on reload now. Also, fix table name checking in npfctl. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/lib/libnpf/npf.c cvs rdiff -u -r1.20 -r1.21 src/lib/libnpf/npf.h cvs rdiff -u -r1.4 -r1.5 src/sys/net/npf/npf_conf.c cvs rdiff -u -r1.40 -r1.41 src/sys/net/npf/npf_impl.h cvs rdiff -u -r1.19 -r1.20 src/sys/net/npf/npf_tableset.c cvs rdiff -u -r1.30 -r1.31 src/usr.sbin/npf/npfctl/npf_build.c cvs rdiff -u -r1.22 -r1.23 src/usr.sbin/npf/npfctl/npf_data.c cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/npf/npfctl/npf_show.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libnpf/npf.c diff -u src/lib/libnpf/npf.c:1.23 src/lib/libnpf/npf.c:1.24 --- src/lib/libnpf/npf.c:1.23 Tue Nov 12 00:46:34 2013 +++ src/lib/libnpf/npf.c Fri Nov 22 00:25:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf.c,v 1.23 2013/11/12 00:46:34 rmind Exp $ */ +/* $NetBSD: npf.c,v 1.24 2013/11/22 00:25:51 rmind Exp $ */ /*- * Copyright (c) 2010-2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.23 2013/11/12 00:46:34 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.24 2013/11/22 00:25:51 rmind Exp $"); #include <sys/types.h> #include <netinet/in_systm.h> @@ -962,15 +962,17 @@ npf_table_add_entry(nl_table_t *tl, int } bool -npf_table_exists_p(nl_config_t *ncf, u_int tid) +npf_table_exists_p(nl_config_t *ncf, const char *name) { prop_dictionary_t tldict; prop_object_iterator_t it; - u_int i; it = prop_array_iterator(ncf->ncf_table_list); while ((tldict = prop_object_iterator_next(it)) != NULL) { - if (prop_dictionary_get_uint32(tldict, "id", &i) && tid == i) + const char *tname = NULL; + + if (prop_dictionary_get_cstring_nocopy(tldict, "name", &tname) + && strcmp(tname, name) == 0) break; } prop_object_iterator_release(it); @@ -981,12 +983,12 @@ int npf_table_insert(nl_config_t *ncf, nl_table_t *tl) { prop_dictionary_t tldict = tl->ntl_dict; - u_int tid; + const char *name = NULL; - if (!prop_dictionary_get_uint32(tldict, "id", &tid)) { + if (!prop_dictionary_get_cstring_nocopy(tldict, "name", &name)) { return EINVAL; } - if (npf_table_exists_p(ncf, tid)) { + if (npf_table_exists_p(ncf, name)) { return EEXIST; } prop_array_add(ncf->ncf_table_list, tldict); Index: src/lib/libnpf/npf.h diff -u src/lib/libnpf/npf.h:1.20 src/lib/libnpf/npf.h:1.21 --- src/lib/libnpf/npf.h:1.20 Tue Nov 12 00:46:34 2013 +++ src/lib/libnpf/npf.h Fri Nov 22 00:25:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf.h,v 1.20 2013/11/12 00:46:34 rmind Exp $ */ +/* $NetBSD: npf.h,v 1.21 2013/11/22 00:25:51 rmind Exp $ */ /*- * Copyright (c) 2011-2013 The NetBSD Foundation, Inc. @@ -111,7 +111,7 @@ int npf_nat_insert(nl_config_t *, nl_na nl_table_t * npf_table_create(const char *, u_int, int); int npf_table_add_entry(nl_table_t *, int, const npf_addr_t *, const npf_netmask_t); -bool npf_table_exists_p(nl_config_t *, u_int); +bool npf_table_exists_p(nl_config_t *, const char *); int npf_table_insert(nl_config_t *, nl_table_t *); void npf_table_destroy(nl_table_t *); Index: src/sys/net/npf/npf_conf.c diff -u src/sys/net/npf/npf_conf.c:1.4 src/sys/net/npf/npf_conf.c:1.5 --- src/sys/net/npf/npf_conf.c:1.4 Tue Nov 12 00:46:34 2013 +++ src/sys/net/npf/npf_conf.c Fri Nov 22 00:25:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_conf.c,v 1.4 2013/11/12 00:46:34 rmind Exp $ */ +/* $NetBSD: npf_conf.c,v 1.5 2013/11/22 00:25:51 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.4 2013/11/12 00:46:34 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_conf.c,v 1.5 2013/11/22 00:25:51 rmind Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -166,6 +166,9 @@ npf_config_reload(prop_dictionary_t dict if (flush) { npf_ifmap_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. */ Index: src/sys/net/npf/npf_impl.h diff -u src/sys/net/npf/npf_impl.h:1.40 src/sys/net/npf/npf_impl.h:1.41 --- src/sys/net/npf/npf_impl.h:1.40 Sat Nov 16 01:18:58 2013 +++ src/sys/net/npf/npf_impl.h Fri Nov 22 00:25:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_impl.h,v 1.40 2013/11/16 01:18:58 rmind Exp $ */ +/* $NetBSD: npf_impl.h,v 1.41 2013/11/22 00:25:51 rmind Exp $ */ /*- * Copyright (c) 2009-2013 The NetBSD Foundation, Inc. @@ -224,6 +224,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); npf_table_t * npf_table_create(const char *, u_int, int, size_t); void npf_table_destroy(npf_table_t *); Index: src/sys/net/npf/npf_tableset.c diff -u src/sys/net/npf/npf_tableset.c:1.19 src/sys/net/npf/npf_tableset.c:1.20 --- src/sys/net/npf/npf_tableset.c:1.19 Tue Nov 12 00:46:34 2013 +++ src/sys/net/npf/npf_tableset.c Fri Nov 22 00:25:51 2013 @@ -1,7 +1,7 @@ -/* $NetBSD: npf_tableset.c,v 1.19 2013/11/12 00:46:34 rmind Exp $ */ +/* $NetBSD: npf_tableset.c,v 1.20 2013/11/22 00:25:51 rmind Exp $ */ /*- - * Copyright (c) 2009-2012 The NetBSD Foundation, Inc. + * Copyright (c) 2009-2013 The NetBSD Foundation, Inc. * All rights reserved. * * This material is based upon work partially supported by The @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_tableset.c,v 1.19 2013/11/12 00:46:34 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_tableset.c,v 1.20 2013/11/22 00:25:51 rmind Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -243,6 +243,31 @@ npf_tableset_reload(npf_tableset_t *nts, } } +void +npf_tableset_syncdict(const npf_tableset_t *ts, prop_dictionary_t ndict) +{ + prop_array_t tables = prop_array_create(); + const npf_table_t *t; + + KASSERT(npf_config_locked_p()); + + for (u_int tid = 0; tid < ts->ts_nitems; tid++) { + if ((t = ts->ts_map[tid]) == NULL) { + continue; + } + prop_dictionary_t tdict = prop_dictionary_create(); + prop_dictionary_set_cstring(tdict, "name", t->t_name); + prop_dictionary_set_uint32(tdict, "type", t->t_type); + prop_dictionary_set_uint32(tdict, "id", tid); + + prop_array_add(tables, tdict); + prop_object_release(tdict); + } + prop_dictionary_remove(ndict, "tables"); + prop_dictionary_set(ndict, "tables", tables); + prop_object_release(tables); +} + /* * Few helper routines. */ @@ -377,7 +402,7 @@ npf_table_check(npf_tableset_t *ts, cons return ENAMETOOLONG; } if (npf_tableset_getbyname(ts, name)) { - return EINVAL; + return EEXIST; } return 0; } Index: src/usr.sbin/npf/npfctl/npf_build.c diff -u src/usr.sbin/npf/npfctl/npf_build.c:1.30 src/usr.sbin/npf/npfctl/npf_build.c:1.31 --- src/usr.sbin/npf/npfctl/npf_build.c:1.30 Tue Nov 19 00:28:41 2013 +++ src/usr.sbin/npf/npfctl/npf_build.c Fri Nov 22 00:25:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_build.c,v 1.30 2013/11/19 00:28:41 rmind Exp $ */ +/* $NetBSD: npf_build.c,v 1.31 2013/11/22 00:25:51 rmind Exp $ */ /*- * Copyright (c) 2011-2013 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: npf_build.c,v 1.30 2013/11/19 00:28:41 rmind Exp $"); +__RCSID("$NetBSD: npf_build.c,v 1.31 2013/11/22 00:25:51 rmind Exp $"); #include <sys/types.h> #include <sys/ioctl.h> @@ -124,9 +124,9 @@ npfctl_debug_addif(const char *ifname) } bool -npfctl_table_exists_p(const char *id) +npfctl_table_exists_p(const char *name) { - return npf_table_exists_p(npf_conf, atoi(id)); + return npf_conf ? npf_table_exists_p(npf_conf, name) : false; } static in_port_t Index: src/usr.sbin/npf/npfctl/npf_data.c diff -u src/usr.sbin/npf/npfctl/npf_data.c:1.22 src/usr.sbin/npf/npfctl/npf_data.c:1.23 --- src/usr.sbin/npf/npfctl/npf_data.c:1.22 Tue Nov 19 00:28:41 2013 +++ src/usr.sbin/npf/npfctl/npf_data.c Fri Nov 22 00:25:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_data.c,v 1.22 2013/11/19 00:28:41 rmind Exp $ */ +/* $NetBSD: npf_data.c,v 1.23 2013/11/22 00:25:51 rmind Exp $ */ /*- * Copyright (c) 2009-2012 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: npf_data.c,v 1.22 2013/11/19 00:28:41 rmind Exp $"); +__RCSID("$NetBSD: npf_data.c,v 1.23 2013/11/22 00:25:51 rmind Exp $"); #include <sys/types.h> #include <sys/null.h> @@ -221,13 +221,13 @@ npfctl_parse_fam_addr_mask(const char *a } npfvar_t * -npfctl_parse_table_id(const char *id) +npfctl_parse_table_id(const char *name) { - if (!npfctl_table_exists_p(id)) { - yyerror("table '%s' is not defined", id); + if (!npfctl_table_exists_p(name)) { + yyerror("table '%s' is not defined", name); return NULL; } - return npfvar_create_from_string(NPFVAR_TABLE, id); + return npfvar_create_from_string(NPFVAR_TABLE, name); } /* Index: src/usr.sbin/npf/npfctl/npf_show.c diff -u src/usr.sbin/npf/npfctl/npf_show.c:1.6 src/usr.sbin/npf/npfctl/npf_show.c:1.7 --- src/usr.sbin/npf/npfctl/npf_show.c:1.6 Tue Nov 19 17:01:45 2013 +++ src/usr.sbin/npf/npfctl/npf_show.c Fri Nov 22 00:25:51 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_show.c,v 1.6 2013/11/19 17:01:45 christos Exp $ */ +/* $NetBSD: npf_show.c,v 1.7 2013/11/22 00:25:51 rmind Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: npf_show.c,v 1.6 2013/11/19 17:01:45 christos Exp $"); +__RCSID("$NetBSD: npf_show.c,v 1.7 2013/11/22 00:25:51 rmind Exp $"); #include <sys/socket.h> #include <netinet/in.h> @@ -158,13 +158,12 @@ print_table(npf_conf_info_t *ctx, const char *p; while ((tl = npf_table_iterate(ctx->conf)) != NULL) { - if (npf_table_getid(tl) == tid) - break; + if (npf_table_getid(tl) == tid) { + easprintf(&p, "%s", npf_table_getname(tl)); + return p; + } } - if (tl == NULL) - errx(EXIT_FAILURE, "table id %u not found", tid); - easprintf(&p, "%s", npf_table_getname(tl)); - return p; + abort(); } static char *