*/
void conn_fd_handler(int fd);
-/* conn_stream functions */
-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);
int make_proxy_line(char *buf, int buf_len, struct server *srv, struct connection *remote);
conn->mux->update_poll(cs);
}
-/* 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
LIST_INIT(&cs->wait_list.list);
LIST_INIT(&cs->send_wait_list);
cs->conn = conn;
- cs->txbuf = BUF_NULL;
}
/* Initializes all required fields for a new connection. Note that it does the
return conn;
}
-/* Releases the conn_stream's tx buf if it exists. The buffer is automatically
- * replaced with a pointer to the empty buffer.
- */
-static inline void cs_drop_txbuf(struct conn_stream *cs)
-{
- if (b_size(&cs->txbuf)) {
- b_free(&cs->txbuf);
- offer_buffers(NULL, tasks_run_queue);
- }
-}
-
/* Releases a conn_stream previously allocated by cs_new(), as well as any
* buffer it would still hold.
*/
if (cs->wait_list.task)
tasklet_free(cs->wait_list.task);
- cs_drop_txbuf(cs);
pool_free(pool_head_connstream, cs);
}
struct connection *conn; /* xprt-level connection */
struct wait_list wait_list; /* We're in a wait list for send */
struct list send_wait_list; /* list of tasks to wake when we're ready to send */
- struct buffer txbuf; /* transmission buffer, always valid (buf_empty or real buffer) */
void *data; /* pointer to upper layer's entity (eg: stream interface) */
const struct data_cb *data_cb; /* data layer callbacks. Must be set before xprt->init() */
void *ctx; /* mux-specific context */
goto out;
if (b_data(&check->bo)) {
- cs_send(cs, &check->bo, b_data(&check->bo), 0);
+ cs->conn->mux->snd_buf(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);
int ret;
__cs_want_send(cs);
- ret = cs_send(cs, &check->bo, b_data(&check->bo), 0);
+ ret = cs->conn->mux->snd_buf(cs, &check->bo, b_data(&check->bo), 0);
b_realign_if_empty(&check->bo);
if (ret <= 0) {
return 1;
}
-/*
- * 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
*/
if (oc->flags & CF_STREAMER)
send_flag |= CO_SFL_STREAMER;
- ret = cs_send(cs, &oc->buf, co_data(oc), send_flag);
+ ret = cs->conn->mux->snd_buf(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;