mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 15:47:01 +02:00
MEDIUM: stream-interface: add a snd_buf() callback to sock_ops
This callback is used to send data from the buffer to the socket. It is the old write_loop() call of the data layer which is used both by the ->write() callback and the ->chk_snd() function. The reason for having it as a pointer is that it's the only remaining part which causes the write and chk_snd() functions to be different between raw and ssl.
This commit is contained in:
parent
46a8d925c2
commit
fae4499e36
@ -37,6 +37,16 @@ static inline void conn_data_close(struct connection *conn)
|
|||||||
conn->data->close(conn);
|
conn->data->close(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Calls the snd_buf() function of the data layer if any, otherwise
|
||||||
|
* returns 0.
|
||||||
|
*/
|
||||||
|
static inline int conn_data_snd_buf(struct connection *conn)
|
||||||
|
{
|
||||||
|
if (!conn->data->snd_buf)
|
||||||
|
return 0;
|
||||||
|
return conn->data->snd_buf(conn);
|
||||||
|
}
|
||||||
|
|
||||||
/* set polling depending on the change between the CURR part of the
|
/* set polling depending on the change between the CURR part of the
|
||||||
* flags and the new flags in connection C. The connection flags are
|
* flags and the new flags in connection C. The connection flags are
|
||||||
* updated with the new flags at the end of the operation. Only the bits
|
* updated with the new flags at the end of the operation. Only the bits
|
||||||
|
@ -117,7 +117,7 @@ struct sock_ops {
|
|||||||
void (*read)(struct connection *conn); /* read callback after poll() */
|
void (*read)(struct connection *conn); /* read callback after poll() */
|
||||||
void (*write)(struct connection *conn); /* write callback after poll() */
|
void (*write)(struct connection *conn); /* write callback after poll() */
|
||||||
void (*close)(struct connection *); /* close the data channel on the connection */
|
void (*close)(struct connection *); /* close the data channel on the connection */
|
||||||
|
int (*snd_buf)(struct connection *conn); /* callback used to send a buffer contents */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A stream interface has 3 parts :
|
/* A stream interface has 3 parts :
|
||||||
|
@ -452,8 +452,10 @@ static void sock_raw_read(struct connection *conn)
|
|||||||
* This function is called to send buffer data to a stream socket.
|
* This function is called to send buffer data to a stream socket.
|
||||||
* It returns -1 in case of unrecoverable error, otherwise zero.
|
* It returns -1 in case of unrecoverable error, otherwise zero.
|
||||||
*/
|
*/
|
||||||
static int sock_raw_write_loop(struct stream_interface *si, struct buffer *b)
|
static int sock_raw_write_loop(struct connection *conn)
|
||||||
{
|
{
|
||||||
|
struct stream_interface *si = container_of(conn, struct stream_interface, conn);
|
||||||
|
struct buffer *b = si->ob;
|
||||||
int write_poll = MAX_WRITE_POLL_LOOPS;
|
int write_poll = MAX_WRITE_POLL_LOOPS;
|
||||||
int ret, max;
|
int ret, max;
|
||||||
|
|
||||||
@ -610,7 +612,7 @@ static void sock_raw_write(struct connection *conn)
|
|||||||
if (b->flags & BF_SHUTW)
|
if (b->flags & BF_SHUTW)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (sock_raw_write_loop(si, b) < 0)
|
if (conn_data_snd_buf(conn) < 0)
|
||||||
goto out_error;
|
goto out_error;
|
||||||
|
|
||||||
/* OK all done */
|
/* OK all done */
|
||||||
@ -700,7 +702,7 @@ static void sock_raw_chk_snd(struct stream_interface *si)
|
|||||||
(fdtab[si_fd(si)].ev & FD_POLL_OUT))) /* we'll be called anyway */
|
(fdtab[si_fd(si)].ev & FD_POLL_OUT))) /* we'll be called anyway */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (sock_raw_write_loop(si, ob) < 0) {
|
if (conn_data_snd_buf(&si->conn) < 0) {
|
||||||
/* Write error on the file descriptor. We mark the FD as STERROR so
|
/* Write error on the file descriptor. We mark the FD as STERROR so
|
||||||
* that we don't use it anymore and we notify the task.
|
* that we don't use it anymore and we notify the task.
|
||||||
*/
|
*/
|
||||||
@ -780,6 +782,7 @@ struct sock_ops sock_raw = {
|
|||||||
.chk_snd = sock_raw_chk_snd,
|
.chk_snd = sock_raw_chk_snd,
|
||||||
.read = sock_raw_read,
|
.read = sock_raw_read,
|
||||||
.write = sock_raw_write,
|
.write = sock_raw_write,
|
||||||
|
.snd_buf = sock_raw_write_loop,
|
||||||
.close = NULL,
|
.close = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user