Module Name: src
Committed By: christos
Date: Mon Dec 26 23:21:49 UTC 2016
Modified Files:
src/sys/dist/pf/net: pf_if.c
src/sys/external/bsd/ipf/netinet: ip_fil_netbsd.c
src/sys/net: if.c if_pppoe.c if_spppsubr.c pfil.c pfil.h
Log Message:
pfil(9) improvements to handle address changes:
Add:
PFIL_IFADDR call on interface reconfig (mbuf is ioctl #)
PFIL_IFNET call on interface attach/detach (mbuf is PFIL_IFNET_*)
from rmind@
To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/sys/dist/pf/net/pf_if.c
cvs rdiff -u -r1.19 -r1.20 src/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c
cvs rdiff -u -r1.368 -r1.369 src/sys/net/if.c
cvs rdiff -u -r1.121 -r1.122 src/sys/net/if_pppoe.c
cvs rdiff -u -r1.163 -r1.164 src/sys/net/if_spppsubr.c
cvs rdiff -u -r1.28 -r1.29 src/sys/net/pfil.c
cvs rdiff -u -r1.31 -r1.32 src/sys/net/pfil.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dist/pf/net/pf_if.c
diff -u src/sys/dist/pf/net/pf_if.c:1.31 src/sys/dist/pf/net/pf_if.c:1.32
--- src/sys/dist/pf/net/pf_if.c:1.31 Wed Jul 20 03:37:51 2016
+++ src/sys/dist/pf/net/pf_if.c Mon Dec 26 18:21:49 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: pf_if.c,v 1.31 2016/07/20 07:37:51 ozaki-r Exp $ */
+/* $NetBSD: pf_if.c,v 1.32 2016/12/26 23:21:49 christos Exp $ */
/* $OpenBSD: pf_if.c,v 1.47 2007/07/13 09:17:48 markus Exp $ */
/*
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf_if.c,v 1.31 2016/07/20 07:37:51 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf_if.c,v 1.32 2016/12/26 23:21:49 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -87,8 +87,8 @@ int pfi_unmask(void *);
void pfi_init_groups(struct ifnet *);
void pfi_destroy_groups(struct ifnet *);
-int pfil_ifnet_wrapper(void *, struct mbuf **, struct ifnet *, int);
-int pfil_ifaddr_wrapper(void *, struct mbuf **, struct ifnet *, int);
+void pfil_ifnet_wrapper(void *, u_long, void *);
+void pfil_ifaddr_wrapper(void *, u_long, void *);
#endif
RB_PROTOTYPE(pfi_ifhead, pfi_kif, pfik_tree, pfi_if_compare);
@@ -138,8 +138,8 @@ pfi_initialize(void)
pserialize_read_exit(s);
curlwp_bindx(bound);
- pfil_add_hook(pfil_ifnet_wrapper, NULL, PFIL_IFNET, if_pfil);
- pfil_add_hook(pfil_ifaddr_wrapper, NULL, PFIL_IFADDR, if_pfil);
+ pfil_add_ihook(pfil_ifnet_wrapper, NULL, PFIL_IFNET, if_pfil);
+ pfil_add_ihook(pfil_ifaddr_wrapper, NULL, PFIL_IFADDR, if_pfil);
#endif /* __NetBSD__ */
}
@@ -152,8 +152,8 @@ pfi_destroy(void)
int s;
int bound;
- pfil_remove_hook(pfil_ifaddr_wrapper, NULL, PFIL_IFADDR, if_pfil);
- pfil_remove_hook(pfil_ifnet_wrapper, NULL, PFIL_IFNET, if_pfil);
+ pfil_remove_ihook(pfil_ifaddr_wrapper, NULL, PFIL_IFADDR, if_pfil);
+ pfil_remove_ihook(pfil_ifnet_wrapper, NULL, PFIL_IFNET, if_pfil);
bound = curlwp_bind();
s = pserialize_read_enter();
@@ -885,10 +885,10 @@ pfi_destroy_groups(struct ifnet *ifp)
if_destroy_groups(ifp);
}
-int
-pfil_ifnet_wrapper(void *arg, struct mbuf **mp, struct ifnet *ifp, int dir)
+void
+pfil_ifnet_wrapper(void *arg, u_long cmd, void *arg2)
{
- u_long cmd = (u_long)mp;
+ ifnet_t *ifp = arg2;
switch (cmd) {
case PFIL_IFNET_ATTACH:
@@ -904,14 +904,12 @@ pfil_ifnet_wrapper(void *arg, struct mbu
default:
panic("pfil_ifnet_wrapper: unexpected cmd %lu", cmd);
}
-
- return (0);
}
-int
-pfil_ifaddr_wrapper(void *arg, struct mbuf **mp, struct ifnet *ifp, int dir)
+void
+pfil_ifaddr_wrapper(void *arg, u_long cmd, void *arg2)
{
- u_long cmd = (u_long)mp;
+ struct ifaddr *ifa = arg2;
switch (cmd) {
case SIOCSIFADDR:
@@ -921,12 +919,10 @@ pfil_ifaddr_wrapper(void *arg, struct mb
case SIOCAIFADDR_IN6:
case SIOCDIFADDR_IN6:
#endif /* INET6 */
- pfi_kifaddr_update(ifp->if_pf_kif);
+ pfi_kifaddr_update(ifa->ifa_ifp->if_pf_kif);
break;
default:
panic("pfil_ifaddr_wrapper: unexpected ioctl %lu", cmd);
}
-
- return (0);
}
#endif /* __NetBSD__ */
Index: src/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c
diff -u src/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c:1.19 src/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c:1.20
--- src/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c:1.19 Thu Dec 8 00:16:33 2016
+++ src/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c Mon Dec 26 18:21:49 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_fil_netbsd.c,v 1.19 2016/12/08 05:16:33 ozaki-r Exp $ */
+/* $NetBSD: ip_fil_netbsd.c,v 1.20 2016/12/26 23:21:49 christos Exp $ */
/*
* Copyright (C) 2012 by Darren Reed.
@@ -8,7 +8,7 @@
#if !defined(lint)
#if defined(__NetBSD__)
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_fil_netbsd.c,v 1.19 2016/12/08 05:16:33 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_fil_netbsd.c,v 1.20 2016/12/26 23:21:49 christos Exp $");
#else
static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-2000 Darren Reed";
static const char rcsid[] = "@(#)Id: ip_fil_netbsd.c,v 1.1.1.2 2012/07/22 13:45:17 darrenr Exp";
@@ -268,10 +268,13 @@ ipf_check_wrapper6(void *arg, struct mbu
# if defined(PFIL_TYPE_IFNET) && defined(PFIL_IFNET)
-static int ipf_pfilsync(void *, struct mbuf **, struct ifnet *, int);
-static int
-ipf_pfilsync(void *hdr, struct mbuf **mp, struct ifnet *ifp, int dir)
+# if (__NetBSD_Version__ >= 799000400)
+
+static void ipf_pfilsync(void *, unsigned long, void *);
+
+static void
+ipf_pfilsync(void *hdr, unsigned long cmd, void *arg2)
{
/*
* The interface pointer is useless for create (we have nothing to
@@ -281,8 +284,20 @@ ipf_pfilsync(void *hdr, struct mbuf **mp
* pointer, so it's not much use then, either.
*/
ipf_sync(&ipfmain, NULL);
+}
+
+# else
+
+static int ipf_pfilsync(void *, struct mbuf **, struct ifnet *, int);
+
+static int
+ipf_pfilsync(void *hdr, struct mbuf **mp, struct ifnet *ifp, int dir)
+{
+ ipf_sync(&ipfmain, NULL);
return 0;
}
+
+# endif
# endif
#endif /* __NetBSD_Version__ >= 105110000 */
@@ -445,8 +460,13 @@ ipfattach(ipf_main_softc_t *softc)
# if defined(PFIL_TYPE_IFNET) && defined(PFIL_IFNET)
if (ph_ifsync != NULL)
+#if (__NetBSD_Version__ >= 799000400)
(void) pfil_add_hook((void *)ipf_pfilsync, NULL,
PFIL_IFNET, ph_ifsync);
+#else
+ (void) pfil_add_hook((void *)ipf_pfilsync, NULL,
+ PFIL_IFNET, ph_ifsync);
+#endif
# endif
#endif
Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.368 src/sys/net/if.c:1.369
--- src/sys/net/if.c:1.368 Thu Dec 15 04:28:06 2016
+++ src/sys/net/if.c Mon Dec 26 18:21:49 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if.c,v 1.368 2016/12/15 09:28:06 ozaki-r Exp $ */
+/* $NetBSD: if.c,v 1.369 2016/12/26 23:21:49 christos Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.368 2016/12/15 09:28:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.369 2016/12/26 23:21:49 christos Exp $");
#if defined(_KERNEL_OPT)
#include "opt_inet.h"
@@ -194,7 +194,7 @@ static LIST_HEAD(, if_clone) if_cloners
static int if_cloners_count;
/* Packet filtering hook for interfaces. */
-pfil_head_t * if_pfil;
+pfil_head_t * if_pfil __read_mostly;
static kauth_listener_t if_listener;
@@ -690,8 +690,7 @@ if_initialize(ifnet_t *ifp)
IFQ_LOCK_INIT(&ifp->if_snd);
ifp->if_pfil = pfil_head_create(PFIL_TYPE_IFNET, ifp);
- (void)pfil_run_hooks(if_pfil,
- (struct mbuf **)PFIL_IFNET_ATTACH, ifp, PFIL_IFNET);
+ pfil_run_ifhooks(if_pfil, PFIL_IFNET_ATTACH, ifp);
IF_AFDATA_LOCK_INIT(ifp);
@@ -1433,8 +1432,7 @@ again:
}
}
- (void)pfil_run_hooks(if_pfil,
- (struct mbuf **)PFIL_IFNET_DETACH, ifp, PFIL_IFNET);
+ pfil_run_ifhooks(if_pfil, PFIL_IFNET_DETACH, ifp);
(void)pfil_head_destroy(ifp->if_pfil);
/* Announce that the interface is gone. */
Index: src/sys/net/if_pppoe.c
diff -u src/sys/net/if_pppoe.c:1.121 src/sys/net/if_pppoe.c:1.122
--- src/sys/net/if_pppoe.c:1.121 Fri Dec 16 03:47:36 2016
+++ src/sys/net/if_pppoe.c Mon Dec 26 18:21:49 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_pppoe.c,v 1.121 2016/12/16 08:47:36 knakahara Exp $ */
+/* $NetBSD: if_pppoe.c,v 1.122 2016/12/26 23:21:49 christos Exp $ */
/*-
* Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.121 2016/12/16 08:47:36 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.122 2016/12/26 23:21:49 christos Exp $");
#ifdef _KERNEL_OPT
#include "pppoe.h"
@@ -235,7 +235,7 @@ static struct pppoe_softc * pppoe_find_s
struct ifnet *, krw_t);
static struct mbuf *pppoe_get_mbuf(size_t len);
-static int pppoe_ifattach_hook(void *, struct mbuf **, struct ifnet *, int);
+static void pppoe_ifattach_hook(void *, u_long, void *);
static LIST_HEAD(pppoe_softc_head, pppoe_softc) pppoe_softc_list;
static krwlock_t pppoe_softc_list_lock;
@@ -339,7 +339,7 @@ pppoe_clone_create(struct if_clone *ifc,
bpf_attach(&sc->sc_sppp.pp_if, DLT_PPP_ETHER, 0);
if (LIST_EMPTY(&pppoe_softc_list)) {
- pfil_add_hook(pppoe_ifattach_hook, NULL, PFIL_IFNET, if_pfil);
+ pfil_add_ihook(pppoe_ifattach_hook, NULL, PFIL_IFNET, if_pfil);
}
sc->sc_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_SOFTNET);
@@ -364,7 +364,7 @@ pppoe_clone_destroy(struct ifnet *ifp)
LIST_REMOVE(sc, sc_list);
if (LIST_EMPTY(&pppoe_softc_list)) {
- pfil_remove_hook(pppoe_ifattach_hook, NULL, PFIL_IFNET, if_pfil);
+ pfil_remove_ihook(pppoe_ifattach_hook, NULL, PFIL_IFNET, if_pfil);
}
rw_exit(&pppoe_softc_list_lock);
Index: src/sys/net/if_spppsubr.c
diff -u src/sys/net/if_spppsubr.c:1.163 src/sys/net/if_spppsubr.c:1.164
--- src/sys/net/if_spppsubr.c:1.163 Mon Dec 12 19:35:11 2016
+++ src/sys/net/if_spppsubr.c Mon Dec 26 18:21:49 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_spppsubr.c,v 1.163 2016/12/13 00:35:11 knakahara Exp $ */
+/* $NetBSD: if_spppsubr.c,v 1.164 2016/12/26 23:21:49 christos Exp $ */
/*
* Synchronous PPP/Cisco link level subroutines.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.163 2016/12/13 00:35:11 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.164 2016/12/26 23:21:49 christos Exp $");
#if defined(_KERNEL_OPT)
#include "opt_inet.h"
@@ -5290,8 +5290,7 @@ sppp_set_ip_addrs_work(struct work *wk,
ifp->if_xname, __func__, error);
}
if (!error) {
- (void)pfil_run_hooks(if_pfil,
- (struct mbuf **)SIOCAIFADDR, ifp, PFIL_IFADDR);
+ pfil_run_addrhooks(if_pfil, SIOCAIFADDR, ifa);
}
}
@@ -5521,8 +5520,7 @@ sppp_set_ip6_addr(struct sppp *sp, const
ifp->if_xname, __func__, error);
}
if (!error) {
- (void)pfil_run_hooks(if_pfil,
- (struct mbuf **)SIOCAIFADDR_IN6, ifp, PFIL_IFADDR);
+ pfil_run_addrhooks(if_pfil, SIOCAIFADDR_IN6, ifa);
}
}
}
Index: src/sys/net/pfil.c
diff -u src/sys/net/pfil.c:1.28 src/sys/net/pfil.c:1.29
--- src/sys/net/pfil.c:1.28 Sat Jun 29 17:06:58 2013
+++ src/sys/net/pfil.c Mon Dec 26 18:21:49 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: pfil.c,v 1.28 2013/06/29 21:06:58 rmind Exp $ */
+/* $NetBSD: pfil.c,v 1.29 2016/12/26 23:21:49 christos Exp $ */
/*
* Copyright (c) 2013 Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pfil.c,v 1.28 2013/06/29 21:06:58 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pfil.c,v 1.29 2016/12/26 23:21:49 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -40,8 +40,11 @@ __KERNEL_RCSID(0, "$NetBSD: pfil.c,v 1.2
#define MAX_HOOKS 8
+/* Func is either pfil_func_t or pfil_ifunc_t. */
+typedef void (*pfil_polyfunc_t)(void);
+
typedef struct {
- pfil_func_t pfil_func;
+ pfil_polyfunc_t pfil_func;
void * pfil_arg;
} pfil_hook_t;
@@ -50,9 +53,11 @@ typedef struct {
u_int nhooks;
} pfil_list_t;
+CTASSERT(PFIL_IN == 1);
+CTASSERT(PFIL_OUT == 2);
+
struct pfil_head {
- pfil_list_t ph_in;
- pfil_list_t ph_out;
+ pfil_list_t ph_inout[2];
pfil_list_t ph_ifaddr;
pfil_list_t ph_ifevent;
int ph_type;
@@ -116,9 +121,8 @@ pfil_hook_get(int dir, pfil_head_t *ph)
{
switch (dir) {
case PFIL_IN:
- return &ph->ph_in;
case PFIL_OUT:
- return &ph->ph_out;
+ return &ph->ph_inout[dir];
case PFIL_IFADDR:
return &ph->ph_ifaddr;
case PFIL_IFNET:
@@ -128,7 +132,7 @@ pfil_hook_get(int dir, pfil_head_t *ph)
}
static int
-pfil_list_add(pfil_list_t *phlist, pfil_func_t func, void *arg, int flags)
+pfil_list_add(pfil_list_t *phlist, pfil_polyfunc_t func, void *arg, int flags)
{
const u_int nhooks = phlist->nhooks;
pfil_hook_t *pfh;
@@ -173,8 +177,6 @@ pfil_list_add(pfil_list_t *phlist, pfil_
* PFIL_IN call on incoming packets
* PFIL_OUT call on outgoing packets
* PFIL_ALL call on all of the above
- * PFIL_IFADDR call on interface reconfig (mbuf is ioctl #)
- * PFIL_IFNET call on interface attach/detach (mbuf is PFIL_IFNET_*)
*/
int
pfil_add_hook(pfil_func_t func, void *arg, int flags, pfil_head_t *ph)
@@ -182,6 +184,7 @@ pfil_add_hook(pfil_func_t func, void *ar
int error = 0;
KASSERT(func != NULL);
+ KASSERT((flags & ~PFIL_ALL) == 0);
for (u_int i = 0; i < __arraycount(pfil_flag_cases); i++) {
const int fcase = pfil_flag_cases[i];
@@ -191,7 +194,8 @@ pfil_add_hook(pfil_func_t func, void *ar
continue;
}
phlist = pfil_hook_get(fcase, ph);
- if ((error = pfil_list_add(phlist, func, arg, flags)) != 0) {
+ error = pfil_list_add(phlist, (pfil_polyfunc_t)func, arg, flags);
+ if (error) {
break;
}
}
@@ -202,10 +206,27 @@ pfil_add_hook(pfil_func_t func, void *ar
}
/*
+ * pfil_add_hook: add an interface-event function (hook) to the packet
+ * filter head. The possible flags are:
+ *
+ * PFIL_IFADDR call on interface reconfig (mbuf is ioctl #)
+ * PFIL_IFNET call on interface attach/detach (mbuf is PFIL_IFNET_*)
+ */
+int
+pfil_add_ihook(pfil_ifunc_t func, void *arg, int flags, pfil_head_t *ph)
+{
+ pfil_list_t *phlist;
+
+ KASSERT(flags == PFIL_IFADDR || flags == PFIL_IFNET);
+ phlist = pfil_hook_get(flags, ph);
+ return pfil_list_add(phlist, (pfil_polyfunc_t)func, arg, flags);
+}
+
+/*
* pfil_list_remove: remove the hook from a specified list.
*/
static int
-pfil_list_remove(pfil_list_t *phlist, pfil_func_t func, void *arg)
+pfil_list_remove(pfil_list_t *phlist, pfil_polyfunc_t func, void *arg)
{
const u_int nhooks = phlist->nhooks;
@@ -238,43 +259,72 @@ pfil_remove_hook(pfil_func_t func, void
continue;
}
pflist = pfil_hook_get(fcase, ph);
- (void)pfil_list_remove(pflist, func, arg);
+ (void)pfil_list_remove(pflist, (pfil_polyfunc_t)func, arg);
}
return 0;
}
+int
+pfil_remove_ihook(pfil_ifunc_t func, void *arg, int flags, pfil_head_t *ph)
+{
+ pfil_list_t *pflist;
+
+ KASSERT(flags == PFIL_IFADDR || flags == PFIL_IFNET);
+ pflist = pfil_hook_get(flags, ph);
+ (void)pfil_list_remove(pflist, (pfil_polyfunc_t)func, arg);
+ return 0;
+}
+
/*
* pfil_run_hooks: run the specified packet filter hooks.
*/
int
pfil_run_hooks(pfil_head_t *ph, struct mbuf **mp, ifnet_t *ifp, int dir)
{
- const bool pass_mbuf = (dir & PFIL_ALL) != 0 && mp;
- struct mbuf *m = pass_mbuf ? *mp : NULL;
+ struct mbuf *m = mp ? *mp : NULL;
pfil_list_t *phlist;
int ret = 0;
- if ((phlist = pfil_hook_get(dir, ph)) == NULL) {
+ KASSERT((dir & ~PFIL_ALL) == 0);
+ if (__predict_false((phlist = &ph->ph_inout[dir]) == NULL)) {
return ret;
}
for (u_int i = 0; i < phlist->nhooks; i++) {
pfil_hook_t *pfh = &phlist->hooks[i];
- pfil_func_t func = pfh->pfil_func;
+ pfil_func_t func = (pfil_func_t)pfh->pfil_func;
- if (__predict_true(dir & PFIL_ALL)) {
- ret = (*func)(pfh->pfil_arg, &m, ifp, dir);
- if (m == NULL)
- break;
- } else {
- ret = (*func)(pfh->pfil_arg, mp, ifp, dir);
- }
- if (ret)
+ ret = (*func)(pfh->pfil_arg, &m, ifp, dir);
+ if (m == NULL || ret)
break;
}
- if (pass_mbuf) {
+ if (mp) {
*mp = m;
}
return ret;
}
+
+void
+pfil_run_addrhooks(pfil_head_t *ph, u_long cmd, struct ifaddr *ifa)
+{
+ pfil_list_t *phlist = &ph->ph_ifaddr;
+
+ for (u_int i = 0; i < phlist->nhooks; i++) {
+ pfil_hook_t *pfh = &phlist->hooks[i];
+ pfil_ifunc_t func = (pfil_ifunc_t)pfh->pfil_func;
+ (*func)(pfh->pfil_arg, cmd, (void *)ifa);
+ }
+}
+
+void
+pfil_run_ifhooks(pfil_head_t *ph, u_long cmd, struct ifnet *ifp)
+{
+ pfil_list_t *phlist = &ph->ph_ifevent;
+
+ for (u_int i = 0; i < phlist->nhooks; i++) {
+ pfil_hook_t *pfh = &phlist->hooks[i];
+ pfil_ifunc_t func = (pfil_ifunc_t)pfh->pfil_func;
+ (*func)(pfh->pfil_arg, cmd, (void *)ifp);
+ }
+}
Index: src/sys/net/pfil.h
diff -u src/sys/net/pfil.h:1.31 src/sys/net/pfil.h:1.32
--- src/sys/net/pfil.h:1.31 Sat Jun 29 17:06:58 2013
+++ src/sys/net/pfil.h Mon Dec 26 18:21:49 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: pfil.h,v 1.31 2013/06/29 21:06:58 rmind Exp $ */
+/* $NetBSD: pfil.h,v 1.32 2016/12/26 23:21:49 christos Exp $ */
/*
* Copyright (c) 1996 Matthew R. Green
@@ -33,12 +33,14 @@
struct mbuf;
struct ifnet;
+struct ifaddr;
/*
* The packet filter hooks are designed for anything to call them to
* possibly intercept the packet.
*/
typedef int (*pfil_func_t)(void *, struct mbuf **, struct ifnet *, int);
+typedef void (*pfil_ifunc_t)(void *, unsigned long, void *);
#define PFIL_IN 0x00000001
#define PFIL_OUT 0x00000002
@@ -51,16 +53,22 @@ typedef int (*pfil_func_t)(void *, struc
#define PFIL_IFNET_DETACH 1
#define PFIL_TYPE_AF 1 /* key is AF_* type */
-#define PFIL_TYPE_IFNET 2 /* key is ifnet pointer */
+#define PFIL_TYPE_IFNET 2 /* key is ifnet or ifaddr pointer */
typedef struct pfil_head pfil_head_t;
#ifdef _KERNEL
int pfil_run_hooks(pfil_head_t *, struct mbuf **, struct ifnet *, int);
+void pfil_run_addrhooks(pfil_head_t *, unsigned long, struct ifaddr *);
+void pfil_run_ifhooks(pfil_head_t *, unsigned long, struct ifnet *);
+
int pfil_add_hook(pfil_func_t, void *, int, pfil_head_t *);
int pfil_remove_hook(pfil_func_t, void *, int, pfil_head_t *);
+int pfil_add_ihook(pfil_ifunc_t, void *, int, pfil_head_t *);
+int pfil_remove_ihook(pfil_ifunc_t, void *, int, pfil_head_t *);
+
pfil_head_t * pfil_head_create(int, void *);
void pfil_head_destroy(pfil_head_t *);
pfil_head_t * pfil_head_get(int, void *);