int (*avail_streams)(struct connection *conn); /* Returns the number of streams still available for a connection */
int (*max_streams)(struct connection *conn); /* Returns the max number of streams available for that connection. */
void (*destroy)(struct connection *conn); /* Let the mux know one of its users left, so it may have to disappear */
+ void (*reset)(struct connection *conn); /* Reset the mux, because we're re-trying to connect */
const struct cs_info *(*get_cs_info)(struct conn_stream *cs); /* Return info on the specified conn_stream or NULL if not defined */
unsigned int flags; /* some flags characterizing the mux's capabilities (MX_FL_*) */
char name[8]; /* mux layer name, zero-terminated */
return SF_ERR_INTERNAL;
}
- if (!conn_xprt_ready(srv_conn)) {
+ if (!conn_xprt_ready(srv_conn) && !srv_conn->mux) {
/* the target was only on the stream, assign it to the SI now */
srv_conn->target = s->target;
assign_tproxy_address(s);
}
+ else if (!conn_xprt_ready(srv_conn)) {
+ if (srv_conn->mux->reset)
+ srv_conn->mux->reset(srv_conn);
+ }
else
s->flags |= SF_SRV_REUSED;
return NULL;
}
+static void h1_reset(struct connection *conn)
+{
+ struct h1c *h1c = conn->mux_ctx;
+
+ /* Reset the flags, and let the mux know we're waiting for a connection */
+ h1c->flags = H1C_F_CS_WAIT_CONN;
+}
static int h1_wake(struct connection *conn)
{
.unsubscribe = h1_unsubscribe,
.shutr = h1_shutr,
.shutw = h1_shutw,
+ .reset = h1_reset,
.flags = MX_FL_NONE,
.name = "h1",
};