From: Willy Tarreau Date: Tue, 18 Aug 2009 05:38:19 +0000 (+0200) Subject: [MEDIUM] stream_interface: add and use ->update function to resync X-Git-Tag: v1.4-dev3~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dc85b39db7b479e510a6e6dfc254dd9b5fa18050;p=thirdparty%2Fhaproxy.git [MEDIUM] stream_interface: add and use ->update function to resync We used to call stream_sock_data_finish() directly at the end of a session update, but if we want to support non-socket interfaces, we need to have this function configurable. Now we access it via ->update(). --- diff --git a/include/types/stream_interface.h b/include/types/stream_interface.h index 7789323fdb..c9b0e55906 100644 --- a/include/types/stream_interface.h +++ b/include/types/stream_interface.h @@ -82,12 +82,13 @@ struct stream_interface { int fd; /* file descriptor for a stream driver when known */ unsigned int flags; unsigned int exp; /* wake up time for connect, queue, turn-around, ... */ - int (*connect)(struct stream_interface *, struct proxy *, struct server *, - struct sockaddr *, struct sockaddr *); /* connect function if any */ + void (*update)(struct stream_interface *); /* update function */ void (*shutr)(struct stream_interface *); /* shutr function */ void (*shutw)(struct stream_interface *); /* shutw function */ void (*chk_rcv)(struct stream_interface *);/* chk_rcv function */ void (*chk_snd)(struct stream_interface *);/* chk_snd function */ + int (*connect)(struct stream_interface *, struct proxy *, struct server *, + struct sockaddr *, struct sockaddr *); /* connect function if any */ struct buffer *ib, *ob; /* input and output buffers */ unsigned int err_type; /* first error detected, one of SI_ET_* */ void *err_loc; /* commonly the server, NULL when SI_ET_NONE */ diff --git a/src/client.c b/src/client.c index 76ea122c98..312d896823 100644 --- a/src/client.c +++ b/src/client.c @@ -191,11 +191,12 @@ int event_accept(int fd) { s->si[0].err_type = SI_ET_NONE; s->si[0].err_loc = NULL; s->si[0].owner = t; - s->si[0].connect = NULL; + s->si[0].update = stream_sock_data_finish; s->si[0].shutr = stream_sock_shutr; s->si[0].shutw = stream_sock_shutw; s->si[0].chk_rcv = stream_sock_chk_rcv; s->si[0].chk_snd = stream_sock_chk_snd; + s->si[0].connect = NULL; s->si[0].fd = cfd; s->si[0].flags = SI_FL_NONE | SI_FL_CAP_SPLTCP; /* TCP splicing capable */ s->si[0].exp = TICK_ETERNITY; @@ -204,11 +205,12 @@ int event_accept(int fd) { s->si[1].err_type = SI_ET_NONE; s->si[1].err_loc = NULL; s->si[1].owner = t; - s->si[1].connect = tcpv4_connect_server; + s->si[1].update = stream_sock_data_finish; s->si[1].shutr = stream_sock_shutr; s->si[1].shutw = stream_sock_shutw; s->si[1].chk_rcv = stream_sock_chk_rcv; s->si[1].chk_snd = stream_sock_chk_snd; + s->si[1].connect = tcpv4_connect_server; s->si[1].exp = TICK_ETERNITY; s->si[1].fd = -1; /* just to help with debugging */ s->si[1].flags = SI_FL_NONE; diff --git a/src/proto_uxst.c b/src/proto_uxst.c index c811f64a84..60efb6dd71 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -445,11 +445,12 @@ int uxst_event_accept(int fd) { s->si[0].err_type = SI_ET_NONE; s->si[0].err_loc = NULL; s->si[0].owner = t; - s->si[0].connect = NULL; + s->si[0].update = stream_sock_data_finish; s->si[0].shutr = stream_sock_shutr; s->si[0].shutw = stream_sock_shutw; s->si[0].chk_rcv = stream_sock_chk_rcv; s->si[0].chk_snd = stream_sock_chk_snd; + s->si[0].connect = NULL; s->si[0].fd = cfd; s->si[0].flags = SI_FL_NONE; s->si[0].exp = TICK_ETERNITY; @@ -458,11 +459,12 @@ int uxst_event_accept(int fd) { s->si[1].err_type = SI_ET_NONE; s->si[1].err_loc = NULL; s->si[1].owner = t; - s->si[1].connect = NULL; + s->si[1].update = stream_sock_data_finish; s->si[1].shutr = stream_sock_shutr; s->si[1].shutw = stream_sock_shutw; s->si[1].chk_rcv = stream_sock_chk_rcv; s->si[1].chk_snd = stream_sock_chk_snd; + s->si[1].connect = NULL; s->si[1].exp = TICK_ETERNITY; s->si[1].fd = -1; /* just to help with debugging */ s->si[1].flags = SI_FL_NONE; diff --git a/src/session.c b/src/session.c index f0c2d8658e..698321241b 100644 --- a/src/session.c +++ b/src/session.c @@ -1163,10 +1163,10 @@ resync_stream_interface: session_process_counters(s); if (s->rep->cons->state == SI_ST_EST) - stream_sock_data_finish(s->rep->cons); + s->rep->cons->update(s->rep->cons); if (s->req->cons->state == SI_ST_EST) - stream_sock_data_finish(s->req->cons); + s->req->cons->update(s->req->cons); s->req->flags &= ~(BF_READ_NULL|BF_READ_PARTIAL|BF_WRITE_NULL|BF_WRITE_PARTIAL); s->rep->flags &= ~(BF_READ_NULL|BF_READ_PARTIAL|BF_WRITE_NULL|BF_WRITE_PARTIAL);