]> git.proxmox.com Git - mirror_frr.git/commitdiff
mgmtd: convert BE/FE adapter to use allocated connections
authorChristian Hopps <chopps@labn.net>
Mon, 1 May 2023 19:24:29 +0000 (15:24 -0400)
committerChristian Hopps <chopps@labn.net>
Sun, 28 May 2023 09:13:22 +0000 (05:13 -0400)
Signed-off-by: Christian Hopps <chopps@labn.net>
mgmtd/mgmt_be_adapter.c
mgmtd/mgmt_be_adapter.h
mgmtd/mgmt_fe_adapter.c
mgmtd/mgmt_fe_adapter.h

index 3a67733ce8c0d27e1cd4251ffc36430d69d397b2..89a2d856897f5412b969022e0f9df9d74b3dd0d7 100644 (file)
@@ -117,7 +117,7 @@ mgmt_be_find_adapter_by_fd(int conn_fd)
        struct mgmt_be_client_adapter *adapter;
 
        FOREACH_ADAPTER_IN_LIST (adapter) {
-               if (adapter->conn.fd == conn_fd)
+               if (adapter->conn->fd == conn_fd)
                        return adapter;
        }
 
@@ -314,8 +314,7 @@ static int mgmt_be_eval_regexp_match(const char *xpath_regexp,
 
 static int mgmt_be_adapter_notify_disconnect(struct msg_conn *conn)
 {
-       struct mgmt_be_client_adapter *adapter =
-               container_of(conn, struct mgmt_be_client_adapter, conn);
+       struct mgmt_be_client_adapter *adapter = conn->user;
 
        /*
         * Notify about disconnect for appropriate cleanup
@@ -348,8 +347,10 @@ mgmt_be_adapter_cleanup_old_conn(struct mgmt_be_client_adapter *adapter)
                         */
                        MGMTD_BE_ADAPTER_DBG(
                                "Client '%s' (FD:%d) seems to have reconnected. Removing old connection (FD:%d)!",
-                               adapter->name, adapter->conn.fd, old->conn.fd);
-                       msg_conn_disconnect(&old->conn, false);
+                               adapter->name, adapter->conn->fd,
+                               old->conn->fd);
+                       /* this will/should delete old */
+                       msg_conn_disconnect(old->conn, false);
                }
        }
 }
@@ -381,7 +382,8 @@ mgmt_be_adapter_handle_msg(struct mgmt_be_client_adapter *adapter,
                                MGMTD_BE_ADAPTER_ERR(
                                        "Unable to resolve adapter '%s' to a valid ID. Disconnecting!",
                                        adapter->name);
-                               msg_conn_disconnect(&adapter->conn, false);
+                               /* this will/should delete old */
+                               msg_conn_disconnect(adapter->conn, false);
                                zlog_err("XXX different from original code");
                                break;
                        }
@@ -487,7 +489,7 @@ static int mgmt_be_adapter_send_msg(struct mgmt_be_client_adapter *adapter,
                                    Mgmtd__BeMessage *be_msg)
 {
        return msg_conn_send_msg(
-               &adapter->conn, MGMT_MSG_VERSION_PROTOBUF, be_msg,
+               adapter->conn, MGMT_MSG_VERSION_PROTOBUF, be_msg,
                mgmtd__be_message__get_packed_size(be_msg),
                (size_t(*)(void *, void *))mgmtd__be_message__pack);
 }
@@ -564,11 +566,9 @@ static int mgmt_be_send_cfgapply_req(struct mgmt_be_client_adapter *adapter,
 static void mgmt_be_adapter_process_msg(uint8_t version, uint8_t *data,
                                        size_t len, struct msg_conn *conn)
 {
-       struct mgmt_be_client_adapter *adapter;
-       Mgmtd__BeMessage *be_msg;
+       struct mgmt_be_client_adapter *adapter = conn->user;
+       Mgmtd__BeMessage *be_msg = mgmtd__be_message__unpack(NULL, len, data);
 
-       adapter = container_of(conn, struct mgmt_be_client_adapter, conn);
-       be_msg = mgmtd__be_message__unpack(NULL, len, data);
        if (!be_msg) {
                MGMTD_BE_ADAPTER_DBG(
                        "Failed to decode %zu bytes for adapter: %s", len,
@@ -616,7 +616,7 @@ static void mgmt_be_adapter_conn_init(struct event *thread)
        struct mgmt_be_client_adapter *adapter;
 
        adapter = (struct mgmt_be_client_adapter *)EVENT_ARG(thread);
-       assert(adapter && adapter->conn.fd >= 0);
+       assert(adapter && adapter->conn->fd >= 0);
 
        /*
         * Check first if the current session can run a CONFIG
@@ -638,7 +638,7 @@ static void mgmt_be_adapter_conn_init(struct event *thread)
         */
        if (mgmt_txn_notify_be_adapter_conn(adapter, true) != 0) {
                zlog_err("XXX notify be adapter conn fail");
-               msg_conn_disconnect(&adapter->conn, false);
+               msg_conn_disconnect(adapter->conn, false);
                adapter = NULL;
        }
 }
@@ -667,7 +667,7 @@ extern void mgmt_be_adapter_unlock(struct mgmt_be_client_adapter **adapter)
        if (!--a->refcount) {
                mgmt_be_adapters_del(&mgmt_be_adapters, a);
                EVENT_OFF(a->conn_init_ev);
-               msg_conn_cleanup(&a->conn);
+               msg_server_conn_delete(a->conn);
                XFREE(MTYPE_MGMTD_BE_ADPATER, a);
        }
 
@@ -725,7 +725,7 @@ struct msg_conn *mgmt_be_create_adapter(int conn_fd, union sockunion *from)
                mgmt_be_adapters_add_tail(&mgmt_be_adapters, adapter);
                RB_INIT(nb_config_cbs, &adapter->cfg_chgs);
 
-               msg_conn_accept_init(&adapter->conn, mgmt_loop, conn_fd,
+               msg_conn_accept_init(adapter->conn, mgmt_loop, conn_fd,
                                     mgmt_be_adapter_notify_disconnect,
                                     mgmt_be_adapter_process_msg,
                                     MGMTD_BE_MAX_NUM_MSG_PROC,
@@ -878,17 +878,17 @@ void mgmt_be_adapter_status_write(struct vty *vty)
 
        FOREACH_ADAPTER_IN_LIST (adapter) {
                vty_out(vty, "  Client: \t\t\t%s\n", adapter->name);
-               vty_out(vty, "    Conn-FD: \t\t\t%d\n", adapter->conn.fd);
+               vty_out(vty, "    Conn-FD: \t\t\t%d\n", adapter->conn->fd);
                vty_out(vty, "    Client-Id: \t\t\t%d\n", adapter->id);
                vty_out(vty, "    Ref-Count: \t\t\t%u\n", adapter->refcount);
                vty_out(vty, "    Msg-Recvd: \t\t\t%" PRIu64 "\n",
-                       adapter->mstate.nrxm);
+                       adapter->conn->mstate.nrxm);
                vty_out(vty, "    Bytes-Recvd: \t\t%" PRIu64 "\n",
-                       adapter->mstate.nrxb);
+                       adapter->conn->mstate.nrxb);
                vty_out(vty, "    Msg-Sent: \t\t\t%" PRIu64 "\n",
-                       adapter->mstate.ntxm);
+                       adapter->conn->mstate.ntxm);
                vty_out(vty, "    Bytes-Sent: \t\t%" PRIu64 "\n",
-                       adapter->mstate.ntxb);
+                       adapter->conn->mstate.ntxb);
        }
        vty_out(vty, "  Total: %d\n",
                (int)mgmt_be_adapters_count(&mgmt_be_adapters));
index aebb0533d19d6f257f997e7e925845522da043d2..65e5b3f6f2a3f3daedea6e38e4e19dfdf504cffa 100644 (file)
@@ -42,8 +42,7 @@ PREDECL_LIST(mgmt_be_adapters);
 PREDECL_LIST(mgmt_txn_badapters);
 
 struct mgmt_be_client_adapter {
-       struct msg_conn conn;
-       struct mgmt_msg_state mstate;
+       struct msg_conn *conn;
 
        struct event *conn_init_ev;
 
index fb65c1168eb688dabe0b7c493310a9a6eaa24df0..b55bee0e976ed386eac5d41e981f3e1b264a9f6a 100644 (file)
@@ -351,7 +351,7 @@ static int mgmt_fe_adapter_send_msg(struct mgmt_fe_client_adapter *adapter,
                                    Mgmtd__FeMessage *fe_msg)
 {
        return msg_conn_send_msg(
-               &adapter->conn, MGMT_MSG_VERSION_PROTOBUF, fe_msg,
+               adapter->conn, MGMT_MSG_VERSION_PROTOBUF, fe_msg,
                mgmtd__fe_message__get_packed_size(fe_msg),
                (size_t(*)(void *, void *))mgmtd__fe_message__pack);
 }
@@ -625,7 +625,7 @@ mgmt_fe_find_adapter_by_fd(int conn_fd)
        struct mgmt_fe_client_adapter *adapter;
 
        FOREACH_ADAPTER_IN_LIST (adapter) {
-               if (adapter->conn.fd == conn_fd)
+               if (adapter->conn->fd == conn_fd)
                        return adapter;
        }
 
@@ -648,9 +648,7 @@ mgmt_fe_find_adapter_by_name(const char *name)
 
 static int mgmt_fe_adapter_notify_disconnect(struct msg_conn *conn)
 {
-       struct mgmt_fe_client_adapter *adapter;
-
-       adapter = container_of(conn, struct mgmt_fe_client_adapter, conn);
+       struct mgmt_fe_client_adapter *adapter = conn->user;
 
        /* TODO: notify about client disconnect for appropriate cleanup */
        mgmt_fe_cleanup_sessions(adapter);
@@ -678,8 +676,9 @@ mgmt_fe_adapter_cleanup_old_conn(struct mgmt_fe_client_adapter *adapter)
                         */
                        MGMTD_FE_ADAPTER_DBG(
                                "Client '%s' (FD:%d) seems to have reconnected. Removing old connection (FD:%d)!",
-                               adapter->name, adapter->conn.fd, old->conn.fd);
-                       msg_conn_disconnect(&old->conn, false);
+                               adapter->name, adapter->conn->fd,
+                               old->conn->fd);
+                       msg_conn_disconnect(old->conn, false);
                }
        }
 }
@@ -1366,11 +1365,9 @@ mgmt_fe_adapter_handle_msg(struct mgmt_fe_client_adapter *adapter,
 static void mgmt_fe_adapter_process_msg(uint8_t version, uint8_t *data,
                                        size_t len, struct msg_conn *conn)
 {
-       struct mgmt_fe_client_adapter *adapter;
-       Mgmtd__FeMessage *fe_msg;
+       struct mgmt_fe_client_adapter *adapter = conn->user;
+       Mgmtd__FeMessage *fe_msg = mgmtd__fe_message__unpack(NULL, len, data);
 
-       adapter = container_of(conn, struct mgmt_fe_client_adapter, conn);
-       fe_msg = mgmtd__fe_message__unpack(NULL, len, data);
        if (!fe_msg) {
                MGMTD_FE_ADAPTER_DBG(
                        "Failed to decode %zu bytes for adapter: %s", len,
@@ -1397,8 +1394,8 @@ mgmt_fe_adapter_unlock(struct mgmt_fe_client_adapter **adapter)
 
        if (!--a->refcount) {
                mgmt_fe_adapters_del(&mgmt_fe_adapters, a);
-               msg_conn_cleanup(&a->conn);
-               XFREE(MTYPE_MGMTD_BE_ADPATER, a);
+               msg_server_conn_delete(a->conn);
+               XFREE(MTYPE_MGMTD_FE_ADPATER, a);
        }
        *adapter = NULL;
 }
@@ -1454,12 +1451,11 @@ struct msg_conn *mgmt_fe_create_adapter(int conn_fd, union sockunion *from)
                mgmt_fe_adapter_lock(adapter);
                mgmt_fe_adapters_add_tail(&mgmt_fe_adapters, adapter);
 
-               msg_conn_accept_init(&adapter->conn, mgmt_loop, conn_fd,
-                                    mgmt_fe_adapter_notify_disconnect,
-                                    mgmt_fe_adapter_process_msg,
-                                    MGMTD_FE_MAX_NUM_MSG_PROC,
-                                    MGMTD_FE_MAX_NUM_MSG_WRITE,
-                                    MGMTD_FE_MSG_MAX_LEN, "FE-adapter");
+               adapter->conn = msg_server_conn_create(
+                       mgmt_loop, conn_fd, mgmt_fe_adapter_notify_disconnect,
+                       mgmt_fe_adapter_process_msg, MGMTD_FE_MAX_NUM_MSG_PROC,
+                       MGMTD_FE_MAX_NUM_MSG_WRITE, MGMTD_FE_MSG_MAX_LEN,
+                       adapter, "FE-adapter");
 
                adapter->setcfg_stats.min_tm = ULONG_MAX;
                adapter->cmt_stats.min_tm = ULONG_MAX;
@@ -1702,7 +1698,7 @@ void mgmt_fe_adapter_status_write(struct vty *vty, bool detail)
 
        FOREACH_ADAPTER_IN_LIST (adapter) {
                vty_out(vty, "  Client: \t\t\t\t%s\n", adapter->name);
-               vty_out(vty, "    Conn-FD: \t\t\t\t%d\n", adapter->conn.fd);
+               vty_out(vty, "    Conn-FD: \t\t\t\t%d\n", adapter->conn->fd);
                if (detail) {
                        mgmt_fe_adapter_setcfg_stats_write(vty, adapter);
                        mgmt_fe_adapter_cmt_stats_write(vty, adapter);
@@ -1736,13 +1732,13 @@ void mgmt_fe_adapter_status_write(struct vty *vty, bool detail)
                vty_out(vty, "    Total-Sessions: \t\t\t%d\n",
                        (int)mgmt_fe_sessions_count(&adapter->fe_sessions));
                vty_out(vty, "    Msg-Recvd: \t\t\t\t%" PRIu64 "\n",
-                       adapter->conn.mstate.nrxm);
+                       adapter->conn->mstate.nrxm);
                vty_out(vty, "    Bytes-Recvd: \t\t\t%" PRIu64 "\n",
-                       adapter->conn.mstate.nrxb);
+                       adapter->conn->mstate.nrxb);
                vty_out(vty, "    Msg-Sent: \t\t\t\t%" PRIu64 "\n",
-                       adapter->conn.mstate.ntxm);
+                       adapter->conn->mstate.ntxm);
                vty_out(vty, "    Bytes-Sent: \t\t\t%" PRIu64 "\n",
-                       adapter->conn.mstate.ntxb);
+                       adapter->conn->mstate.ntxb);
        }
        vty_out(vty, "  Total: %d\n",
                (int)mgmt_fe_adapters_count(&mgmt_fe_adapters));
index 8d53389a66d15ff6109028523800ec10ac3cac99..fef205f36a9ebb264ad91325a5134d6487a5496f 100644 (file)
@@ -55,7 +55,7 @@ PREDECL_LIST(mgmt_fe_sessions);
 PREDECL_LIST(mgmt_fe_adapters);
 
 struct mgmt_fe_client_adapter {
-       struct msg_conn conn;
+       struct msg_conn *conn;
        char name[MGMTD_CLIENT_NAME_MAX_LEN];
 
        /* List of sessions created and being maintained for this client. */