]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: mux_pt: make cs_shutr() / cs_shutw() properly close the connection
authorWilly Tarreau <w@1wt.eu>
Thu, 5 Oct 2017 16:47:38 +0000 (18:47 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 31 Oct 2017 17:03:24 +0000 (18:03 +0100)
Now these functions are able to automatically close both the transport
and the socket layer, causing the whole connection to be torn down if
needed.

The two shutdown modes are implemented for both directions, and when
a direction is closed, if it sees the other one is closed as well, it
completes by closing the connection. This is similar to what is performed
in the stream interface.

It's not deployed yet but the purpose is to get rid of conn_full_close()
where only conn_stream should be known.

src/mux_pt.c

index e5d3dff4800d934755412e23cf0d1fa63e9468be..e9a7d2f8cd129357ba19c76c98fda725b67b7a05 100644 (file)
@@ -122,14 +122,24 @@ static void mux_pt_detach(struct conn_stream *cs)
 
 static void mux_pt_shutr(struct conn_stream *cs, enum cs_shr_mode mode)
 {
+       if (cs->flags & CS_FL_SHR)
+               return;
        if (conn_xprt_ready(cs->conn) && cs->conn->xprt->shutr)
                cs->conn->xprt->shutr(cs->conn, (mode == CS_SHR_DRAIN));
+       if (cs->flags & CS_FL_SHW)
+               conn_full_close(cs->conn);
 }
 
 static void mux_pt_shutw(struct conn_stream *cs, enum cs_shw_mode mode)
 {
+       if (cs->flags & CS_FL_SHW)
+               return;
        if (conn_xprt_ready(cs->conn) && cs->conn->xprt->shutw)
                cs->conn->xprt->shutw(cs->conn, (mode == CS_SHW_NORMAL));
+       if (!(cs->flags & CS_FL_SHR))
+               conn_sock_shutw(cs->conn);
+       else
+               conn_full_close(cs->conn);
 }
 
 /*