Module Name: src Committed By: rmind Date: Tue Jan 3 00:58:05 UTC 2017
Modified Files: src/sys/net/npf: npf_conf.c npf_ifaddr.c npf_impl.h npf_os.c Log Message: NPF: fix the interface table initialisation on load. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/net/npf/npf_conf.c cvs rdiff -u -r1.1 -r1.2 src/sys/net/npf/npf_ifaddr.c cvs rdiff -u -r1.66 -r1.67 src/sys/net/npf/npf_impl.h cvs rdiff -u -r1.4 -r1.5 src/sys/net/npf/npf_os.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.10 src/sys/net/npf/npf_conf.c:1.11 --- src/sys/net/npf/npf_conf.c:1.10 Mon Dec 26 23:05:06 2016 +++ src/sys/net/npf/npf_conf.c Tue Jan 3 00:58:05 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_conf.c,v 1.10 2016/12/26 23:05:06 christos Exp $ */ +/* $NetBSD: npf_conf.c,v 1.11 2017/01/03 00:58:05 rmind Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -49,7 +49,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_conf.c,v 1.10 2016/12/26 23:05:06 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_conf.c,v 1.11 2017/01/03 00:58:05 rmind Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -157,7 +157,7 @@ npf_config_load(npf_t *npf, npf_ruleset_ npf_ifmap_flush(npf); npf_conn_load(npf, conns, !flush); mutex_exit(&npf->config_lock); - return; + goto done; } /* @@ -183,6 +183,9 @@ npf_config_load(npf_t *npf, npf_ruleset_ /* Finally, it is safe to destroy the old config. */ npf_config_destroy(onc); +done: + /* Sync all interface address tables (can be done asynchronously). */ + npf_ifaddr_syncall(npf); } /* Index: src/sys/net/npf/npf_ifaddr.c diff -u src/sys/net/npf/npf_ifaddr.c:1.1 src/sys/net/npf/npf_ifaddr.c:1.2 --- src/sys/net/npf/npf_ifaddr.c:1.1 Mon Jan 2 21:49:51 2017 +++ src/sys/net/npf/npf_ifaddr.c Tue Jan 3 00:58:05 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_ifaddr.c,v 1.1 2017/01/02 21:49:51 rmind Exp $ */ +/* $NetBSD: npf_ifaddr.c,v 1.2 2017/01/03 00:58:05 rmind Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_ifaddr.c,v 1.1 2017/01/02 21:49:51 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_ifaddr.c,v 1.2 2017/01/03 00:58:05 rmind Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -46,20 +46,6 @@ __KERNEL_RCSID(0, "$NetBSD: npf_ifaddr.c #include "npf_impl.h" -void -npf_ifaddr_init(npf_t *npf) -{ - ifnet_t *ifp; - - KERNEL_LOCK(1, NULL); - IFNET_LOCK(); - IFNET_WRITER_FOREACH(ifp) { - npf_ifaddr_sync(npf, ifp); - } - IFNET_UNLOCK(); - KERNEL_UNLOCK_ONE(NULL); -} - static npf_table_t * lookup_ifnet_table(npf_t *npf, ifnet_t *ifp) { @@ -177,3 +163,19 @@ npf_ifaddr_flush(npf_t *npf, ifnet_t *if } replace_ifnet_table(npf, t); } + +void +npf_ifaddr_syncall(npf_t *npf) +{ + ifnet_t *ifp; + + KERNEL_LOCK(1, NULL); + IFNET_LOCK(); + IFNET_WRITER_FOREACH(ifp) { + npf_ifaddr_sync(npf, ifp); + } + IFNET_UNLOCK(); + KERNEL_UNLOCK_ONE(NULL); +} + + Index: src/sys/net/npf/npf_impl.h diff -u src/sys/net/npf/npf_impl.h:1.66 src/sys/net/npf/npf_impl.h:1.67 --- src/sys/net/npf/npf_impl.h:1.66 Mon Jan 2 21:49:51 2017 +++ src/sys/net/npf/npf_impl.h Tue Jan 3 00:58:05 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_impl.h,v 1.66 2017/01/02 21:49:51 rmind Exp $ */ +/* $NetBSD: npf_impl.h,v 1.67 2017/01/03 00:58:05 rmind Exp $ */ /*- * Copyright (c) 2009-2014 The NetBSD Foundation, Inc. @@ -247,9 +247,9 @@ void npf_ifmap_flush(npf_t *); u_int npf_ifmap_getid(npf_t *, const ifnet_t *); const char * npf_ifmap_getname(npf_t *, const u_int); -void npf_ifaddr_init(npf_t *); void npf_ifaddr_sync(npf_t *, ifnet_t *); void npf_ifaddr_flush(npf_t *, ifnet_t *); +void npf_ifaddr_syncall(npf_t *); /* Packet filter hooks. */ int npf_pfil_register(bool); Index: src/sys/net/npf/npf_os.c diff -u src/sys/net/npf/npf_os.c:1.4 src/sys/net/npf/npf_os.c:1.5 --- src/sys/net/npf/npf_os.c:1.4 Mon Jan 2 23:02:04 2017 +++ src/sys/net/npf/npf_os.c Tue Jan 3 00:58:05 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_os.c,v 1.4 2017/01/02 23:02:04 christos Exp $ */ +/* $NetBSD: npf_os.c,v 1.5 2017/01/03 00:58:05 rmind Exp $ */ /*- * Copyright (c) 2009-2016 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_os.c,v 1.4 2017/01/02 23:02:04 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_os.c,v 1.5 2017/01/03 00:58:05 rmind Exp $"); #ifdef _KERNEL_OPT #include "pf.h" @@ -153,7 +153,6 @@ npf_init(void) npf = npf_create(0, NULL, &kern_ifops); npf_setkernctx(npf); npf_pfil_register(true); - npf_ifaddr_init(npf); #ifdef _MODULE devmajor_t bmajor = NODEVMAJOR, cmajor = NODEVMAJOR; @@ -445,6 +444,12 @@ npf_pfil_register(bool init) PFIL_ALL, npf_ph_inet6); KASSERT(error == 0); } + + /* + * It is necessary to re-sync all/any interface address tables, + * since we did not listen for any changes. + */ + npf_ifaddr_syncall(npf); pfil_registered = true; out: KERNEL_UNLOCK_ONE(NULL);