]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon: move connected flag from session to worker
authorOto Šťáva <oto.stava@nic.cz>
Wed, 22 Mar 2023 09:42:44 +0000 (10:42 +0100)
committerOto Šťáva <oto.stava@nic.cz>
Wed, 22 Mar 2023 09:42:44 +0000 (10:42 +0100)
daemon/session2.h
daemon/worker.c

index 392e193522323e5e6ff44f6daa3c2978a7acb4ed..00fa388cb4d7178aaa0825d72cf7738064b4bb07 100644 (file)
@@ -847,11 +847,6 @@ struct session2 {
         * return a Bad Request status on a malformed query. */
        bool custom_emalf_handling : 1;
 
-       /** If true, a connection is established. Only applicable to sessions
-        * using connection-based protocols. One of the stream-based protocol
-        * layers is going to be the writer for this flag. */
-       bool connected : 1;
-
        /** If true, session is being rate-limited. One of the protocol layers
         * is going to be the writer for this flag. */
        bool throttled : 1;
index 2e8fcfe300afd5dd6d7b90ca6a597468bdf15513..813df6c7598de66cfba0538a82f9e4b4fb08e5f6 100644 (file)
@@ -1801,6 +1801,7 @@ struct pl_dns_stream_sess_data {
        struct protolayer_data h;
        bool single : 1; /**< True: Stream only allows a single packet */
        bool produced : 1; /**< True: At least one packet has been produced */
+       bool connected : 1; /**< True: The stream is connected */
 };
 
 struct pl_dns_stream_iter_data {
@@ -1893,12 +1894,12 @@ static enum protolayer_event_cb_result pl_dns_stream_resolution_timeout(
 }
 
 static enum protolayer_event_cb_result pl_dns_stream_connected(
-               struct session2 *session)
+               struct session2 *session, struct pl_dns_stream_sess_data *stream)
 {
-       if (kr_fails_assert(!session->connected))
+       if (kr_fails_assert(!stream->connected))
                return PROTOLAYER_EVENT_PROPAGATE;
 
-       session->connected = true;
+       stream->connected = true;
 
        struct sockaddr *peer = session2_get_peer(session);
        if (session->outgoing && worker_del_tcp_waiting(peer) != 0) {
@@ -1971,16 +1972,16 @@ static enum protolayer_event_cb_result pl_dns_stream_connection_fail(
 }
 
 static enum protolayer_event_cb_result pl_dns_stream_disconnected(
-               struct session2 *session)
+               struct session2 *session, struct pl_dns_stream_sess_data *stream)
 {
        struct sockaddr *peer = session2_get_peer(session);
        worker_del_tcp_waiting(peer);
        worker_del_tcp_connected(peer);
 
-       if (!session->connected)
+       if (!stream->connected)
                return PROTOLAYER_EVENT_PROPAGATE;
 
-       session->connected = false;
+       stream->connected = false;
 
        while (!session2_waitinglist_is_empty(session)) {
                struct qr_task *task = session2_waitinglist_pop(session, false);
@@ -2032,6 +2033,8 @@ static enum protolayer_event_cb_result pl_dns_stream_event_unwrap(
        if (session->closing)
                return PROTOLAYER_EVENT_PROPAGATE;
 
+       struct pl_dns_stream_sess_data *stream = sess_data;
+
        switch (event) {
        case PROTOLAYER_EVENT_GENERAL_TIMEOUT:
                return pl_dns_stream_resolution_timeout(manager->session);
@@ -2041,7 +2044,7 @@ static enum protolayer_event_cb_result pl_dns_stream_event_unwrap(
                                KR_SELECTION_TCP_CONNECT_TIMEOUT);
 
        case PROTOLAYER_EVENT_CONNECT:
-               return pl_dns_stream_connected(session);
+               return pl_dns_stream_connected(session, stream);
 
        case PROTOLAYER_EVENT_CONNECT_FAIL:;
                enum kr_selection_error err = (*baton)
@@ -2052,7 +2055,7 @@ static enum protolayer_event_cb_result pl_dns_stream_event_unwrap(
        case PROTOLAYER_EVENT_DISCONNECT:
        case PROTOLAYER_EVENT_CLOSE:
        case PROTOLAYER_EVENT_FORCE_CLOSE:
-               return pl_dns_stream_disconnected(session);
+               return pl_dns_stream_disconnected(session, stream);
 
        default:
                return PROTOLAYER_EVENT_PROPAGATE;
@@ -2293,6 +2296,7 @@ int worker_init(void)
                .event_unwrap = pl_dns_dgram_event_unwrap
        };
        protolayer_globals[PROTOLAYER_PROTOCOL_DNS_UNSIZED_STREAM] = (struct protolayer_globals){
+               .sess_size = sizeof(struct pl_dns_stream_sess_data),
                .wire_buf_overhead = KNOT_WIRE_MAX_PKTSIZE,
                .sess_init = pl_dns_stream_sess_init,
                .unwrap = pl_dns_dgram_unwrap,