Commit 8e522f50 authored by Dridi Boukelmoune's avatar Dridi Boukelmoune Committed by Martin Blix Grydeland

vca: Pass higher-level types to sock_opt functions

The sess and listen_sock structs contain everything we need to find or
infer the former `sock`, `uds` and `force` arguments. In particular, it
helps distinguish between working on a connection vs listen socket.
parent f78e9b3a
...@@ -211,22 +211,25 @@ vca_sock_opt_init(void) ...@@ -211,22 +211,25 @@ vca_sock_opt_init(void)
} }
static void static void
vca_sock_opt_test(const int sock, const unsigned uds) vca_sock_opt_test(const struct listen_sock *ls, const struct sess *sp)
{ {
int i, n; int i, n;
struct sock_opt *so; struct sock_opt *so;
socklen_t l; socklen_t l;
void *ptr; void *ptr;
CHECK_OBJ_NOTNULL(ls, LISTEN_SOCK_MAGIC);
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
for (n = 0; n < n_sock_opts; n++) { for (n = 0; n < n_sock_opts; n++) {
so = &sock_opts[n]; so = &sock_opts[n];
if (so->level == IPPROTO_TCP && uds) if (so->level == IPPROTO_TCP && ls->uds)
continue; continue;
so->need = 1; so->need = 1;
ptr = calloc(1, so->sz); ptr = calloc(1, so->sz);
AN(ptr); AN(ptr);
l = so->sz; l = so->sz;
i = getsockopt(sock, so->level, so->optname, ptr, &l); i = getsockopt(sp->fd, so->level, so->optname, ptr, &l);
if (i == 0 && !memcmp(ptr, so->ptr, so->sz)) if (i == 0 && !memcmp(ptr, so->ptr, so->sz))
so->need = 0; so->need = 0;
free(ptr); free(ptr);
...@@ -236,16 +239,20 @@ vca_sock_opt_test(const int sock, const unsigned uds) ...@@ -236,16 +239,20 @@ vca_sock_opt_test(const int sock, const unsigned uds)
} }
static void static void
vca_sock_opt_set(const int sock, const unsigned uds, const int force) vca_sock_opt_set(const struct listen_sock *ls, const struct sess *sp)
{ {
int n; int n, sock;
struct sock_opt *so; struct sock_opt *so;
CHECK_OBJ_NOTNULL(ls, LISTEN_SOCK_MAGIC);
CHECK_OBJ_ORNULL(sp, SESS_MAGIC);
sock = sp != NULL ? sp->fd : ls->sock;
for (n = 0; n < n_sock_opts; n++) { for (n = 0; n < n_sock_opts; n++) {
so = &sock_opts[n]; so = &sock_opts[n];
if (so->level == IPPROTO_TCP && uds) if (so->level == IPPROTO_TCP && ls->uds)
continue; continue;
if (so->need || force) { if (so->need || sp == NULL) {
VTCP_Assert(setsockopt(sock, VTCP_Assert(setsockopt(sock,
so->level, so->optname, so->ptr, so->sz)); so->level, so->optname, so->ptr, so->sz));
} }
...@@ -409,10 +416,10 @@ vca_make_session(struct worker *wrk, void *arg) ...@@ -409,10 +416,10 @@ vca_make_session(struct worker *wrk, void *arg)
wrk->stats->sess_conn++; wrk->stats->sess_conn++;
if (need_test) { if (need_test) {
vca_sock_opt_test(sp->fd, wa->acceptlsock->uds); vca_sock_opt_test(wa->acceptlsock, sp);
need_test = 0; need_test = 0;
} }
vca_sock_opt_set(sp->fd, wa->acceptlsock->uds, 0); vca_sock_opt_set(wa->acceptlsock, sp);
req = Req_New(wrk, sp); req = Req_New(wrk, sp);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
...@@ -588,7 +595,7 @@ vca_acct(void *arg) ...@@ -588,7 +595,7 @@ vca_acct(void *arg)
if (ls->sock == -2) if (ls->sock == -2)
continue; // VCA_Shutdown continue; // VCA_Shutdown
assert (ls->sock > 0); assert (ls->sock > 0);
vca_sock_opt_set(ls->sock, ls->uds, 1); vca_sock_opt_set(ls, NULL);
} }
AZ(pthread_mutex_unlock(&shut_mtx)); AZ(pthread_mutex_unlock(&shut_mtx));
} }
...@@ -627,7 +634,7 @@ ccf_start(struct cli *cli, const char * const *av, void *priv) ...@@ -627,7 +634,7 @@ ccf_start(struct cli *cli, const char * const *av, void *priv)
ls->endpoint, strerror(errno)); ls->endpoint, strerror(errno));
return; return;
} }
vca_sock_opt_set(ls->sock, ls->uds, 1); vca_sock_opt_set(ls, NULL);
if (cache_param->accept_filter) { if (cache_param->accept_filter) {
int i; int i;
i = VTCP_filter_http(ls->sock); i = VTCP_filter_http(ls->sock);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment