Module Name: src
Committed By: rmind
Date: Sun Aug 11 20:26:34 UTC 2019
Modified Files:
src/sys/net/npf: npf.c npf_conf.c npf_conn.h npf_ctl.c npf_handler.c
npf_if.c npf_impl.h npf_inet.c npf_nat.c npf_os.c npf_params.c
npf_portmap.c npf_worker.c npfkern.h
src/usr.sbin/npf/npftest/libnpftest: npf_conn_test.c npf_nat_test.c
npf_perf_test.c npf_rule_test.c npf_test_subr.c
Log Message:
Adjust some internal NPF APIs:
* npfkern: use the npfk_ prefix.
* NPF portmap: amend the API so it could be used elsewhere.
* Make npf_connkey_t public.
To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/net/npf/npf.c
cvs rdiff -u -r1.13 -r1.14 src/sys/net/npf/npf_conf.c \
src/sys/net/npf/npf_os.c
cvs rdiff -u -r1.17 -r1.18 src/sys/net/npf/npf_conn.h
cvs rdiff -u -r1.54 -r1.55 src/sys/net/npf/npf_ctl.c \
src/sys/net/npf/npf_inet.c
cvs rdiff -u -r1.46 -r1.47 src/sys/net/npf/npf_handler.c \
src/sys/net/npf/npf_nat.c
cvs rdiff -u -r1.9 -r1.10 src/sys/net/npf/npf_if.c
cvs rdiff -u -r1.75 -r1.76 src/sys/net/npf/npf_impl.h
cvs rdiff -u -r1.1 -r1.2 src/sys/net/npf/npf_params.c
cvs rdiff -u -r1.3 -r1.4 src/sys/net/npf/npf_portmap.c \
src/sys/net/npf/npfkern.h
cvs rdiff -u -r1.6 -r1.7 src/sys/net/npf/npf_worker.c
cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/npf/npftest/libnpftest/npf_conn_test.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/npf/npftest/libnpftest/npf_nat_test.c
cvs rdiff -u -r1.8 -r1.9 src/usr.sbin/npf/npftest/libnpftest/npf_perf_test.c
cvs rdiff -u -r1.17 -r1.18 \
src/usr.sbin/npf/npftest/libnpftest/npf_rule_test.c
cvs rdiff -u -r1.15 -r1.16 \
src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.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.c
diff -u src/sys/net/npf/npf.c:1.39 src/sys/net/npf/npf.c:1.40
--- src/sys/net/npf/npf.c:1.39 Tue Aug 6 11:40:15 2019
+++ src/sys/net/npf/npf.c Sun Aug 11 20:26:33 2019
@@ -33,7 +33,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.39 2019/08/06 11:40:15 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.40 2019/08/11 20:26:33 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -49,7 +49,7 @@ __KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.39
static __read_mostly npf_t * npf_kernel_ctx = NULL;
__dso_public int
-npf_sysinit(unsigned nworkers)
+npfk_sysinit(unsigned nworkers)
{
npf_bpf_sysinit();
npf_tableset_sysinit();
@@ -58,7 +58,7 @@ npf_sysinit(unsigned nworkers)
}
__dso_public void
-npf_sysfini(void)
+npfk_sysfini(void)
{
npf_worker_sysfini();
npf_nat_sysfini();
@@ -67,7 +67,7 @@ npf_sysfini(void)
}
__dso_public npf_t *
-npf_create(int flags, const npf_mbufops_t *mbufops, const npf_ifops_t *ifops)
+npfk_create(int flags, const npf_mbufops_t *mbufops, const npf_ifops_t *ifops)
{
npf_t *npf;
@@ -94,7 +94,7 @@ npf_create(int flags, const npf_mbufops_
}
__dso_public void
-npf_destroy(npf_t *npf)
+npfk_destroy(npf_t *npf)
{
/*
* Destroy the current configuration. Note: at this point all
@@ -117,25 +117,25 @@ npf_destroy(npf_t *npf)
}
__dso_public int
-npf_load(npf_t *npf, void *config_ref, npf_error_t *err)
+npfk_load(npf_t *npf, void *config_ref, npf_error_t *err)
{
return npfctl_load(npf, 0, config_ref);
}
__dso_public void
-npf_gc(npf_t *npf)
+npfk_gc(npf_t *npf)
{
npf_conn_worker(npf);
}
__dso_public void
-npf_thread_register(npf_t *npf)
+npfk_thread_register(npf_t *npf)
{
pserialize_register(npf->qsbr);
}
__dso_public void
-npf_thread_unregister(npf_t *npf)
+npfk_thread_unregister(npf_t *npf)
{
pserialize_perform(npf->qsbr);
pserialize_unregister(npf->qsbr);
@@ -198,14 +198,14 @@ npf_stats_clear_cb(void *mem, void *arg,
*/
__dso_public void
-npf_stats(npf_t *npf, uint64_t *buf)
+npfk_stats(npf_t *npf, uint64_t *buf)
{
memset(buf, 0, NPF_STATS_SIZE);
percpu_foreach(npf->stats_percpu, npf_stats_collect, buf);
}
__dso_public void
-npf_stats_clear(npf_t *npf)
+npfk_stats_clear(npf_t *npf)
{
percpu_foreach(npf->stats_percpu, npf_stats_clear_cb, NULL);
}
Index: src/sys/net/npf/npf_conf.c
diff -u src/sys/net/npf/npf_conf.c:1.13 src/sys/net/npf/npf_conf.c:1.14
--- src/sys/net/npf/npf_conf.c:1.13 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npf_conf.c Sun Aug 11 20:26:33 2019
@@ -47,7 +47,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_conf.c,v 1.13 2019/07/23 00:52:01 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_conf.c,v 1.14 2019/08/11 20:26:33 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -169,7 +169,7 @@ npf_config_load(npf_t *npf, npf_ruleset_
/* Synchronise: drain all references. */
pserialize_perform(npf->qsbr);
if (flush) {
- npf_portmap_flush(npf);
+ npf_portmap_flush(npf->portmap);
npf_ifmap_flush(npf);
}
Index: src/sys/net/npf/npf_os.c
diff -u src/sys/net/npf/npf_os.c:1.13 src/sys/net/npf/npf_os.c:1.14
--- src/sys/net/npf/npf_os.c:1.13 Sat Aug 10 21:13:54 2019
+++ src/sys/net/npf/npf_os.c Sun Aug 11 20:26:34 2019
@@ -33,7 +33,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_os.c,v 1.13 2019/08/10 21:13:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_os.c,v 1.14 2019/08/11 20:26:34 rmind Exp $");
#ifdef _KERNEL_OPT
#include "pf.h"
@@ -135,8 +135,8 @@ npf_fini(void)
devsw_detach(NULL, &npf_cdevsw);
#endif
npf_pfil_unregister(true);
- npf_destroy(npf);
- npf_sysfini();
+ npfk_destroy(npf);
+ npfk_sysfini();
return 0;
}
@@ -146,10 +146,10 @@ npf_init(void)
npf_t *npf;
int error = 0;
- error = npf_sysinit(nworkers);
+ error = npfk_sysinit(nworkers);
if (error)
return error;
- npf = npf_create(0, NULL, &kern_ifops);
+ npf = npfk_create(0, NULL, &kern_ifops);
npf_setkernctx(npf);
npf_pfil_register(true);
@@ -219,7 +219,7 @@ npf_stats_export(npf_t *npf, void *data)
int error;
fullst = kmem_alloc(NPF_STATS_SIZE, KM_SLEEP);
- npf_stats(npf, fullst); /* will zero the buffer */
+ npfk_stats(npf, fullst); /* will zero the buffer */
error = copyout(fullst, uptr, NPF_STATS_SIZE);
kmem_free(fullst, NPF_STATS_SIZE);
return error;
@@ -337,10 +337,10 @@ npf_ifop_setmeta(ifnet_t *ifp, void *arg
* Wrapper of the main packet handler to pass the kernel NPF context.
*/
static int
-npfkern_packet_handler(void *arg, struct mbuf **mp, ifnet_t *ifp, int di)
+npfos_packet_handler(void *arg, struct mbuf **mp, ifnet_t *ifp, int di)
{
npf_t *npf = npf_getkernctx();
- return npf_packet_handler(npf, mp, ifp, di);
+ return npfk_packet_handler(npf, mp, ifp, di);
}
/*
@@ -354,11 +354,11 @@ npf_ifhook(void *arg, unsigned long cmd,
switch (cmd) {
case PFIL_IFNET_ATTACH:
- npf_ifmap_attach(npf, ifp);
+ npfk_ifmap_attach(npf, ifp);
npf_ifaddr_sync(npf, ifp);
break;
case PFIL_IFNET_DETACH:
- npf_ifmap_detach(npf, ifp);
+ npfk_ifmap_detach(npf, ifp);
npf_ifaddr_flush(npf, ifp);
break;
}
@@ -434,12 +434,12 @@ npf_pfil_register(bool init)
/* Packet IN/OUT handlers for IP layer. */
if (npf_ph_inet) {
- error = pfil_add_hook(npfkern_packet_handler, npf,
+ error = pfil_add_hook(npfos_packet_handler, npf,
PFIL_ALL, npf_ph_inet);
KASSERT(error == 0);
}
if (npf_ph_inet6) {
- error = pfil_add_hook(npfkern_packet_handler, npf,
+ error = pfil_add_hook(npfos_packet_handler, npf,
PFIL_ALL, npf_ph_inet6);
KASSERT(error == 0);
}
@@ -473,11 +473,11 @@ npf_pfil_unregister(bool fini)
PFIL_IFADDR, npf_ph_if);
}
if (npf_ph_inet) {
- (void)pfil_remove_hook(npfkern_packet_handler, npf,
+ (void)pfil_remove_hook(npfos_packet_handler, npf,
PFIL_ALL, npf_ph_inet);
}
if (npf_ph_inet6) {
- (void)pfil_remove_hook(npfkern_packet_handler, npf,
+ (void)pfil_remove_hook(npfos_packet_handler, npf,
PFIL_ALL, npf_ph_inet6);
}
pfil_registered = false;
Index: src/sys/net/npf/npf_conn.h
diff -u src/sys/net/npf/npf_conn.h:1.17 src/sys/net/npf/npf_conn.h:1.18
--- src/sys/net/npf/npf_conn.h:1.17 Tue Aug 6 11:40:15 2019
+++ src/sys/net/npf/npf_conn.h Sun Aug 11 20:26:33 2019
@@ -38,8 +38,6 @@
#include "npf_impl.h"
-typedef struct npf_connkey npf_connkey_t;
-
#if defined(__NPF_CONN_PRIVATE)
/*
@@ -91,6 +89,8 @@ struct npf_conn {
uint32_t c_keys[];
};
+#endif
+
/*
* Connection key interface.
*
@@ -104,10 +104,10 @@ struct npf_conn {
#define NPF_CONNKEY_ALEN(key) ((key)->ck_key[0] & 0xffff)
#define NPF_CONNKEY_LEN(key) (8 + (NPF_CONNKEY_ALEN(key) * 2))
-struct npf_connkey {
+typedef struct npf_connkey {
/* Warning: ck_key has a variable length -- see above. */
uint32_t ck_key[NPF_CONNKEY_MAXWORDS];
-};
+} npf_connkey_t;
unsigned npf_conn_conkey(const npf_cache_t *, npf_connkey_t *, bool);
npf_connkey_t * npf_conn_getforwkey(npf_conn_t *);
@@ -119,8 +119,6 @@ unsigned npf_connkey_import(const nvlist
nvlist_t * npf_connkey_export(const npf_connkey_t *);
void npf_connkey_print(const npf_connkey_t *);
-#endif
-
/*
* Connection tracking interface.
*/
@@ -140,7 +138,7 @@ bool npf_conn_pass(const npf_conn_t *,
void npf_conn_setpass(npf_conn_t *, const npf_match_info_t *,
npf_rproc_t *);
int npf_conn_setnat(const npf_cache_t *, npf_conn_t *,
- npf_nat_t *, u_int);
+ npf_nat_t *, unsigned);
npf_nat_t * npf_conn_getnat(npf_conn_t *, const int, bool *);
bool npf_conn_expired(npf_t *, const npf_conn_t *, uint64_t);
void npf_conn_remove(npf_conndb_t *, npf_conn_t *);
Index: src/sys/net/npf/npf_ctl.c
diff -u src/sys/net/npf/npf_ctl.c:1.54 src/sys/net/npf/npf_ctl.c:1.55
--- src/sys/net/npf/npf_ctl.c:1.54 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npf_ctl.c Sun Aug 11 20:26:33 2019
@@ -36,7 +36,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_ctl.c,v 1.54 2019/07/23 00:52:01 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_ctl.c,v 1.55 2019/08/11 20:26:33 rmind Exp $");
#include <sys/param.h>
#include <sys/conf.h>
@@ -121,7 +121,7 @@ npf_mk_params(npf_t *npf, nvlist_t *npf_
val = (int)nvlist_get_number(params, name);
if (set) {
/* Actually set the parameter. */
- error = npf_param_set(npf, name, val);
+ error = npfk_param_set(npf, name, val);
KASSERT(error == 0);
continue;
}
Index: src/sys/net/npf/npf_inet.c
diff -u src/sys/net/npf/npf_inet.c:1.54 src/sys/net/npf/npf_inet.c:1.55
--- src/sys/net/npf/npf_inet.c:1.54 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npf_inet.c Sun Aug 11 20:26:34 2019
@@ -38,7 +38,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.54 2019/07/23 00:52:01 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.55 2019/08/11 20:26:34 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -712,7 +712,9 @@ npf_rwrcksum(const npf_cache_t *npc, u_i
const npf_addr_t *oaddr = npc->npc_ips[which];
const int proto = npc->npc_proto;
const int alen = npc->npc_alen;
- uint16_t *ocksum;
+ uint16_t cksum, *ocksum;
+ struct tcphdr *th;
+ struct udphdr *uh;
in_port_t oport;
KASSERT(npf_iscached(npc, NPC_LAYER4));
@@ -729,41 +731,43 @@ npf_rwrcksum(const npf_cache_t *npc, u_i
KASSERT(npf_iscached(npc, NPC_IP6));
}
- /* Nothing else to do for ICMP. */
- if (proto == IPPROTO_ICMP || proto == IPPROTO_ICMPV6) {
- return true;
- }
- KASSERT(npf_iscached(npc, NPC_TCP) || npf_iscached(npc, NPC_UDP));
-
/*
* Calculate TCP/UDP checksum:
* - Skip if UDP and the current checksum is zero.
* - Fixup the IP address change.
* - Fixup the port change, if required (non-zero).
*/
- if (proto == IPPROTO_TCP) {
- struct tcphdr *th = npc->npc_l4.tcp;
-
+ switch (proto) {
+ case IPPROTO_TCP:
+ KASSERT(npf_iscached(npc, NPC_TCP));
+ th = npc->npc_l4.tcp;
ocksum = &th->th_sum;
oport = (which == NPF_SRC) ? th->th_sport : th->th_dport;
- } else {
- struct udphdr *uh = npc->npc_l4.udp;
-
- KASSERT(proto == IPPROTO_UDP);
+ break;
+ case IPPROTO_UDP:
+ KASSERT(npf_iscached(npc, NPC_UDP));
+ uh = npc->npc_l4.udp;
ocksum = &uh->uh_sum;
if (*ocksum == 0) {
/* No need to update. */
return true;
}
oport = (which == NPF_SRC) ? uh->uh_sport : uh->uh_dport;
+ break;
+ case IPPROTO_ICMP:
+ case IPPROTO_ICMPV6:
+ default:
+ /* Nothing else to do for ICMP. */
+ return true;
}
- uint16_t cksum = npf_addr_cksum(*ocksum, alen, oaddr, addr);
+ /*
+ * Update and rewrite the TCP/UDP checksum.
+ */
+ cksum = npf_addr_cksum(*ocksum, alen, oaddr, addr);
if (port) {
cksum = npf_fixup16_cksum(cksum, oport, port);
}
-
- /* Rewrite TCP/UDP checksum. */
memcpy(ocksum, &cksum, sizeof(uint16_t));
return true;
}
Index: src/sys/net/npf/npf_handler.c
diff -u src/sys/net/npf/npf_handler.c:1.46 src/sys/net/npf/npf_handler.c:1.47
--- src/sys/net/npf/npf_handler.c:1.46 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npf_handler.c Sun Aug 11 20:26:33 2019
@@ -35,7 +35,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.46 2019/07/23 00:52:01 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.47 2019/08/11 20:26:33 rmind Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -112,12 +112,12 @@ npf_reassembly(npf_t *npf, npf_cache_t *
}
/*
- * npf_packet_handler: main packet handling routine for layer 3.
+ * npfk_packet_handler: main packet handling routine for layer 3.
*
* Note: packet flow and inspection logic is in strict order.
*/
__dso_public int
-npf_packet_handler(npf_t *npf, struct mbuf **mp, ifnet_t *ifp, int di)
+npfk_packet_handler(npf_t *npf, struct mbuf **mp, ifnet_t *ifp, int di)
{
nbuf_t nbuf;
npf_cache_t npc;
Index: src/sys/net/npf/npf_nat.c
diff -u src/sys/net/npf/npf_nat.c:1.46 src/sys/net/npf/npf_nat.c:1.47
--- src/sys/net/npf/npf_nat.c:1.46 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npf_nat.c Sun Aug 11 20:26:34 2019
@@ -67,7 +67,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_nat.c,v 1.46 2019/07/23 00:52:01 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_nat.c,v 1.47 2019/08/11 20:26:34 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -514,7 +514,8 @@ npf_nat_create(npf_cache_t *npc, npf_nat
/* Get a new port for translation. */
if ((np->n_flags & NPF_NAT_PORTMAP) != 0) {
- nt->nt_tport = npf_portmap_get(np->n_npfctx, alen, taddr);
+ npf_portmap_t *pm = np->n_npfctx->portmap;
+ nt->nt_tport = npf_portmap_get(pm, alen, taddr);
} else {
nt->nt_tport = np->n_tport;
}
@@ -745,7 +746,8 @@ npf_nat_destroy(npf_nat_t *nt)
/* Return taken port to the portmap. */
if ((np->n_flags & NPF_NAT_PORTMAP) != 0 && nt->nt_tport) {
- npf_portmap_put(npf, nt->nt_alen, &nt->nt_taddr, nt->nt_tport);
+ npf_portmap_t *pm = npf->portmap;
+ npf_portmap_put(pm, nt->nt_alen, &nt->nt_taddr, nt->nt_tport);
}
npf_stats_inc(np->n_npfctx, NPF_STAT_NAT_DESTROY);
@@ -804,10 +806,14 @@ npf_nat_import(npf_t *npf, const nvlist_
nt->nt_tport = dnvlist_get_number(nat, "tport", 0);
/* Take a specific port from port-map. */
- if ((np->n_flags & NPF_NAT_PORTMAP) != 0 && nt->nt_tport &&
- !npf_portmap_take(npf, nt->nt_alen, &nt->nt_taddr, nt->nt_tport)) {
- pool_cache_put(nat_cache, nt);
- return NULL;
+ if ((np->n_flags & NPF_NAT_PORTMAP) != 0 && nt->nt_tport) {
+ npf_portmap_t *pm = npf->portmap;
+
+ if (!npf_portmap_take(pm, nt->nt_alen,
+ &nt->nt_taddr, nt->nt_tport)) {
+ pool_cache_put(nat_cache, nt);
+ return NULL;
+ }
}
npf_stats_inc(npf, NPF_STAT_NAT_CREATE);
Index: src/sys/net/npf/npf_if.c
diff -u src/sys/net/npf/npf_if.c:1.9 src/sys/net/npf/npf_if.c:1.10
--- src/sys/net/npf/npf_if.c:1.9 Sat Sep 29 14:41:36 2018
+++ src/sys/net/npf/npf_if.c Sun Aug 11 20:26:33 2019
@@ -44,7 +44,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_if.c,v 1.9 2018/09/29 14:41:36 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_if.c,v 1.10 2019/08/11 20:26:33 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -181,7 +181,7 @@ npf_ifmap_getname(npf_t *npf, const u_in
}
__dso_public void
-npf_ifmap_attach(npf_t *npf, ifnet_t *ifp)
+npfk_ifmap_attach(npf_t *npf, ifnet_t *ifp)
{
const npf_ifops_t *ifops = npf->ifops;
u_int i;
@@ -193,7 +193,7 @@ npf_ifmap_attach(npf_t *npf, ifnet_t *if
}
__dso_public void
-npf_ifmap_detach(npf_t *npf, ifnet_t *ifp)
+npfk_ifmap_detach(npf_t *npf, ifnet_t *ifp)
{
/* Diagnostic. */
npf_config_enter(npf);
Index: src/sys/net/npf/npf_impl.h
diff -u src/sys/net/npf/npf_impl.h:1.75 src/sys/net/npf/npf_impl.h:1.76
--- src/sys/net/npf/npf_impl.h:1.75 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npf_impl.h Sun Aug 11 20:26:34 2019
@@ -185,7 +185,6 @@ typedef enum {
NPF_PARAMS_CONNDB = 0,
NPF_PARAMS_GENERIC_STATE,
NPF_PARAMS_TCP_STATE,
- NPF_PARAMS_PORTMAP,
NPF_PARAMS_COUNT
} npf_paramgroup_t;
@@ -461,10 +460,13 @@ int npf_state_tcp_timeout(npf_t *, cons
void npf_portmap_init(npf_t *);
void npf_portmap_fini(npf_t *);
-in_port_t npf_portmap_get(npf_t *, int, const npf_addr_t *);
-bool npf_portmap_take(npf_t *, int, const npf_addr_t *, in_port_t);
-void npf_portmap_put(npf_t *, int, const npf_addr_t *, in_port_t);
-void npf_portmap_flush(npf_t *);
+npf_portmap_t * npf_portmap_create(int, int);
+void npf_portmap_destroy(npf_portmap_t *);
+
+in_port_t npf_portmap_get(npf_portmap_t *, int, const npf_addr_t *);
+bool npf_portmap_take(npf_portmap_t *, int, const npf_addr_t *, in_port_t);
+void npf_portmap_put(npf_portmap_t *, int, const npf_addr_t *, in_port_t);
+void npf_portmap_flush(npf_portmap_t *);
/* NAT. */
void npf_nat_sysinit(void);
Index: src/sys/net/npf/npf_params.c
diff -u src/sys/net/npf/npf_params.c:1.1 src/sys/net/npf/npf_params.c:1.2
--- src/sys/net/npf/npf_params.c:1.1 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npf_params.c Sun Aug 11 20:26:34 2019
@@ -26,7 +26,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_params.c,v 1.1 2019/07/23 00:52:01 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_params.c,v 1.2 2019/08/11 20:26:34 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -175,7 +175,7 @@ npf_param_check(npf_t *npf, const char *
}
__dso_public int
-npf_param_get(npf_t *npf, const char *name, int *val)
+npfk_param_get(npf_t *npf, const char *name, int *val)
{
npf_param_t *param;
@@ -187,7 +187,7 @@ npf_param_get(npf_t *npf, const char *na
}
__dso_public int
-npf_param_set(npf_t *npf, const char *name, int val)
+npfk_param_set(npf_t *npf, const char *name, int val)
{
npf_param_t *param;
Index: src/sys/net/npf/npf_portmap.c
diff -u src/sys/net/npf/npf_portmap.c:1.3 src/sys/net/npf/npf_portmap.c:1.4
--- src/sys/net/npf/npf_portmap.c:1.3 Thu Jul 25 01:00:28 2019
+++ src/sys/net/npf/npf_portmap.c Sun Aug 11 20:26:34 2019
@@ -35,7 +35,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_portmap.c,v 1.3 2019/07/25 01:00:28 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_portmap.c,v 1.4 2019/08/11 20:26:34 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -95,63 +95,73 @@ typedef struct bitmap {
unsigned addr_len;
} bitmap_t;
+#define NPF_PORTMAP_MINPORT 1024
+#define NPF_PORTMAP_MAXPORT 65535
+
struct npf_portmap {
thmap_t * addr_map;
LIST_HEAD(, bitmap) bitmap_list;
kmutex_t list_lock;
+ int min_port;
+ int max_port;
};
-typedef struct {
- int min_port;
- int max_port;
-} npf_portmap_params_t;
-
static kmutex_t portmap_lock;
void
npf_portmap_init(npf_t *npf)
{
- npf_portmap_params_t *params = npf_param_allocgroup(npf,
- NPF_PARAMS_PORTMAP, sizeof(npf_portmap_params_t));
+ npf_portmap_t *pm = npf_portmap_create(
+ NPF_PORTMAP_MINPORT, NPF_PORTMAP_MAXPORT);
npf_param_t param_map[] = {
{
"portmap.min_port",
- ¶ms->min_port,
- .default_val = 1024,
+ &pm->min_port,
+ .default_val = NPF_PORTMAP_MINPORT,
.min = 1024, .max = 65535
},
{
"portmap.max_port",
- ¶ms->max_port,
- .default_val = 65535,
+ &pm->max_port,
+ .default_val = NPF_PORTMAP_MAXPORT,
.min = 1024, .max = 65535
}
};
npf_param_register(npf, param_map, __arraycount(param_map));
-
- npf->portmap = kmem_zalloc(sizeof(npf_portmap_t), KM_SLEEP);
- mutex_init(&npf->portmap->list_lock, MUTEX_DEFAULT, IPL_SOFTNET);
- npf->portmap->addr_map = thmap_create(0, NULL, THMAP_NOCOPY);
-
mutex_init(&portmap_lock, MUTEX_DEFAULT, IPL_SOFTNET);
+ npf->portmap = pm;
}
void
npf_portmap_fini(npf_t *npf)
{
- const size_t len = sizeof(npf_portmap_params_t);
- npf_portmap_t *pm = npf->portmap;
+ npf_portmap_destroy(npf->portmap);
+ mutex_destroy(&portmap_lock);
+ npf->portmap = NULL; // diagnostic
+}
+
+npf_portmap_t *
+npf_portmap_create(int min_port, int max_port)
+{
+ npf_portmap_t *pm;
- npf_param_freegroup(npf, NPF_PARAMS_PORTMAP, len);
+ pm = kmem_zalloc(sizeof(npf_portmap_t), KM_SLEEP);
+ mutex_init(&pm->list_lock, MUTEX_DEFAULT, IPL_SOFTNET);
+ pm->addr_map = thmap_create(0, NULL, THMAP_NOCOPY);
+ pm->min_port = min_port;
+ pm->max_port = max_port;
+ return pm;
+}
- npf_portmap_flush(npf);
+void
+npf_portmap_destroy(npf_portmap_t *pm)
+{
+ npf_portmap_flush(pm);
KASSERT(LIST_EMPTY(&pm->bitmap_list));
thmap_destroy(pm->addr_map);
mutex_destroy(&pm->list_lock);
kmem_free(pm, sizeof(npf_portmap_t));
-
- mutex_destroy(&portmap_lock);
}
/////////////////////////////////////////////////////////////////////////
@@ -406,9 +416,8 @@ again:
/////////////////////////////////////////////////////////////////////////
static bitmap_t *
-npf_portmap_autoget(npf_t *npf, unsigned alen, const npf_addr_t *addr)
+npf_portmap_autoget(npf_portmap_t *pm, unsigned alen, const npf_addr_t *addr)
{
- npf_portmap_t *pm = npf->portmap;
bitmap_t *bm;
KASSERT(pm && pm->addr_map);
@@ -456,9 +465,8 @@ npf_portmap_autoget(npf_t *npf, unsigned
* need to acquire locks.
*/
void
-npf_portmap_flush(npf_t *npf)
+npf_portmap_flush(npf_portmap_t *pm)
{
- npf_portmap_t *pm = npf->portmap;
bitmap_t *bm;
while ((bm = LIST_FIRST(&pm->bitmap_list)) != NULL) {
@@ -486,28 +494,27 @@ npf_portmap_flush(npf_t *npf)
* => Zero indicates a failure.
*/
in_port_t
-npf_portmap_get(npf_t *npf, int alen, const npf_addr_t *addr)
+npf_portmap_get(npf_portmap_t *pm, int alen, const npf_addr_t *addr)
{
- const npf_portmap_params_t *params = npf->params[NPF_PARAMS_PORTMAP];
- const unsigned port_delta = params->max_port - params->min_port;
+ const unsigned port_delta = pm->max_port - pm->min_port;
unsigned bit, target;
bitmap_t *bm;
- bm = npf_portmap_autoget(npf, alen, addr);
+ bm = npf_portmap_autoget(pm, alen, addr);
if (bm == NULL) {
/* No memory. */
return 0;
}
/* Randomly select a port. */
- target = params->min_port + (cprng_fast32() % port_delta);
+ target = pm->min_port + (cprng_fast32() % port_delta);
bit = target;
next:
if (bitmap_set(bm, bit)) {
/* Success. */
return htons(bit);
}
- bit = params->min_port + ((bit + 1) % port_delta);
+ bit = pm->min_port + ((bit + 1) % port_delta);
if (target != bit) {
/* Next.. */
goto next;
@@ -520,13 +527,13 @@ next:
* npf_portmap_take: allocate a specific port in the portmap.
*/
bool
-npf_portmap_take(npf_t *npf, int alen, const npf_addr_t *addr, in_port_t port)
+npf_portmap_take(npf_portmap_t *pm, int alen,
+ const npf_addr_t *addr, in_port_t port)
{
- const npf_portmap_params_t *params = npf->params[NPF_PARAMS_PORTMAP];
- bitmap_t *bm = npf_portmap_autoget(npf, alen, addr);
+ bitmap_t *bm = npf_portmap_autoget(pm, alen, addr);
port = ntohs(port);
- if (!bm || port < params->min_port || port > params->max_port) {
+ if (!bm || port < pm->min_port || port > pm->max_port) {
/* Out of memory / invalid port. */
return false;
}
@@ -539,11 +546,12 @@ npf_portmap_take(npf_t *npf, int alen, c
* => The port value should be in network byte-order.
*/
void
-npf_portmap_put(npf_t *npf, int alen, const npf_addr_t *addr, in_port_t port)
+npf_portmap_put(npf_portmap_t *pm, int alen,
+ const npf_addr_t *addr, in_port_t port)
{
bitmap_t *bm;
- bm = npf_portmap_autoget(npf, alen, addr);
+ bm = npf_portmap_autoget(pm, alen, addr);
if (bm) {
port = ntohs(port);
bitmap_clr(bm, port);
Index: src/sys/net/npf/npfkern.h
diff -u src/sys/net/npf/npfkern.h:1.3 src/sys/net/npf/npfkern.h:1.4
--- src/sys/net/npf/npfkern.h:1.3 Tue Jul 23 00:52:01 2019
+++ src/sys/net/npf/npfkern.h Sun Aug 11 20:26:34 2019
@@ -61,23 +61,23 @@ typedef struct {
bool (*ensure_writable)(struct mbuf **, size_t);
} npf_mbufops_t;
-int npf_sysinit(unsigned);
-void npf_sysfini(void);
+int npfk_sysinit(unsigned);
+void npfk_sysfini(void);
-npf_t * npf_create(int, const npf_mbufops_t *, const npf_ifops_t *);
-int npf_load(npf_t *, void *, npf_error_t *);
-void npf_gc(npf_t *);
-void npf_destroy(npf_t *);
+npf_t * npfk_create(int, const npf_mbufops_t *, const npf_ifops_t *);
+int npfk_load(npf_t *, void *, npf_error_t *);
+void npfk_gc(npf_t *);
+void npfk_destroy(npf_t *);
-void npf_thread_register(npf_t *);
-void npf_thread_unregister(npf_t *);
-int npf_packet_handler(npf_t *, struct mbuf **, struct ifnet *, int);
-void npf_ifmap_attach(npf_t *, struct ifnet *);
-void npf_ifmap_detach(npf_t *, struct ifnet *);
-int npf_param_get(npf_t *, const char *, int *);
-int npf_param_set(npf_t *, const char *, int);
-void npf_stats(npf_t *, uint64_t *);
-void npf_stats_clear(npf_t *);
+void npfk_thread_register(npf_t *);
+void npfk_thread_unregister(npf_t *);
+int npfk_packet_handler(npf_t *, struct mbuf **, struct ifnet *, int);
+void npfk_ifmap_attach(npf_t *, struct ifnet *);
+void npfk_ifmap_detach(npf_t *, struct ifnet *);
+int npfk_param_get(npf_t *, const char *, int *);
+int npfk_param_set(npf_t *, const char *, int);
+void npfk_stats(npf_t *, uint64_t *);
+void npfk_stats_clear(npf_t *);
/*
* ALGs.
Index: src/sys/net/npf/npf_worker.c
diff -u src/sys/net/npf/npf_worker.c:1.6 src/sys/net/npf/npf_worker.c:1.7
--- src/sys/net/npf/npf_worker.c:1.6 Sat Jan 19 21:19:32 2019
+++ src/sys/net/npf/npf_worker.c Sun Aug 11 20:26:34 2019
@@ -29,7 +29,7 @@
#ifdef _KERNEL
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_worker.c,v 1.6 2019/01/19 21:19:32 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_worker.c,v 1.7 2019/08/11 20:26:34 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -198,7 +198,7 @@ npf_worker(void *arg)
npf_workfunc_t work;
if (!npf->sync_registered) {
- npf_thread_register(npf);
+ npfk_thread_register(npf);
npf->sync_registered = true;
}
Index: src/usr.sbin/npf/npftest/libnpftest/npf_conn_test.c
diff -u src/usr.sbin/npf/npftest/libnpftest/npf_conn_test.c:1.2 src/usr.sbin/npf/npftest/libnpftest/npf_conn_test.c:1.3
--- src/usr.sbin/npf/npftest/libnpftest/npf_conn_test.c:1.2 Tue Jul 23 00:52:02 2019
+++ src/usr.sbin/npf/npftest/libnpftest/npf_conn_test.c Sun Aug 11 20:26:34 2019
@@ -113,7 +113,7 @@ run_gc_tests(void)
int val;
/* Check the default value. */
- npf_param_get(npf_getkernctx(), "gc.step", &val);
+ npfk_param_get(npf_getkernctx(), "gc.step", &val);
CHECK_TRUE(val == 256);
/* Empty => GC => 0 in conndb. */
@@ -145,7 +145,7 @@ run_gc_tests(void)
CHECK_TRUE(ok);
/* 512 expired => GC => 127 in conndb. */
- npf_param_set(npf_getkernctx(), "gc.step", 128);
+ npfk_param_set(npf_getkernctx(), "gc.step", 128);
ok = run_conn_gc(0, 512, 384);
CHECK_TRUE(ok);
Index: src/usr.sbin/npf/npftest/libnpftest/npf_nat_test.c
diff -u src/usr.sbin/npf/npftest/libnpftest/npf_nat_test.c:1.12 src/usr.sbin/npf/npftest/libnpftest/npf_nat_test.c:1.13
--- src/usr.sbin/npf/npftest/libnpftest/npf_nat_test.c:1.12 Tue Jul 23 00:52:02 2019
+++ src/usr.sbin/npf/npftest/libnpftest/npf_nat_test.c Sun Aug 11 20:26:34 2019
@@ -230,7 +230,7 @@ npf_nat_test(bool verbose)
}
m = mbuf_get_pkt(t->af, IPPROTO_UDP,
t->src, t->dst, t->sport, t->dport);
- error = npf_packet_handler(npf, &m, ifp, t->di);
+ error = npfk_packet_handler(npf, &m, ifp, t->di);
ret = checkresult(verbose, i, m, ifp, error);
if (m) {
m_freem(m);
Index: src/usr.sbin/npf/npftest/libnpftest/npf_perf_test.c
diff -u src/usr.sbin/npf/npftest/libnpftest/npf_perf_test.c:1.8 src/usr.sbin/npf/npftest/libnpftest/npf_perf_test.c:1.9
--- src/usr.sbin/npf/npftest/libnpftest/npf_perf_test.c:1.8 Tue Jul 23 00:52:02 2019
+++ src/usr.sbin/npf/npftest/libnpftest/npf_perf_test.c Sun Aug 11 20:26:34 2019
@@ -42,7 +42,7 @@ worker(void *arg)
while (!done) {
int error;
- error = npf_packet_handler(npf, &m, ifp, PFIL_OUT);
+ error = npfk_packet_handler(npf, &m, ifp, PFIL_OUT);
KASSERT(error == 0); (void)error;
n++;
}
Index: src/usr.sbin/npf/npftest/libnpftest/npf_rule_test.c
diff -u src/usr.sbin/npf/npftest/libnpftest/npf_rule_test.c:1.17 src/usr.sbin/npf/npftest/libnpftest/npf_rule_test.c:1.18
--- src/usr.sbin/npf/npftest/libnpftest/npf_rule_test.c:1.17 Tue Jul 23 00:52:02 2019
+++ src/usr.sbin/npf/npftest/libnpftest/npf_rule_test.c Sun Aug 11 20:26:34 2019
@@ -92,7 +92,7 @@ run_handler_testcase(unsigned i)
int error;
m = mbuf_get_pkt(AF_INET, IPPROTO_UDP, t->src, t->dst, 9000, 9000);
- error = npf_packet_handler(npf, &m, ifp, t->di);
+ error = npfk_packet_handler(npf, &m, ifp, t->di);
if (m) {
m_freem(m);
}
Index: src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c
diff -u src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c:1.15 src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c:1.16
--- src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c:1.15 Tue Jul 23 00:52:02 2019
+++ src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c Sun Aug 11 20:26:34 2019
@@ -63,9 +63,9 @@ npf_test_init(int (*pton_func)(int, cons
{
npf_t *npf;
- npf_sysinit(0);
- npf = npf_create(0, &npftest_mbufops, &npftest_ifops);
- npf_thread_register(npf);
+ npfk_sysinit(0);
+ npf = npfk_create(0, &npftest_mbufops, &npftest_ifops);
+ npfk_thread_register(npf);
npf_setkernctx(npf);
npf_state_setsampler(npf_state_sample);
@@ -80,9 +80,9 @@ void
npf_test_fini(void)
{
npf_t *npf = npf_getkernctx();
- npf_thread_unregister(npf);
- npf_destroy(npf);
- npf_sysfini();
+ npfk_thread_unregister(npf);
+ npfk_destroy(npf);
+ npfk_sysfini();
}
int
@@ -99,7 +99,7 @@ npf_test_load(const void *buf, size_t le
load_npf_config_ifs(npf_dict, verbose);
// Note: npf_dict will be consumed by npf_load().
- return npf_load(npf_getkernctx(), npf_dict, &error);
+ return npfk_load(npf_getkernctx(), npf_dict, &error);
}
ifnet_t *
@@ -116,7 +116,7 @@ npf_test_addif(const char *ifname, bool
strlcpy(ifp->if_xname, ifname, sizeof(ifp->if_xname));
TAILQ_INSERT_TAIL(&npftest_ifnet_list, ifp, if_list);
- npf_ifmap_attach(npf, ifp);
+ npfk_ifmap_attach(npf, ifp);
if (reg) {
npf_ifmap_register(npf, ifname);
}
@@ -212,7 +212,7 @@ npf_test_statetrack(const void *data, si
int i = 0, error;
m = mbuf_getwithdata(data, len);
- error = npf_packet_handler(npf, &m, ifp, forw ? PFIL_OUT : PFIL_IN);
+ error = npfk_packet_handler(npf, &m, ifp, forw ? PFIL_OUT : PFIL_IN);
if (error) {
assert(m == NULL);
return error;