]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: h2: implement active connection reversal
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Mon, 7 Aug 2023 12:55:32 +0000 (14:55 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 24 Aug 2023 15:03:08 +0000 (17:03 +0200)
Implement active reverse on h2_conn_reverse().

Only minimal steps are done here : HTTP version session counters are
incremented on the listener instance. Also, the connection is inserted
in the mux_stopping_list to ensure it will be actively closed on process
shutdown/listener suspend.

src/mux_h2.c

index 6de86f6bea85c081260de759d0eacd658a49ab39..7e87934b2765bc6bf96fd0489e10c26fd436e601 100644 (file)
@@ -3220,6 +3220,9 @@ static int h2_frame_check_vs_state(struct h2c *h2c, struct h2s *h2s)
  * passive reversal. Timeouts are inverted and H2_CF_IS_BACK is set or unset
  * depending on the reversal direction.
  *
+ * For active reversal, only minor steps are required. The connection should
+ * then be accepted by its listener before being able to use it for transfers.
+ *
  * For passive reversal, connection is inserted in its targetted server idle
  * pool. It can thus be reused immediately for future transfers on this server.
  *
@@ -3257,7 +3260,23 @@ static int h2_conn_reverse(struct h2c *h2c)
                srv_add_to_idle_list(srv, conn, 1);
        }
        else {
-               /* TODO */
+               struct listener *l = __objt_listener(h2c->conn->target);
+               struct proxy *prx = l->bind_conf->frontend;
+
+               h2c->flags &= ~H2_CF_IS_BACK;
+
+               h2c->shut_timeout = h2c->timeout = prx->timeout.client;
+               if (tick_isset(prx->timeout.clientfin))
+                       h2c->shut_timeout = prx->timeout.clientfin;
+
+               h2c->px_counters = EXTRA_COUNTERS_GET(prx->extra_counters_fe,
+                                                     &h2_stats_module);
+
+               proxy_inc_fe_cum_sess_ver_ctr(l, prx, 2);
+
+               BUG_ON(LIST_INLIST(&h2c->conn->stopping_list));
+               LIST_APPEND(&mux_stopping_data[tid].list,
+                           &h2c->conn->stopping_list);
        }
 
        h2c->task->expire = tick_add(now_ms, h2c->timeout);