]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: connection: remove sock-specific code from conn_sock_send()
authorWilly Tarreau <w@1wt.eu>
Fri, 11 Dec 2020 14:26:55 +0000 (15:26 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 11 Dec 2020 15:25:11 +0000 (16:25 +0100)
The send() loop present in this function and the error handling is already
present in raw_sock_from_buf(). Let's rely on it instead and stop touching
the FD from this place. The send flag was changed to use a more agnostic
CO_SFL_*. The name was changed to "conn_ctrl_send()" to remind that it's
meant to be used to send at the lowest level.

include/haproxy/connection.h
src/connection.c
src/stream_interface.c

index 13c93a4b83dc645bf73e2ecd608fa88011df1c70..c52437f7f0c44494d071bb24f6236371454d6741 100644 (file)
@@ -65,7 +65,7 @@ int conn_unsubscribe(struct connection *conn, void *xprt_ctx, int event_type, st
 int conn_recv_netscaler_cip(struct connection *conn, int flag);
 
 /* raw send() directly on the socket */
-int conn_sock_send(struct connection *conn, const void *buf, int len, int flags);
+int conn_ctrl_send(struct connection *conn, const void *buf, int len, int flags);
 
 /* drains any pending bytes from the socket */
 int conn_sock_drain(struct connection *conn);
index 155e5618e426bb5519bd647b49aa8448e4b4de3c..16d4f92b42aa4702d9ed4082d517ff4ffa776f4c 100644 (file)
@@ -289,11 +289,13 @@ int conn_fd_check(struct connection *conn)
  * (typically send_proxy). In case of EAGAIN, the fd is marked as "cant_send".
  * It automatically retries on EINTR. Other errors cause the connection to be
  * marked as in error state. It takes similar arguments as send() except the
- * first one which is the connection instead of the file descriptor. Note,
- * MSG_DONTWAIT and MSG_NOSIGNAL are forced on the flags.
+ * first one which is the connection instead of the file descriptor. <flags>
+ * only support CO_SFL_MSG_MORE.
  */
-int conn_sock_send(struct connection *conn, const void *buf, int len, int flags)
+int conn_ctrl_send(struct connection *conn, const void *buf, int len, int flags)
 {
+       const struct buffer buffer = b_make((char*)buf, len, 0, len);
+       const struct xprt_ops *xprt = xprt_get(XPRT_RAW);
        int ret;
 
        ret = -1;
@@ -309,28 +311,13 @@ int conn_sock_send(struct connection *conn, const void *buf, int len, int flags)
        if (!len)
                goto fail;
 
-       if (!fd_send_ready(conn->handle.fd))
-               goto wait;
-
-       do {
-               ret = send(conn->handle.fd, buf, len, flags | MSG_DONTWAIT | MSG_NOSIGNAL);
-       } while (ret < 0 && errno == EINTR);
-
-
-       if (ret > 0) {
-               if (conn->flags & CO_FL_WAIT_L4_CONN) {
-                       conn->flags &= ~CO_FL_WAIT_L4_CONN;
-                       fd_may_send(conn->handle.fd);
-                       fd_cond_recv(conn->handle.fd);
-               }
-               return ret;
-       }
-
-       if (ret == 0 || errno == EAGAIN || errno == ENOTCONN) {
-       wait:
-               fd_cant_send(conn->handle.fd);
-               return 0;
-       }
+       /* snd_buf() already takes care of updating conn->flags and handling
+        * the FD polling status.
+        */
+       ret = xprt->snd_buf(conn, NULL, &buffer, buffer.data, flags);
+       if (conn->flags & CO_FL_ERROR)
+               ret = -1;
+       return ret;
  fail:
        conn->flags |= CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH | CO_FL_ERROR;
        return ret;
@@ -1084,11 +1071,11 @@ int conn_send_socks4_proxy_request(struct connection *conn)
                /* we are sending the socks4_req_line here. If the data layer
                 * has a pending write, we'll also set MSG_MORE.
                 */
-               ret = conn_sock_send(
+               ret = conn_ctrl_send(
                                conn,
                                ((char *)(&req_line)) + (sizeof(req_line)+conn->send_proxy_ofs),
                                -conn->send_proxy_ofs,
-                               (conn->subs && conn->subs->events & SUB_RETRY_SEND) ? MSG_MORE : 0);
+                               (conn->subs && conn->subs->events & SUB_RETRY_SEND) ? CO_SFL_MSG_MORE : 0);
 
                DPRINTF(stderr, "SOCKS PROXY HS FD[%04X]: Before send remain is [%d], sent [%d]\n",
                                conn->handle.fd, -conn->send_proxy_ofs, ret);
index e903b6d120d783dd431ba17cbfa87b1430bac3d0..80dacc07c71fd4de0c320bd3e61fae3be62b12e1 100644 (file)
@@ -383,10 +383,10 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag)
                /* we have to send trash from (ret+sp for -sp bytes). If the
                 * data layer has a pending write, we'll also set MSG_MORE.
                 */
-               ret = conn_sock_send(conn,
+               ret = conn_ctrl_send(conn,
                                     trash.area + ret + conn->send_proxy_ofs,
                                     -conn->send_proxy_ofs,
-                                    (conn->subs && conn->subs->events & SUB_RETRY_SEND) ? MSG_MORE : 0);
+                                    (conn->subs && conn->subs->events & SUB_RETRY_SEND) ? CO_SFL_MSG_MORE : 0);
 
                if (ret < 0)
                        goto out_error;