From: Olivier Houchard Date: Thu, 16 Aug 2018 13:30:32 +0000 (+0200) Subject: MINOR: connections: Make rcv_buf mandatory and nuke cs_recv(). X-Git-Tag: v1.9-dev2~165 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=511efeae7e0cdf013a56bd44a47ae3c431f6d7b6;p=thirdparty%2Fhaproxy.git MINOR: connections: Make rcv_buf mandatory and nuke cs_recv(). Reintroduce h2_rcv_buf(), right now it just does what cs_recv() did, but should be modified later. --- diff --git a/include/proto/connection.h b/include/proto/connection.h index 8261d57602..33ccc0be14 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -304,17 +304,6 @@ static inline void cs_update_mux_polling(struct conn_stream *cs) conn->mux->update_poll(cs); } -/* conn_stream receive function. Uses mux->rcv_buf() if defined, otherwise - * falls back to __cs_recv(). - */ -static inline size_t cs_recv(struct conn_stream *cs, struct buffer *buf, size_t count, int flags) -{ - if (cs->conn->mux->rcv_buf) - return cs->conn->mux->rcv_buf(cs, buf, count, flags); - else - return __cs_recv(cs, buf, count, flags); -} - /* conn_stream send function. Uses mux->snd_buf() if defined, otherwise * falls back to __cs_send(). */ diff --git a/src/checks.c b/src/checks.c index ef7237a9f3..bb50548a1a 100644 --- a/src/checks.c +++ b/src/checks.c @@ -850,7 +850,7 @@ static void event_srv_chk_r(struct conn_stream *cs) done = 0; - cs_recv(cs, &check->bi, b_size(&check->bi), 0); + cs->conn->mux->rcv_buf(cs, &check->bi, b_size(&check->bi), 0); if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH) || cs->flags & CS_FL_ERROR) { done = 1; if ((conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR) && !b_data(&check->bi)) { @@ -2917,7 +2917,7 @@ static int tcpcheck_main(struct check *check) goto out_end_tcpcheck; __cs_want_recv(cs); - if (cs_recv(cs, &check->bi, b_size(&check->bi), 0) <= 0) { + if (cs->conn->mux->rcv_buf(cs, &check->bi, b_size(&check->bi), 0) <= 0) { if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH) || cs->flags & CS_FL_ERROR) { done = 1; if ((conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR) && !b_data(&check->bi)) { diff --git a/src/connection.c b/src/connection.c index f750e3c99b..2a7fb1b478 100644 --- a/src/connection.c +++ b/src/connection.c @@ -383,33 +383,6 @@ int conn_sock_drain(struct connection *conn) return 1; } -/* - * default conn_stream recv() : this one is used when cs->rcv_buf == NULL. - * It reads up to bytes from cs->rxbuf, puts them into and - * returns the count. It possibly sets/clears CS_FL_RCV_MORE depending on the - * buffer's state, and may set CS_FL_EOS. The number of bytes transferred is - * returned. is not touched if is null, but cs flags will be - * updated to indicate any RCV_MORE or EOS. - */ -size_t __cs_recv(struct conn_stream *cs, struct buffer *buf, size_t count, int flags) -{ - size_t ret = 0; - - /* transfer possibly pending data to the upper layer */ - ret = b_xfer(buf, &cs->rxbuf, count); - - if (b_data(&cs->rxbuf)) - cs->flags |= CS_FL_RCV_MORE; - else { - cs->flags &= ~CS_FL_RCV_MORE; - if (cs->flags & CS_FL_REOS) - cs->flags |= CS_FL_EOS; - cs_drop_rxbuf(cs); - } - - return ret; -} - /* * default cs send() : this one is used when mux->snd_buf == NULL. It puts up to * bytes from into cs->txbuf. The number of bytes transferred is diff --git a/src/mux_h2.c b/src/mux_h2.c index a986b5a932..cb6ea26917 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3414,6 +3414,26 @@ static int h2_subscribe(struct conn_stream *cs, int event_type, void *param) } +/* Called from the upper layer, to receive data */ +static size_t h2_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags) +{ + size_t ret = 0; + + /* transfer possibly pending data to the upper layer */ + ret = b_xfer(buf, &cs->rxbuf, count); + + if (b_data(&cs->rxbuf)) + cs->flags |= CS_FL_RCV_MORE; + else { + cs->flags &= ~CS_FL_RCV_MORE; + if (cs->flags & CS_FL_REOS) + cs->flags |= CS_FL_EOS; + cs_drop_rxbuf(cs); + } + + return ret; +} + /* Called from the upper layer, to send data */ static size_t h2_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags) { @@ -3591,6 +3611,7 @@ const struct mux_ops h2_ops = { .wake = h2_wake, .update_poll = h2_update_poll, .snd_buf = h2_snd_buf, + .rcv_buf = h2_rcv_buf, .subscribe = h2_subscribe, .attach = h2_attach, .detach = h2_detach, diff --git a/src/stream_interface.c b/src/stream_interface.c index e56a7c135e..591d8352b0 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -1244,7 +1244,7 @@ static void si_cs_recv_cb(struct conn_stream *cs) break; } - ret = cs_recv(cs, &ic->buf, max, co_data(ic) ? CO_RFL_BUF_WET : 0); + ret = cs->conn->mux->rcv_buf(cs, &ic->buf, max, co_data(ic) ? CO_RFL_BUF_WET : 0); if (cs->flags & CS_FL_RCV_MORE) si->flags |= SI_FL_WAIT_ROOM;