]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: msg: make short-circuit connections guaranteed
authorChristian Hopps <chopps@labn.net>
Thu, 12 Oct 2023 12:34:20 +0000 (08:34 -0400)
committerChristian Hopps <chopps@labn.net>
Thu, 12 Oct 2023 14:25:30 +0000 (10:25 -0400)
When short circuiting is requested the caller can count on that
being the connection type they get.

Signed-off-by: Christian Hopps <chopps@labn.net>
lib/mgmt_msg.c
lib/mgmt_msg.h

index ee5c1008bd0c8431c1f1d479ed1e61c2979d8373..70332bd5f3deea1b1c7bc178a96d61ef93543333 100644 (file)
@@ -634,7 +634,7 @@ static void msg_client_sched_connect(struct msg_client *client,
                                &client->conn_retry_tmr);
 }
 
-static bool msg_client_connect_short_circuit(struct msg_client *client)
+static int msg_client_connect_short_circuit(struct msg_client *client)
 {
        struct msg_conn *server_conn;
        struct msg_server *server;
@@ -648,10 +648,9 @@ static bool msg_client_connect_short_circuit(struct msg_client *client)
                        break;
        if (!server) {
                MGMT_MSG_DBG(dbgtag,
-                            "no short-circuit connection available for %s",
+                            "no short-circuit server available yet for %s",
                             client->sopath);
-
-               return false;
+               return -1;
        }
 
        if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)) {
@@ -659,7 +658,7 @@ static bool msg_client_connect_short_circuit(struct msg_client *client)
                        &client->conn.mstate,
                        "socketpair failed trying to short-circuit connection on %s: %s",
                        client->sopath, safe_strerror(errno));
-               return false;
+               return -1;
        }
 
        /* client side */
@@ -687,7 +686,7 @@ static bool msg_client_connect_short_circuit(struct msg_client *client)
                client->sopath, client->conn.mstate.idtag, client->conn.fd,
                server_conn->mstate.idtag, server_conn->fd);
 
-       return true;
+       return 0;
 }
 
 
@@ -697,11 +696,12 @@ static void msg_client_connect(struct msg_client *client)
        struct msg_conn *conn = &client->conn;
        const char *dbgtag = conn->debug ? conn->mstate.idtag : NULL;
 
-       if (!client->short_circuit_ok ||
-           !msg_client_connect_short_circuit(client))
+       if (!client->short_circuit_ok)
                conn->fd =
                        mgmt_msg_connect(client->sopath, MSG_CONN_SEND_BUF_SIZE,
                                         MSG_CONN_RECV_BUF_SIZE, dbgtag);
+       else if (msg_client_connect_short_circuit(client))
+               conn->fd = -1;
 
        if (conn->fd == -1)
                /* retry the connection */
@@ -741,7 +741,6 @@ void msg_client_init(struct msg_client *client, struct event_loop *tm,
        mgmt_msg_init(&conn->mstate, max_read_buf, max_write_buf, max_msg_sz,
                      idtag);
 
-       /* XXX maybe just have client kick this off */
        /* Start trying to connect to server */
        msg_client_sched_connect(client, 0);
 }
index dd7ae59f9162fb5de87d76c40292cc9f00af72b3..3195d4a7fb07cb7500261f5e623db1e19ec5f95f 100644 (file)
@@ -136,6 +136,10 @@ struct msg_client {
 extern void msg_client_cleanup(struct msg_client *client);
 
 /*
+ * If `short_circuit_ok` is true, then the client-server connection will use a
+ * socketpair() rather than a unix-domain socket. This must be passed true if
+ * you wish to send messages short-circuit later.
+ *
  * `notify_disconnect` is not called when the user `msg_client_cleanup` is
  * called for a client which is currently connected. The socket is closed
  * but there is no notification.