]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
REORG/MINOR: stream_interface: move si->fd to struct connection
authorWilly Tarreau <w@1wt.eu>
Mon, 21 May 2012 14:47:54 +0000 (16:47 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 21 May 2012 14:47:54 +0000 (16:47 +0200)
The socket fd is used only when in socket mode and with a connection.

include/proto/stream_interface.h
include/types/stream_interface.h
src/dumpstats.c
src/frontend.c
src/peers.c
src/proto_http.c
src/proto_tcp.c
src/session.c
src/sock_raw.c

index 9a619f8626cb4fdd55348e79adc75f92be6f2168..83c389a830a4d510da8c096e103fcc921fa55f8a 100644 (file)
@@ -52,6 +52,11 @@ static inline const struct sock_ops *si_data(struct stream_interface *si)
        return si->conn.data;
 }
 
+static inline int si_fd(struct stream_interface *si)
+{
+       return si->conn.t.sock.fd;
+}
+
 static inline void clear_target(struct target *dest)
 {
        dest->type = TARG_TYPE_NONE;
@@ -121,7 +126,7 @@ static inline void si_get_from_addr(struct stream_interface *si)
        if (!si_ctrl(si) || !si_ctrl(si)->get_src)
                return;
 
-       if (si_ctrl(si)->get_src(si->fd, (struct sockaddr *)&si->addr.from,
+       if (si_ctrl(si)->get_src(si_fd(si), (struct sockaddr *)&si->addr.from,
                                 sizeof(si->addr.from),
                                 si->target.type != TARG_TYPE_CLIENT) == -1)
                return;
@@ -137,7 +142,7 @@ static inline void si_get_to_addr(struct stream_interface *si)
        if (!si_ctrl(si) || !si_ctrl(si)->get_dst)
                return;
 
-       if (si_ctrl(si)->get_dst(si->fd, (struct sockaddr *)&si->addr.to,
+       if (si_ctrl(si)->get_dst(si_fd(si), (struct sockaddr *)&si->addr.to,
                                 sizeof(si->addr.to),
                                 si->target.type != TARG_TYPE_CLIENT) == -1)
                return;
index d573c585eb7568d8ba87953967c331ba1004d2bb..ccaa1ebaa8356c9643148e9f0fd2a37c82f52185 100644 (file)
@@ -105,6 +105,11 @@ struct stream_interface;
 struct connection {
        const struct sock_ops *data;  /* operations at the data layer */
        const struct protocol *ctrl;  /* operations at the control layer, generally a protocol */
+       union {                       /* definitions which depend on connection type */
+               struct {              /*** information used by socket-based connections ***/
+                       int fd;       /* file descriptor for a stream driver when known */
+               } sock;
+       } t;
 };
 
 struct target {
@@ -158,7 +163,6 @@ struct stream_interface {
        struct target target;   /* the target to connect to (server, proxy, applet, ...) */
        int conn_retries;       /* number of connect retries left */
        int send_proxy_ofs;     /* <0 = offset to (re)send from the end, >0 = send all */
-       int fd;                 /* file descriptor for a stream driver when known */
        struct {
                int state;                 /* applet state, initialized to zero */
                void *private;             /* may be used by any function above */
index 65f076da9839c32ad85a4d1677c097e6eae5e61b..8a816789b7b08d5fe07c05a5a1c18083d22ff6be 100644 (file)
@@ -3347,7 +3347,7 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si)
                             &sess->si[0],
                             sess->si[0].state,
                             sess->si[0].flags,
-                            sess->si[0].fd,
+                            si_fd(&sess->si[0]),
                             sess->si[0].exp ?
                                     tick_is_expired(sess->si[0].exp, now_ms) ? "<PAST>" :
                                             human_time(TICKS_TO_MS(sess->si[0].exp - now_ms),
@@ -3359,7 +3359,7 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si)
                             &sess->si[1],
                             sess->si[1].state,
                             sess->si[1].flags,
-                            sess->si[1].fd,
+                            si_fd(&sess->si[1]),
                             sess->si[1].exp ?
                                     tick_is_expired(sess->si[1].exp, now_ms) ? "<PAST>" :
                                             human_time(TICKS_TO_MS(sess->si[1].exp - now_ms),
@@ -3590,7 +3590,7 @@ static int stats_dump_sess_to_buffer(struct stream_interface *si)
                                     " s0=[%d,%1xh,fd=%d,ex=%s]",
                                     curr_sess->si[0].state,
                                     curr_sess->si[0].flags,
-                                    curr_sess->si[0].fd,
+                                    si_fd(&curr_sess->si[0]),
                                     curr_sess->si[0].exp ?
                                     human_time(TICKS_TO_MS(curr_sess->si[0].exp - now_ms),
                                                TICKS_TO_MS(1000)) : "");
@@ -3599,7 +3599,7 @@ static int stats_dump_sess_to_buffer(struct stream_interface *si)
                                     " s1=[%d,%1xh,fd=%d,ex=%s]",
                                     curr_sess->si[1].state,
                                     curr_sess->si[1].flags,
-                                    curr_sess->si[1].fd,
+                                    si_fd(&curr_sess->si[1]),
                                     curr_sess->si[1].exp ?
                                     human_time(TICKS_TO_MS(curr_sess->si[1].exp - now_ms),
                                                TICKS_TO_MS(1000)) : "");
index d2a9e70bf58cd2b37c2d3dd4632b31e537a7b297..63a2c1ffde8aa6d9fc8b2238493e3e23755a76a1 100644 (file)
@@ -52,7 +52,7 @@
  */
 int frontend_accept(struct session *s)
 {
-       int cfd = s->si[0].fd;
+       int cfd = si_fd(&s->si[0]);
 
        tv_zero(&s->logs.tv_request);
        s->logs.t_queue = -1;
index db22a843d5cbd9648e046aa8fc862004435d9cdb..6fcf2f30110a0cce4026c4d9a89cc8596e05b768 100644 (file)
@@ -1149,7 +1149,7 @@ static struct session *peer_session_create(struct peer *peer, struct peer_sessio
 
        s->req = s->rep = NULL; /* will be allocated later */
 
-       s->si[0].fd = -1;
+       s->si[0].conn.t.sock.fd = -1;
        s->si[0].owner = t;
        s->si[0].state = s->si[0].prev_state = SI_ST_EST;
        s->si[0].err_type = SI_ET_NONE;
@@ -1167,7 +1167,7 @@ static struct session *peer_session_create(struct peer *peer, struct peer_sessio
 
        stream_int_register_handler(&s->si[0], &peer_applet);
 
-       s->si[1].fd = -1; /* just to help with debugging */
+       s->si[1].conn.t.sock.fd = -1; /* just to help with debugging */
        s->si[1].owner = t;
        s->si[1].state = s->si[1].prev_state = SI_ST_ASS;
        s->si[1].conn_retries = p->conn_retries;
index 850589eb61b87059a5f1f8355db68928baa96f26..189fcf3aca3a0b9e8118fe1393a601a69ae422bb 100644 (file)
@@ -2211,7 +2211,7 @@ int http_wait_for_request(struct session *s, struct buffer *req, int an_bit)
                         * previously disabled it, otherwise we might cause the client
                         * to delay next data.
                         */
-                       setsockopt(s->si[0].fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
+                       setsockopt(si_fd(&s->si[0]), IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
                }
 #endif
 
@@ -3406,7 +3406,7 @@ int http_process_request(struct session *s, struct buffer *req, int an_bit)
                if ((s->listener->options & LI_O_NOQUICKACK) &&
                    ((msg->flags & HTTP_MSGF_TE_CHNK) ||
                     (msg->body_len > req->i - txn->req.eoh - 2)))
-                       setsockopt(s->si[0].fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
+                       setsockopt(si_fd(&s->si[0]), IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
 #endif
        }
 
@@ -3759,7 +3759,7 @@ void http_end_txn_clean_session(struct session *s)
        clear_target(&s->target);
 
        s->req->cons->state     = s->req->cons->prev_state = SI_ST_INI;
-       s->req->cons->fd        = -1; /* just to help with debugging */
+       s->req->cons->conn.t.sock.fd = -1; /* just to help with debugging */
        s->req->cons->err_type  = SI_ET_NONE;
        s->req->cons->conn_retries = 0;  /* used for logging too */
        s->req->cons->err_loc   = NULL;
@@ -7293,7 +7293,7 @@ void debug_hdr(const char *dir, struct session *t, const char *start, const char
 {
        int len, max;
        len = sprintf(trash, "%08x:%s.%s[%04x:%04x]: ", t->uniq_id, t->be->id,
-                     dir, (unsigned  short)t->req->prod->fd, (unsigned short)t->req->cons->fd);
+                     dir, (unsigned  short)si_fd(t->req->prod), (unsigned short)si_fd(t->req->cons));
        max = end - start;
        UBOUND(max, trashlen - len - 1);
        len += strlcpy2(trash + len, start, max + 1);
index 02b20dd4a7bf814e14447a1a6ca47876063bfbcd..ccd9e48615b3271893a4c37562e5573841111766 100644 (file)
@@ -237,7 +237,7 @@ int tcp_connect_server(struct stream_interface *si)
                return SN_ERR_INTERNAL;
        }
 
-       if ((fd = si->fd = socket(si->addr.to.ss_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
+       if ((fd = si->conn.t.sock.fd = socket(si->addr.to.ss_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
                qfprintf(stderr, "Cannot get a server socket.\n");
 
                if (errno == ENFILE)
@@ -555,7 +555,7 @@ static int tcp_connect_write(int fd)
                        si->send_proxy_ofs = -ret; /* first call */
 
                /* we have to send trash from (ret+sp for -sp bytes) */
-               ret = send(si->fd, trash + ret + si->send_proxy_ofs, -si->send_proxy_ofs,
+               ret = send(fd, trash + ret + si->send_proxy_ofs, -si->send_proxy_ofs,
                           (b->flags & BF_OUT_EMPTY) ? 0 : MSG_MORE);
 
                if (ret == 0)
index 8a2704148450c1eec223747a2b5d683b3a1f3b19..6db9f31c546be8ba5c5666ef7e06c7f83f61aebd 100644 (file)
@@ -161,7 +161,7 @@ int session_accept(struct listener *l, int cfd, struct sockaddr_storage *addr)
        }
 
        /* this part should be common with other protocols */
-       s->si[0].fd        = cfd;
+       s->si[0].conn.t.sock.fd = cfd;
        s->si[0].owner     = t;
        s->si[0].state     = s->si[0].prev_state = SI_ST_EST;
        s->si[0].err_type  = SI_ET_NONE;
@@ -185,7 +185,7 @@ int session_accept(struct listener *l, int cfd, struct sockaddr_storage *addr)
        /* pre-initialize the other side's stream interface to an INIT state. The
         * callbacks will be initialized before attempting to connect.
         */
-       s->si[1].fd        = -1; /* just to help with debugging */
+       s->si[1].conn.t.sock.fd = -1; /* just to help with debugging */
        s->si[1].owner     = t;
        s->si[1].state     = s->si[1].prev_state = SI_ST_INI;
        s->si[1].err_type  = SI_ET_NONE;
@@ -543,7 +543,7 @@ static int sess_update_st_con_tcp(struct session *s, struct stream_interface *si
                si->exp   = TICK_ETERNITY;
                si->state = SI_ST_CER;
                si->flags &= ~SI_FL_CAP_SPLICE;
-               fd_delete(si->fd);
+               fd_delete(si_fd(si));
 
                if (si->release)
                        si->release(si);
@@ -2079,8 +2079,8 @@ struct task *process_session(struct task *t)
                    s->si[1].prev_state == SI_ST_EST) {
                        len = sprintf(trash, "%08x:%s.srvcls[%04x:%04x]\n",
                                      s->uniq_id, s->be->id,
-                                     (unsigned short)s->si[0].fd,
-                                     (unsigned short)s->si[1].fd);
+                                     (unsigned short)si_fd(&s->si[0]),
+                                     (unsigned short)si_fd(&s->si[1]));
                        if (write(1, trash, len) < 0) /* shut gcc warning */;
                }
 
@@ -2088,8 +2088,8 @@ struct task *process_session(struct task *t)
                    s->si[0].prev_state == SI_ST_EST) {
                        len = sprintf(trash, "%08x:%s.clicls[%04x:%04x]\n",
                                      s->uniq_id, s->be->id,
-                                     (unsigned short)s->si[0].fd,
-                                     (unsigned short)s->si[1].fd);
+                                     (unsigned short)si_fd(&s->si[0]),
+                                     (unsigned short)si_fd(&s->si[1]));
                        if (write(1, trash, len) < 0) /* shut gcc warning */;
                }
        }
@@ -2196,7 +2196,7 @@ struct task *process_session(struct task *t)
                int len;
                len = sprintf(trash, "%08x:%s.closed[%04x:%04x]\n",
                              s->uniq_id, s->be->id,
-                             (unsigned short)s->req->prod->fd, (unsigned short)s->req->cons->fd);
+                             (unsigned short)si_fd(s->req->prod), (unsigned short)si_fd(s->req->cons));
                if (write(1, trash, len) < 0) /* shut gcc warning */;
        }
 
index 143d14511381c525122208135ea1cb1dc64e13c0..1205b2e49b52675c02436609a08bc81b302c0fbe 100644 (file)
@@ -84,7 +84,7 @@ static void sock_raw_chk_snd(struct stream_interface *si);
 static int sock_raw_splice_in(struct buffer *b, struct stream_interface *si)
 {
        static int splice_detects_close;
-       int fd = si->fd;
+       int fd = si_fd(si);
        int ret;
        unsigned long max;
        int retval = 1;
@@ -526,7 +526,7 @@ static int sock_raw_write_loop(struct stream_interface *si, struct buffer *b)
 
 #if defined(CONFIG_HAP_LINUX_SPLICE)
        while (b->pipe) {
-               ret = splice(b->pipe->cons, NULL, si->fd, NULL, b->pipe->data,
+               ret = splice(b->pipe->cons, NULL, si_fd(si), NULL, b->pipe->data,
                             SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
                if (ret <= 0) {
                        if (ret == 0 || errno == EAGAIN) {
@@ -601,21 +601,21 @@ static int sock_raw_write_loop(struct stream_interface *si, struct buffer *b)
                        if (b->flags & BF_SEND_DONTWAIT)
                                send_flag &= ~MSG_MORE;
 
-                       ret = send(si->fd, bo_ptr(b), max, send_flag);
+                       ret = send(si_fd(si), bo_ptr(b), max, send_flag);
                } else {
                        int skerr;
                        socklen_t lskerr = sizeof(skerr);
 
-                       ret = getsockopt(si->fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr);
+                       ret = getsockopt(si_fd(si), SOL_SOCKET, SO_ERROR, &skerr, &lskerr);
                        if (ret == -1 || skerr)
                                ret = -1;
                        else
-                               ret = send(si->fd, bo_ptr(b), max, MSG_DONTWAIT);
+                               ret = send(si_fd(si), bo_ptr(b), max, MSG_DONTWAIT);
                }
 
                if (ret > 0) {
-                       if (fdtab[si->fd].state == FD_STCONN) {
-                               fdtab[si->fd].state = FD_STREADY;
+                       if (fdtab[si_fd(si)].state == FD_STCONN) {
+                               fdtab[si_fd(si)].state = FD_STREADY;
                                si->exp = TICK_ETERNITY;
                        }
 
@@ -788,12 +788,12 @@ static void sock_raw_shutw(struct stream_interface *si)
                }
                else if (si->flags & SI_FL_NOLINGER) {
                        si->flags &= ~SI_FL_NOLINGER;
-                       setsockopt(si->fd, SOL_SOCKET, SO_LINGER,
+                       setsockopt(si_fd(si), SOL_SOCKET, SO_LINGER,
                                   (struct linger *) &nolinger, sizeof(struct linger));
                }
                else if (!(si->flags & SI_FL_NOHALF)) {
-                       EV_FD_CLR(si->fd, DIR_WR);
-                       shutdown(si->fd, SHUT_WR);
+                       EV_FD_CLR(si_fd(si), DIR_WR);
+                       shutdown(si_fd(si), SHUT_WR);
 
                        if (!(si->ib->flags & (BF_SHUTR|BF_DONT_READ)))
                                return;
@@ -804,7 +804,7 @@ static void sock_raw_shutw(struct stream_interface *si)
                /* we may have to close a pending connection, and mark the
                 * response buffer as shutr
                 */
-               fd_delete(si->fd);
+               fd_delete(si_fd(si));
                /* fall through */
        case SI_ST_CER:
        case SI_ST_QUE:
@@ -841,7 +841,7 @@ static void sock_raw_shutr(struct stream_interface *si)
                return;
 
        if (si->ob->flags & BF_SHUTW) {
-               fd_delete(si->fd);
+               fd_delete(si_fd(si));
                si->state = SI_ST_DIS;
                si->exp = TICK_ETERNITY;
 
@@ -853,7 +853,7 @@ static void sock_raw_shutr(struct stream_interface *si)
                /* we want to immediately forward this close to the write side */
                return sock_raw_shutw(si);
        }
-       EV_FD_CLR(si->fd, DIR_RD);
+       EV_FD_CLR(si_fd(si), DIR_RD);
        return;
 }
 
@@ -867,7 +867,7 @@ static void sock_raw_data_finish(struct stream_interface *si)
 {
        struct buffer *ib = si->ib;
        struct buffer *ob = si->ob;
-       int fd = si->fd;
+       int fd = si_fd(si);
 
        DPRINTF(stderr,"[%u] %s: fd=%d owner=%p ib=%p, ob=%p, exp(r,w)=%u,%u ibf=%08x obf=%08x ibh=%d ibt=%d obh=%d obd=%d si=%d\n",
                now_ms, __FUNCTION__,
@@ -949,7 +949,7 @@ static void sock_raw_chk_rcv(struct stream_interface *si)
 
        DPRINTF(stderr,"[%u] %s: fd=%d owner=%p ib=%p, ob=%p, exp(r,w)=%u,%u ibf=%08x obf=%08x ibh=%d ibt=%d obh=%d obd=%d si=%d\n",
                now_ms, __FUNCTION__,
-               si->fd, fdtab[si->fd].owner,
+               si_fd(si), fdtab[si_fd(si)].owner,
                ib, si->ob,
                ib->rex, si->ob->wex,
                ib->flags, si->ob->flags,
@@ -962,12 +962,12 @@ static void sock_raw_chk_rcv(struct stream_interface *si)
                /* stop reading */
                if ((ib->flags & (BF_FULL|BF_HIJACK|BF_DONT_READ)) == BF_FULL)
                        si->flags |= SI_FL_WAIT_ROOM;
-               EV_FD_COND_C(si->fd, DIR_RD);
+               EV_FD_COND_C(si_fd(si), DIR_RD);
        }
        else {
                /* (re)start reading */
                si->flags &= ~SI_FL_WAIT_ROOM;
-               EV_FD_COND_S(si->fd, DIR_RD);
+               EV_FD_COND_S(si_fd(si), DIR_RD);
        }
 }
 
@@ -984,7 +984,7 @@ static void sock_raw_chk_snd(struct stream_interface *si)
 
        DPRINTF(stderr,"[%u] %s: fd=%d owner=%p ib=%p, ob=%p, exp(r,w)=%u,%u ibf=%08x obf=%08x ibh=%d ibt=%d obh=%d obd=%d si=%d\n",
                now_ms, __FUNCTION__,
-               si->fd, fdtab[si->fd].owner,
+               si_fd(si), fdtab[si_fd(si)].owner,
                si->ib, ob,
                si->ib->rex, ob->wex,
                si->ib->flags, ob->flags,
@@ -998,7 +998,7 @@ static void sock_raw_chk_snd(struct stream_interface *si)
 
        if (!ob->pipe &&                          /* spliced data wants to be forwarded ASAP */
            (!(si->flags & SI_FL_WAIT_DATA) ||    /* not waiting for data */
-            (fdtab[si->fd].ev & FD_POLL_OUT)))   /* we'll be called anyway */
+            (fdtab[si_fd(si)].ev & FD_POLL_OUT)))   /* we'll be called anyway */
                return;
 
        retval = sock_raw_write_loop(si, ob);
@@ -1011,9 +1011,9 @@ static void sock_raw_chk_snd(struct stream_interface *si)
                /* 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.
                 */
-               fdtab[si->fd].state = FD_STERROR;
-               fdtab[si->fd].ev &= ~FD_POLL_STICKY;
-               EV_FD_REM(si->fd);
+               fdtab[si_fd(si)].state = FD_STERROR;
+               fdtab[si_fd(si)].ev &= ~FD_POLL_STICKY;
+               EV_FD_REM(si_fd(si));
                si->flags |= SI_FL_ERR;
                goto out_wakeup;
        }
@@ -1043,7 +1043,7 @@ static void sock_raw_chk_snd(struct stream_interface *si)
                /* Otherwise there are remaining data to be sent in the buffer,
                 * which means we have to poll before doing so.
                 */
-               EV_FD_COND_S(si->fd, DIR_WR);
+               EV_FD_COND_S(si_fd(si), DIR_WR);
                si->flags &= ~SI_FL_WAIT_DATA;
                if (!tick_isset(ob->wex))
                        ob->wex = tick_add_ifset(now_ms, ob->wto);