X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuhttpd.git;a=blobdiff_plain;f=listen.c;h=2a54888a8b80b68681e2ca7bbb17d0297f44c2e0;hp=d51e600ee51d6c2d25a257c1e0ffe5c7078dd3af;hb=3fd58e9b6da7d9e1a4710dbeefc2d289baea09fb;hpb=1f4c517bb889413e55ccee466d9dfe79156092e8 diff --git a/listen.c b/listen.c index d51e600..2a54888 100644 --- a/listen.c +++ b/listen.c @@ -52,12 +52,12 @@ static void uh_block_listener(struct listener *l) l->blocked = true; } -void uh_unblock_listeners(void) +static void uh_poll_listeners(struct uloop_timeout *timeout) { struct listener *l; - if ((!n_blocked && conf.max_requests) || - n_clients >= conf.max_requests) + if ((!n_blocked && conf.max_connections) || + n_clients >= conf.max_connections) return; list_for_each_entry(l, &listeners, list) { @@ -65,7 +65,7 @@ void uh_unblock_listeners(void) continue; l->fd.cb(&l->fd, ULOOP_READ); - if (n_clients >= conf.max_requests) + if (n_clients >= conf.max_connections) break; n_blocked--; @@ -74,6 +74,15 @@ void uh_unblock_listeners(void) } } +void uh_unblock_listeners(void) +{ + static struct uloop_timeout poll_timer = { + .cb = uh_poll_listeners + }; + + uloop_timeout_set(&poll_timer, 1); +} + static void listener_cb(struct uloop_fd *fd, unsigned int events) { struct listener *l = container_of(fd, struct listener, fd); @@ -83,7 +92,7 @@ static void listener_cb(struct uloop_fd *fd, unsigned int events) break; } - if (conf.max_requests && n_clients >= conf.max_requests) + if (conf.max_connections && n_clients >= conf.max_connections) uh_block_listener(l); } @@ -98,15 +107,17 @@ void uh_setup_listeners(void) /* TCP keep-alive */ if (conf.tcp_keepalive > 0) { #ifdef linux - int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt; + int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt, tcp_fstopn; tcp_ka_idl = 1; tcp_ka_cnt = 3; tcp_ka_int = conf.tcp_keepalive; + tcp_fstopn = 5; setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &tcp_ka_idl, sizeof(tcp_ka_idl)); setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int)); setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &tcp_ka_cnt, sizeof(tcp_ka_cnt)); + setsockopt(sock, SOL_TCP, TCP_FASTOPEN, &tcp_fstopn, sizeof(tcp_fstopn)); #endif setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes)); @@ -178,6 +189,7 @@ int uh_socket_bind(const char *host, const char *port, bool tls) l->fd.fd = sock; l->tls = tls; + l->addr = *(struct sockaddr_in6 *)p->ai_addr; list_add_tail(&l->list, &listeners); bound++; @@ -192,3 +204,21 @@ error: return bound; } + +int uh_first_tls_port(int family) +{ + struct listener *l; + int tls_port = -1; + + list_for_each_entry(l, &listeners, list) { + if (!l->tls || l->addr.sin6_family != family) + continue; + + if (tls_port != -1 && ntohs(l->addr.sin6_port) != 443) + continue; + + tls_port = ntohs(l->addr.sin6_port); + } + + return tls_port; +}