]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use generic functions for reading and timers in TCP
authorOndřej Surý <ondrej@sury.org>
Wed, 31 Mar 2021 10:14:54 +0000 (12:14 +0200)
committerOndřej Surý <ondrej@sury.org>
Wed, 7 Apr 2021 13:36:59 +0000 (15:36 +0200)
The TCP module has been updated to use the generic functions from
netmgr.c instead of its own local copies.  This brings the module
mostly up to par with the TCPDNS and TLSDNS modules.

lib/isc/netmgr/netmgr-int.h
lib/isc/netmgr/netmgr.c
lib/isc/netmgr/tcp.c

index a0edef8ef8d821e1a173b09f438791afb7cc43a7..edca27fdebbf60a77202d15dcd7dbb99a128955e 100644 (file)
@@ -1870,6 +1870,8 @@ void
 isc__nm_udp_read_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf,
                    const struct sockaddr *addr, unsigned flags);
 void
+isc__nm_tcp_read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf);
+void
 isc__nm_tcpdns_read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf);
 void
 isc__nm_tlsdns_read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf);
index 815fd74a38d29d81cb48b66b685f592027d2247b..64b51aa9be84ce356fc00a15a1746494c1769023 100644 (file)
@@ -1852,6 +1852,7 @@ isc__nm_alloc_cb(uv_handle_t *handle, size_t size, uv_buf_t *buf) {
                REQUIRE(size <= ISC_NETMGR_RECVBUF_SIZE);
                size = ISC_NETMGR_RECVBUF_SIZE;
                break;
+       case isc_nm_tcpsocket:
        case isc_nm_tcpdnssocket:
                break;
        case isc_nm_tlsdnssocket:
@@ -1890,6 +1891,10 @@ isc__nm_start_reading(isc_nmsocket_t *sock) {
                r = uv_udp_recv_start(&sock->uv_handle.udp, isc__nm_alloc_cb,
                                      isc__nm_udp_read_cb);
                break;
+       case isc_nm_tcpsocket:
+               r = uv_read_start(&sock->uv_handle.stream, isc__nm_alloc_cb,
+                                 isc__nm_tcp_read_cb);
+               break;
        case isc_nm_tcpdnssocket:
                r = uv_read_start(&sock->uv_handle.stream, isc__nm_alloc_cb,
                                  isc__nm_tcpdns_read_cb);
@@ -1918,6 +1923,7 @@ isc__nm_stop_reading(isc_nmsocket_t *sock) {
        case isc_nm_udpsocket:
                r = uv_udp_recv_stop(&sock->uv_handle.udp);
                break;
+       case isc_nm_tcpsocket:
        case isc_nm_tcpdnssocket:
        case isc_nm_tlsdnssocket:
                r = uv_read_stop(&sock->uv_handle.stream);
index 9a3a18592d7907fbf6cf51e327925e83473a8d16..dc25b9800ddfe7db51dc0077ad6b94e16738ce40 100644 (file)
@@ -63,9 +63,6 @@ tcp_connect_cb(uv_connect_t *uvreq, int status);
 static void
 tcp_connection_cb(uv_stream_t *server, int status);
 
-static void
-read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf);
-
 static void
 tcp_close_cb(uv_handle_t *uvhandle);
 
@@ -86,15 +83,6 @@ stop_tcp_parent(isc_nmsocket_t *sock);
 static void
 stop_tcp_child(isc_nmsocket_t *sock);
 
-static void
-start_reading(isc_nmsocket_t *sock);
-
-static void
-stop_reading(isc_nmsocket_t *sock);
-
-static void
-tcp_alloc_cb(uv_handle_t *handle, size_t size, uv_buf_t *buf);
-
 static void
 failed_accept_cb(isc_nmsocket_t *sock, isc_result_t eresult) {
        REQUIRE(sock->accepting);
@@ -687,7 +675,8 @@ failed_read_cb(isc_nmsocket_t *sock, isc_result_t result) {
        REQUIRE(VALID_NMSOCK(sock));
        REQUIRE(sock->statichandle != NULL);
 
-       stop_reading(sock);
+       isc__nmsocket_timer_stop(sock);
+       isc__nm_stop_reading(sock);
 
        if (!sock->recv_read) {
                goto destroy;
@@ -728,30 +717,6 @@ failed_send_cb(isc_nmsocket_t *sock, isc__nm_uvreq_t *req,
        }
 }
 
-static void
-start_reading(isc_nmsocket_t *sock) {
-       if (sock->reading) {
-               return;
-       }
-
-       int r = uv_read_start(&sock->uv_handle.stream, tcp_alloc_cb, read_cb);
-       REQUIRE(r == 0);
-       sock->reading = true;
-}
-
-static void
-stop_reading(isc_nmsocket_t *sock) {
-       if (!sock->reading) {
-               return;
-       }
-
-       int r = uv_read_stop(&sock->uv_handle.stream);
-       REQUIRE(r == 0);
-       sock->reading = false;
-
-       isc__nmsocket_timer_stop(sock);
-}
-
 void
 isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
        REQUIRE(VALID_NMHANDLE(handle));
@@ -789,32 +754,6 @@ isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
        return;
 }
 
-/*%<
- * Allocator for TCP read operations. Limited to size 2^16.
- *
- * Note this doesn't actually allocate anything, it just assigns the
- * worker's receive buffer to a socket, and marks it as "in use".
- */
-static void
-tcp_alloc_cb(uv_handle_t *handle, size_t size, uv_buf_t *buf) {
-       isc_nmsocket_t *sock = uv_handle_get_data(handle);
-       isc__networker_t *worker = NULL;
-
-       REQUIRE(VALID_NMSOCK(sock));
-       REQUIRE(sock->type == isc_nm_tcpsocket);
-       REQUIRE(isc__nm_in_netthread());
-       if (size > 65536) {
-               size = 65536;
-       }
-
-       worker = &sock->mgr->workers[sock->tid];
-       INSIST(!worker->recvbuf_inuse);
-
-       buf->base = worker->recvbuf;
-       buf->len = size;
-       worker->recvbuf_inuse = true;
-}
-
 void
 isc__nm_async_tcpstartread(isc__networker_t *worker, isc__netievent_t *ev0) {
        isc__netievent_tcpstartread_t *ievent =
@@ -831,7 +770,7 @@ isc__nm_async_tcpstartread(isc__networker_t *worker, isc__netievent_t *ev0) {
                return;
        }
 
-       start_reading(sock);
+       isc__nm_start_reading(sock);
        isc__nmsocket_timer_start(sock);
 }
 
@@ -868,7 +807,8 @@ isc__nm_async_tcppauseread(isc__networker_t *worker, isc__netievent_t *ev0) {
        REQUIRE(sock->tid == isc_nm_tid());
        UNUSED(worker);
 
-       stop_reading(sock);
+       isc__nmsocket_timer_stop(sock);
+       isc__nm_stop_reading(sock);
 }
 
 void
@@ -903,8 +843,8 @@ isc__nm_tcp_resumeread(isc_nmhandle_t *handle) {
                                     (isc__netievent_t *)ievent);
 }
 
-static void
-read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) {
+void
+isc__nm_tcp_read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) {
        isc_nmsocket_t *sock = uv_handle_get_data((uv_handle_t *)stream);
        isc__nm_uvreq_t *req = NULL;
 
@@ -1142,11 +1082,11 @@ isc__nm_tcp_send(isc_nmhandle_t *handle, const isc_region_t *region,
 static void
 tcp_send_cb(uv_write_t *req, int status) {
        isc__nm_uvreq_t *uvreq = (isc__nm_uvreq_t *)req->data;
-       isc_nmsocket_t *sock = uvreq->sock;
-
        REQUIRE(VALID_UVREQ(uvreq));
        REQUIRE(VALID_NMHANDLE(uvreq->handle));
 
+       isc_nmsocket_t *sock = uvreq->sock;
+
        if (status < 0) {
                isc__nm_incstats(sock->mgr, sock->statsindex[STATID_SENDFAIL]);
                failed_send_cb(sock, uvreq, isc__nm_uverr2result(status));
@@ -1336,7 +1276,10 @@ tcp_close_direct(isc_nmsocket_t *sock) {
                isc_quota_detach(&sock->quota);
        }
 
-       stop_reading(sock);
+       isc__nmsocket_timer_stop(sock);
+       isc__nm_stop_reading(sock);
+
+       uv_handle_set_data((uv_handle_t *)&sock->timer, sock);
        uv_close((uv_handle_t *)&sock->timer, timer_close_cb);
 }