mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-16 08:24:42 +00:00
MINOR: conn_stream: add cs_send() as a default snd_buf() function
This function is generic and is able to automatically transfer data from a buffer to the conn_stream's tx buffer. It does this automatically if the mux doesn't define another snd_buf() function. It cannot yet be used as-is with the conn_stream's txbuf without risking to lose data on close since conn_streams need to be orphaned for this.
This commit is contained in:
parent
3c51802fb9
commit
063f786553
@ -46,6 +46,7 @@ void conn_fd_handler(int fd);
|
||||
|
||||
/* conn_stream functions */
|
||||
size_t __cs_recv(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
|
||||
size_t __cs_send(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
|
||||
|
||||
/* receive a PROXY protocol header over a connection */
|
||||
int conn_recv_proxy(struct connection *conn, int flag);
|
||||
@ -314,6 +315,17 @@ static inline size_t cs_recv(struct conn_stream *cs, struct buffer *buf, size_t
|
||||
return __cs_recv(cs, buf, count, flags);
|
||||
}
|
||||
|
||||
/* conn_stream send function. Uses mux->snd_buf() if defined, otherwise
|
||||
* falls back to __cs_send().
|
||||
*/
|
||||
static inline size_t cs_send(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
|
||||
{
|
||||
if (cs->conn->mux->snd_buf)
|
||||
return cs->conn->mux->snd_buf(cs, buf, count, flags);
|
||||
else
|
||||
return __cs_send(cs, buf, count, flags);
|
||||
}
|
||||
|
||||
/***** Event manipulation primitives for use by DATA I/O callbacks *****/
|
||||
/* The __conn_* versions do not propagate to lower layers and are only meant
|
||||
* to be used by handlers called by the connection handler. The other ones
|
||||
|
@ -771,7 +771,7 @@ static void __event_srv_chk_w(struct conn_stream *cs)
|
||||
goto out;
|
||||
|
||||
if (b_data(&check->bo)) {
|
||||
conn->mux->snd_buf(cs, &check->bo, b_data(&check->bo), 0);
|
||||
cs_send(cs, &check->bo, b_data(&check->bo), 0);
|
||||
b_realign_if_empty(&check->bo);
|
||||
if (conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR) {
|
||||
chk_report_conn_err(check, errno, 0);
|
||||
@ -2699,7 +2699,7 @@ static int tcpcheck_main(struct check *check)
|
||||
int ret;
|
||||
|
||||
__cs_want_send(cs);
|
||||
ret = conn->mux->snd_buf(cs, &check->bo, b_data(&check->bo), 0);
|
||||
ret = cs_send(cs, &check->bo, b_data(&check->bo), 0);
|
||||
b_realign_if_empty(&check->bo);
|
||||
|
||||
if (ret <= 0) {
|
||||
|
@ -410,6 +410,17 @@ size_t __cs_recv(struct conn_stream *cs, struct buffer *buf, size_t count, int f
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* default cs send() : this one is used when mux->snd_buf == NULL. It puts up to
|
||||
* <count> bytes from <buf> into cs->txbuf. The number of bytes transferred is
|
||||
* returned. Here we don't care if cs->txbuf is allocated or not. If not, it
|
||||
* will be swapped with <buf>.
|
||||
*/
|
||||
size_t __cs_send(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
|
||||
{
|
||||
return b_xfer(&cs->txbuf, buf, count);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get data length from tlv
|
||||
*/
|
||||
|
@ -721,7 +721,7 @@ static struct task * si_cs_send(struct task *t, void *ctx, unsigned short state)
|
||||
if (oc->flags & CF_STREAMER)
|
||||
send_flag |= CO_SFL_STREAMER;
|
||||
|
||||
ret = conn->mux->snd_buf(cs, &oc->buf, co_data(oc), send_flag);
|
||||
ret = cs_send(cs, &oc->buf, co_data(oc), send_flag);
|
||||
if (ret > 0) {
|
||||
did_send = 1;
|
||||
oc->flags |= CF_WRITE_PARTIAL | CF_WROTE_DATA | CF_WRITE_EVENT;
|
||||
|
Loading…
Reference in New Issue
Block a user