]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: stconn: Add a cross-reference between SE descriptor
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 11 May 2023 12:40:27 +0000 (14:40 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 11 May 2023 13:37:04 +0000 (15:37 +0200)
A xref is added between the endpoint descriptors. It is created when the
server endpoint is attached to the SC and it is destroyed when an endpoint
is detached.

This xref is not used for now. But it will be useful to retrieve info about
an endpoint for the opposite side. It is also the warranty there is still a
endpoint attached on the other side.

include/haproxy/stconn-t.h
src/stconn.c

index 1bb137075e8ab32850345c4b947cd163dd358cec..99b6e25bda8d546a26d467f8c28c3839a5907f8b 100644 (file)
@@ -25,6 +25,7 @@
 #include <haproxy/obj_type-t.h>
 #include <haproxy/connection-t.h>
 #include <haproxy/show_flags-t.h>
+#include <haproxy/xref-t.h>
 
 /* Stream Endpoint Flags.
  * Please also update the se_show_flags() function below in case of changes.
@@ -245,6 +246,7 @@ struct stconn;
  * <lra>    is the last read activity
  * <fsb>    is the first send blocked
  * <flags>  SE_FL_*
+ * <xref>   cross reference with the opposite SC
  *
  * <lra> should be updated when a read activity is detected. It can be a
  *       successful receive, when a shutr is reported or when receives are
@@ -260,6 +262,7 @@ struct sedesc {
        unsigned int flags;
        unsigned int lra;
        unsigned int fsb;
+       struct xref xref;
 };
 
 /* sc_app_ops describes the application layer's operations and notification
index 39dcbb5f0cea022d6d7075378fbaaef8790e0648..2339566d7dcf51888c048a90b9e04fcbeda9469b 100644 (file)
@@ -19,6 +19,7 @@
 #include <haproxy/pool.h>
 #include <haproxy/sc_strm.h>
 #include <haproxy/stconn.h>
+#include <haproxy/xref.h>
 
 DECLARE_POOL(pool_head_connstream, "stconn", sizeof(struct stconn));
 DECLARE_POOL(pool_head_sedesc, "sedesc", sizeof(struct sedesc));
@@ -94,6 +95,7 @@ void sedesc_init(struct sedesc *sedesc)
        sedesc->sc = NULL;
        sedesc->lra = TICK_ETERNITY;
        sedesc->fsb = TICK_ETERNITY;
+       sedesc->xref.peer = NULL;
        se_fl_setall(sedesc, SE_FL_NONE);
 }
 
@@ -271,6 +273,7 @@ int sc_attach_mux(struct stconn *sc, void *sd, void *ctx)
                }
 
                sc->app_ops = &sc_app_conn_ops;
+               xref_create(&sc->sedesc->xref, &sc_opposite(sc)->sedesc->xref);
        }
        else if (sc_check(sc)) {
                if (!sc->wait_event.tasklet) {
@@ -304,8 +307,10 @@ static void sc_attach_applet(struct stconn *sc, void *sd)
        sc->sedesc->se = sd;
        sc_ep_set(sc, SE_FL_T_APPLET);
        sc_ep_clr(sc, SE_FL_DETACHED);
-       if (sc_strm(sc))
+       if (sc_strm(sc)) {
                sc->app_ops = &sc_app_applet_ops;
+               xref_create(&sc->sedesc->xref, &sc_opposite(sc)->sedesc->xref);
+       }
 }
 
 /* Attaches a stconn to a app layer and sets the relevant
@@ -350,6 +355,15 @@ static void sc_detach_endp(struct stconn **scp)
        if (!sc)
                return;
 
+       if (sc->sedesc) {
+               struct xref *peer;
+
+               /* Remove my link in the original objects. */
+               peer = xref_get_peer_and_lock(&sc->sedesc->xref);
+               if (peer)
+                       xref_disconnect(&sc->sedesc->xref, peer);
+       }
+
        if (sc_ep_test(sc, SE_FL_T_MUX)) {
                struct connection *conn = __sc_conn(sc);
                struct sedesc *sedesc = sc->sedesc;