]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: connstream: have a new flag CS_FL_KILL_CONN to kill a connection
authorWilly Tarreau <w@1wt.eu>
Thu, 31 Jan 2019 18:09:59 +0000 (19:09 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 31 Jan 2019 18:38:25 +0000 (19:38 +0100)
This is the equivalent of SI_FL_KILL_CONN but for the connstreams. It
will be set by the stream-interface during the various shutdown
operations.

include/types/connection.h
src/stream_interface.c

index 434318fbf5404fa91509738db0e27a00fce68682..f11cfb531d3007a410a95b70269e512279acfaa1 100644 (file)
@@ -88,6 +88,7 @@ enum {
        CS_FL_EOS           = 0x00001000,  /* End of stream delivered to data layer */
        CS_FL_REOS          = 0x00002000,  /* End of stream received (buffer not empty) */
        CS_FL_WAIT_FOR_HS   = 0x00010000,  /* This stream is waiting for handhskae */
+       CS_FL_KILL_CONN     = 0x00020000,  /* must kill the connection when the CS closes */
 
        /* following flags are supposed to be set by the mux and read/unset by
         * the stream-interface :
index cbe6f6ea3414522d020c9fda8ba7a1c0764d698f..669a906ac279bcea4fe4f6a62525f76137c82517 100644 (file)
@@ -904,6 +904,9 @@ static void stream_int_shutr_conn(struct stream_interface *si)
        if (si->state != SI_ST_EST && si->state != SI_ST_CON)
                return;
 
+       if (si->flags & SI_FL_KILL_CONN)
+               cs->flags |= CS_FL_KILL_CONN;
+
        if (si_oc(si)->flags & CF_SHUTW) {
                cs_close(cs);
                si->state = SI_ST_DIS;
@@ -950,6 +953,9 @@ static void stream_int_shutw_conn(struct stream_interface *si)
                 * However, if SI_FL_NOLINGER is explicitly set, we know there is
                 * no risk so we close both sides immediately.
                 */
+               if (si->flags & SI_FL_KILL_CONN)
+                       cs->flags |= CS_FL_KILL_CONN;
+
                if (si->flags & SI_FL_ERR) {
                        /* quick close, the socket is alredy shut anyway */
                }
@@ -984,6 +990,8 @@ static void stream_int_shutw_conn(struct stream_interface *si)
                /* we may have to close a pending connection, and mark the
                 * response buffer as shutr
                 */
+               if (si->flags & SI_FL_KILL_CONN)
+                       cs->flags |= CS_FL_KILL_CONN;
                cs_close(cs);
                /* fall through */
        case SI_ST_CER: