29 #include <sys/cdefs.h>
32 #define ACCEPT_FILTER_MOD
34 #include "opt_param.h"
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/domain.h>
38 #include <sys/kernel.h>
40 #include <sys/malloc.h>
42 #include <sys/module.h>
43 #include <sys/mutex.h>
44 #include <sys/protosw.h>
45 #include <sys/sysctl.h>
46 #include <sys/socket.h>
47 #include <sys/socketvar.h>
48 #include <sys/queue.h>
53 #define ACCEPT_FILTER_LOCK() mtx_lock(&accept_filter_mtx)
54 #define ACCEPT_FILTER_UNLOCK() mtx_unlock(&accept_filter_mtx)
57 SLIST_HEAD_INITIALIZER(accept_filtlsthd);
64 SYSCTL_NODE(_net_inet, OID_AUTO, accf, CTLFLAG_RW, 0, "Accept filters");
65 SYSCTL_INT(_net_inet_accf, OID_AUTO, unloadable, CTLFLAG_RW, &unloadable, 0,
66 "Allow
unload of accept filters (not recommended)");
74 accept_filt_add(struct accept_filter *filt)
76 struct accept_filter *p;
79 SLIST_FOREACH(p, &accept_filtlsthd, accf_next)
80 if (strcmp(p->accf_name, filt->accf_name) == 0) {
81 if (p->accf_callback != NULL) {
85 p->accf_callback = filt->accf_callback;
93 SLIST_INSERT_HEAD(&accept_filtlsthd, filt, accf_next);
101 struct accept_filter *p;
107 p->accf_callback = NULL;
111 struct accept_filter *
114 struct accept_filter *p;
117 SLIST_FOREACH(p, &accept_filtlsthd, accf_next)
118 if (strcmp(p->accf_name, name) == 0)
128 struct accept_filter *p;
129 struct accept_filter *accfp = (
struct accept_filter *) data;
134 p =
malloc(
sizeof(*p), M_ACCF,
136 bcopy(accfp, p,
sizeof(*p));
137 error = accept_filt_add(p);
168 struct accept_filter_arg *afap;
172 afap =
malloc(
sizeof(*afap), M_TEMP,
175 if ((so->so_options & SO_ACCEPTCONN) == 0) {
179 if ((so->so_options & SO_ACCEPTFILTER) == 0) {
183 strcpy(afap->af_name, so->so_accf->so_accept_filter->accf_name);
184 if (so->so_accf->so_accept_filter_str != NULL)
185 strcpy(afap->af_arg, so->so_accf->so_accept_filter_str);
197 struct accept_filter_arg *afap;
198 struct accept_filter *afp;
199 struct so_accf *newaf;
205 if (sopt == NULL || sopt->sopt_val == NULL) {
207 if ((so->so_options & SO_ACCEPTCONN) == 0) {
211 if (so->so_accf != NULL) {
212 struct so_accf *af = so->so_accf;
213 if (af->so_accept_filter != NULL &&
214 af->so_accept_filter->accf_destroy != NULL) {
215 af->so_accept_filter->accf_destroy(so);
217 if (af->so_accept_filter_str != NULL)
218 free(af->so_accept_filter_str, M_ACCF);
222 so->so_options &= ~SO_ACCEPTFILTER;
231 afap =
malloc(
sizeof(*afap), M_TEMP,
233 error =
sooptcopyin(sopt, afap,
sizeof *afap,
sizeof *afap);
234 afap->af_name[
sizeof(afap->af_name)-1] =
'\0';
235 afap->af_arg[
sizeof(afap->af_arg)-1] =
'\0';
251 newaf =
malloc(
sizeof(*newaf), M_ACCF, M_WAITOK |
253 if (afp->accf_create != NULL && afap->af_name[0] !=
'\0') {
254 int len = strlen(afap->af_name) + 1;
255 newaf->so_accept_filter_str =
malloc(len, M_ACCF,
257 strcpy(newaf->so_accept_filter_str, afap->af_name);
265 if (((so->so_options & SO_ACCEPTCONN) == 0) ||
266 (so->so_accf != NULL)) {
276 if (afp->accf_create != NULL) {
277 newaf->so_accept_filter_arg =
278 afp->accf_create(so, afap->af_arg);
279 if (newaf->so_accept_filter_arg == NULL) {
284 newaf->so_accept_filter = afp;
286 so->so_options |= SO_ACCEPTFILTER;
291 if (newaf->so_accept_filter_str != NULL)
292 free(newaf->so_accept_filter_str, M_ACCF);
int sooptcopyout(struct sockopt *sopt, const void *buf, size_t len)
static SYSCTL_NODE(_debug, OID_AUTO, cpufreq, CTLFLAG_RD, NULL,"cpufreq debugging")
void * malloc(unsigned long size, struct malloc_type *mtp, int flags)
static struct mtx accept_filter_mtx
int sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen)
SYSCTL_INT(_debug, OID_AUTO, boothowto, CTLFLAG_RD,&boothowto, 0,"Boot control flags, passed from loader")
int accept_filt_generic_mod_event(module_t mod, int event, void *data)
static MALLOC_DEFINE(M_GZIP,"gzip_trees","Gzip trees")
#define ACCEPT_FILTER_UNLOCK()
#define ACCEPT_FILTER_LOCK()
int do_getopt_accept_filter(struct socket *so, struct sockopt *sopt)
void free(void *addr, struct malloc_type *mtp)
int do_setopt_accept_filter(struct socket *so, struct sockopt *sopt)
int accept_filt_del(char *name)
MTX_SYSINIT(accept_filter,&accept_filter_mtx,"accept_filter_mtx", MTX_DEF)
static SLIST_HEAD(accept_filter)
struct accept_filter * accept_filt_get(char *name)