Date: Sat, 16 Aug 2008 11:41:12 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 147521 for review Message-ID: <200808161141.m7GBfCt1095229@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=147521 Change 147521 by zec@zec_tpx32 on 2008/08/16 11:41:07 Virtualize accf_http (a single tunable int). Reviewed by: brooks, dwmalone, other lurking in occasionally Obtained from: devsummit08 Affected files ... .. //depot/projects/vimage/src/sys/kern/uipc_accf.c#2 edit .. //depot/projects/vimage/src/sys/netinet/accf_http.c#3 edit .. //depot/projects/vimage/src/sys/sys/socketvar.h#12 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#59 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/uipc_accf.c#2 (text+ko) ==== @@ -58,11 +58,12 @@ MALLOC_DEFINE(M_ACCF, "accf", "accept filter data"); -static int unloadable = 0; +int accf_unloadable = 0; SYSCTL_DECL(_net_inet); /* XXX: some header should do this for me */ SYSCTL_NODE(_net_inet, OID_AUTO, accf, CTLFLAG_RW, 0, "Accept filters"); -SYSCTL_INT(_net_inet_accf, OID_AUTO, unloadable, CTLFLAG_RW, &unloadable, 0, +SYSCTL_INT(_net_inet_accf, OID_AUTO, unloadable, CTLFLAG_RW, + &accf_unloadable, 0, "Allow unload of accept filters (not recommended)"); /* @@ -144,7 +145,7 @@ * having it called is a bad thing. A simple fix would be to * track the refcount in the struct accept_filter. */ - if (unloadable != 0) { + if (accf_unloadable != 0) { error = accept_filt_del(accfp->accf_name); } else error = EOPNOTSUPP; ==== //depot/projects/vimage/src/sys/netinet/accf_http.c#3 (text+ko) ==== @@ -37,6 +37,7 @@ #include <sys/signalvar.h> #include <sys/sysctl.h> #include <sys/socketvar.h> +#include <sys/vimage.h> /* check for GET/HEAD */ static void sohashttpget(struct socket *so, void *arg, int waitflag); @@ -51,6 +52,8 @@ int max, char *cmp); /* socketbuffer is full */ static int sbfull(struct sockbuf *sb); +static int +accept_filt_http_mod_event(module_t mod, int event, void *data); static struct accept_filter accf_http_filter = { "httpready", @@ -61,19 +64,42 @@ static moduledata_t accf_http_mod = { "accf_http", - accept_filt_generic_mod_event, - &accf_http_filter + accept_filt_http_mod_event, + NULL, }; DECLARE_MODULE(accf_http, accf_http_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE); -static int parse_http_version = 1; +#ifndef VIMAGE +static int parse_http_version; +#endif + +/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ +struct vnet_accf_http { + int _parse_http_version; +}; + +#define INIT_VNET_ACCF_HTTP(vnet) \ + INIT_FROM_VNET(vnet, VNET_MOD_ACCF_HTTP, struct vnet_accf_http, vnet_accf_http) + +#define VNET_ACCF_HTTP(sym) VSYM(vnet_accf_http, sym) + +#define V_parse_http_version VNET_ACCF_HTTP(parse_http_version) + +#define V_MOD_vnet_accf_http VNET_MOD_ACCF_HTTP + +static vnet_attach_fn vnet_accf_http_iattach; + +VNET_MOD_DECLARE(ACCF_HTTP, accf_http, vnet_accf_http_iattach, + NULL, INET, NULL) + +/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ SYSCTL_NODE(_net_inet_accf, OID_AUTO, http, CTLFLAG_RW, 0, "HTTP accept filter"); -SYSCTL_INT(_net_inet_accf_http, OID_AUTO, parsehttpversion, CTLFLAG_RW, -&parse_http_version, 1, -"Parse http version so that non 1.x requests work"); +SYSCTL_V_INT(V_NET, vnet_accf_http, _net_inet_accf_http, OID_AUTO, + parsehttpversion, CTLFLAG_RW, parse_http_version, 1, + "Parse http version so that non 1.x requests work"); #ifdef ACCF_HTTP_DEBUG #define DPRINT(fmt, args...) \ @@ -161,6 +187,7 @@ static void sohashttpget(struct socket *so, void *arg, int waitflag) { + INIT_VNET_ACCF_HTTP(so->so_vnet); if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0 && !sbfull(&so->so_rcv)) { struct mbuf *m; @@ -192,7 +219,7 @@ } if (mbufstrcmp(m, m->m_nextpkt, 1, cmp) == 1) { DPRINT("mbufstrcmp ok"); - if (parse_http_version == 0) + if (V_parse_http_version == 0) soishttpconnected(so, arg, waitflag); else soparsehttpvers(so, arg, waitflag); @@ -360,3 +387,58 @@ soisconnected(so); return; } + +static int +accept_filt_http_mod_event(module_t mod, int event, void *data) +{ + struct accept_filter *p; + int error; + + switch (event) { + case MOD_LOAD: +#ifdef VIMAGE + vnet_mod_register(&vnet_accf_http_modinfo); +#else + vnet_accf_http_iattach(NULL); +#endif /* !VIMAGE */ + + MALLOC(p, struct accept_filter *, sizeof(*p), M_ACCF, + M_WAITOK); + bcopy(&accf_http_filter, p, sizeof(*p)); + error = accept_filt_add(p); + break; + + case MOD_UNLOAD: + /* + * Do not support unloading yet. we don't keep track of + * refcounts and unloading an accept filter callback and then + * having it called is a bad thing. A simple fix would be to + * track the refcount in the struct accept_filter. + */ + if (accf_unloadable != 0) { + error = accept_filt_del(accf_http_filter.accf_name); + } else + error = EOPNOTSUPP; + break; + + case MOD_SHUTDOWN: + error = 0; + break; + + default: + error = EOPNOTSUPP; + break; + } + + return (error); +} + +static int vnet_accf_http_iattach(const void *unused) +{ + INIT_VNET_ACCF_HTTP(curvnet); + + V_parse_http_version = 1; + + return 0; +} + ==== //depot/projects/vimage/src/sys/sys/socketvar.h#12 (text+ko) ==== @@ -295,6 +295,7 @@ MALLOC_DECLARE(M_SONAME); #endif +extern int accf_unloadable; extern int maxsockets; extern u_long sb_max; extern struct uma_zone *socket_zone; ==== //depot/projects/vimage/src/sys/sys/vimage.h#59 (text+ko) ==== @@ -78,6 +78,7 @@ #define VNET_MOD_ALTQ 8 #define VNET_MOD_IPX 9 #define VNET_MOD_ATALK 10 +#define VNET_MOD_ACCF_HTTP 11 /* stateless modules */ #define VNET_MOD_NG_WORMHOLE 19 #define VNET_MOD_NG_ETHER 20
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808161141.m7GBfCt1095229>