From: Willy Tarreau Date: Wed, 17 Jul 2019 12:33:15 +0000 (+0200) Subject: MINOR: connection: add new src and dst fields X-Git-Tag: v2.1-dev2~317 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ef4cbc693293d78dbce57217bce6bf96b22739f;p=thirdparty%2Fhaproxy.git MINOR: connection: add new src and dst fields At the moment we're facing difficulties with connection reuse based on the fact that connections may be allocated very early only to set a target address in transparent mode. With the imminent removal of the legacy mode, the connection reuse by a same stream will not exist anymore and all this awful complexity is not justified anymore. However we still need to be able to assign addresses somewhere. Thus instead of allocating a connection, we'll only place addresses where needed in the stream during operations. But this takes quite some room (typically 128 bytes). This is a nice opportunity for cleaning all this up and dynamically allocatating the addresses fields, which will result in actually saving memory from connection structs since most of the time the client's "to" address is not used and the server's "from" is not used either, thus saving ~256 bytes per end-to-end connection. For now these new "src" and "dst" pointers point to addr.from and addr.to. This will allow us to smoothly update the whole code to use these pointers prior to going further and switching them to pools. --- diff --git a/include/proto/connection.h b/include/proto/connection.h index af9b777226..7ee54f2cab 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -468,6 +468,8 @@ static inline void conn_init(struct connection *conn) conn->send_wait = NULL; conn->recv_wait = NULL; conn->idle_time = 0; + conn->src = &conn->addr.from; + conn->dst = &conn->addr.to; } /* sets as the connection's owner */ diff --git a/include/types/connection.h b/include/types/connection.h index 6609f8b3d7..816e06d0a8 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -459,6 +459,8 @@ struct connection { /* third cache line and beyond */ void (*destroy_cb)(struct connection *conn); /* callback to notify of imminent death of the connection */ + struct sockaddr_storage *src; /* source address (pool), when known, otherwise NULL */ + struct sockaddr_storage *dst; /* destination address (pool), when known, otherwise NULL */ struct { struct sockaddr_storage from; /* client address, or address to spoof when connecting to the server */ struct sockaddr_storage to; /* address reached by the client, or address to connect to */