MINOR: connection: extend conn_reverse() for active reverse

Implement active reverse support inside conn_reverse(). This is used to
transfer the connection from the backend to the frontend side.

A new flag is defined CO_FL_REVERSED which is set just after this
transition. This will be used to identify connections which were
reversed but not yet accepted.
This commit is contained in:
Amaury Denoyelle 2023-08-07 14:46:24 +02:00
parent 5db6dde058
commit 008e8f67ee
2 changed files with 11 additions and 2 deletions

View File

@ -85,7 +85,8 @@ enum {
CO_FL_IDLE_LIST = 0x00000002, /* 2 = in idle_list, 3 = invalid */
CO_FL_LIST_MASK = 0x00000003, /* Is the connection in any server-managed list ? */
/* unused : 0x00000004, 0x00000008 */
CO_FL_REVERSED = 0x00000004, /* connection has been reversed but not yet accepted */
/* unused : 0x00000008 */
/* unused : 0x00000010 */
/* unused : 0x00000020 */

View File

@ -2440,6 +2440,11 @@ uint64_t conn_calculate_hash(const struct conn_hash_params *params)
/* Reverse a <conn> connection instance. This effectively moves the connection
* from frontend to backend side or vice-versa depending on its initial status.
*
* For active reversal, 'reverse' member points to the listener used as the new
* connection target. Once transition is completed, the connection needs to be
* accepted on the listener to instantiate its parent session before using
* streams.
*
* For passive reversal, 'reverse' member points to the server used as the new
* connection target. Once transition is completed, the connection appears as a
* normal backend connection.
@ -2486,7 +2491,10 @@ int conn_reverse(struct connection *conn)
conn_set_owner(conn, NULL, NULL);
}
else {
ABORT_NOW();
conn_backend_deinit(conn);
conn->target = conn->reverse.target;
conn->flags |= CO_FL_REVERSED;
}
/* Invert source and destination addresses if already set. */