mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-29 18:10:23 +00:00
mgmtd: convert BE/FE adapter to use allocated connections
Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
99564edc43
commit
6dad9b53e7
@ -117,7 +117,7 @@ mgmt_be_find_adapter_by_fd(int conn_fd)
|
|||||||
struct mgmt_be_client_adapter *adapter;
|
struct mgmt_be_client_adapter *adapter;
|
||||||
|
|
||||||
FOREACH_ADAPTER_IN_LIST (adapter) {
|
FOREACH_ADAPTER_IN_LIST (adapter) {
|
||||||
if (adapter->conn.fd == conn_fd)
|
if (adapter->conn->fd == conn_fd)
|
||||||
return adapter;
|
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)
|
static int mgmt_be_adapter_notify_disconnect(struct msg_conn *conn)
|
||||||
{
|
{
|
||||||
struct mgmt_be_client_adapter *adapter =
|
struct mgmt_be_client_adapter *adapter = conn->user;
|
||||||
container_of(conn, struct mgmt_be_client_adapter, conn);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Notify about disconnect for appropriate cleanup
|
* 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(
|
MGMTD_BE_ADAPTER_DBG(
|
||||||
"Client '%s' (FD:%d) seems to have reconnected. Removing old connection (FD:%d)!",
|
"Client '%s' (FD:%d) seems to have reconnected. Removing old connection (FD:%d)!",
|
||||||
adapter->name, adapter->conn.fd, old->conn.fd);
|
adapter->name, adapter->conn->fd,
|
||||||
msg_conn_disconnect(&old->conn, false);
|
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(
|
MGMTD_BE_ADAPTER_ERR(
|
||||||
"Unable to resolve adapter '%s' to a valid ID. Disconnecting!",
|
"Unable to resolve adapter '%s' to a valid ID. Disconnecting!",
|
||||||
adapter->name);
|
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");
|
zlog_err("XXX different from original code");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -487,7 +489,7 @@ static int mgmt_be_adapter_send_msg(struct mgmt_be_client_adapter *adapter,
|
|||||||
Mgmtd__BeMessage *be_msg)
|
Mgmtd__BeMessage *be_msg)
|
||||||
{
|
{
|
||||||
return msg_conn_send_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),
|
mgmtd__be_message__get_packed_size(be_msg),
|
||||||
(size_t(*)(void *, void *))mgmtd__be_message__pack);
|
(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,
|
static void mgmt_be_adapter_process_msg(uint8_t version, uint8_t *data,
|
||||||
size_t len, struct msg_conn *conn)
|
size_t len, struct msg_conn *conn)
|
||||||
{
|
{
|
||||||
struct mgmt_be_client_adapter *adapter;
|
struct mgmt_be_client_adapter *adapter = conn->user;
|
||||||
Mgmtd__BeMessage *be_msg;
|
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) {
|
if (!be_msg) {
|
||||||
MGMTD_BE_ADAPTER_DBG(
|
MGMTD_BE_ADAPTER_DBG(
|
||||||
"Failed to decode %zu bytes for adapter: %s", len,
|
"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;
|
struct mgmt_be_client_adapter *adapter;
|
||||||
|
|
||||||
adapter = (struct mgmt_be_client_adapter *)EVENT_ARG(thread);
|
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
|
* 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) {
|
if (mgmt_txn_notify_be_adapter_conn(adapter, true) != 0) {
|
||||||
zlog_err("XXX notify be adapter conn fail");
|
zlog_err("XXX notify be adapter conn fail");
|
||||||
msg_conn_disconnect(&adapter->conn, false);
|
msg_conn_disconnect(adapter->conn, false);
|
||||||
adapter = NULL;
|
adapter = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -667,7 +667,7 @@ extern void mgmt_be_adapter_unlock(struct mgmt_be_client_adapter **adapter)
|
|||||||
if (!--a->refcount) {
|
if (!--a->refcount) {
|
||||||
mgmt_be_adapters_del(&mgmt_be_adapters, a);
|
mgmt_be_adapters_del(&mgmt_be_adapters, a);
|
||||||
EVENT_OFF(a->conn_init_ev);
|
EVENT_OFF(a->conn_init_ev);
|
||||||
msg_conn_cleanup(&a->conn);
|
msg_server_conn_delete(a->conn);
|
||||||
XFREE(MTYPE_MGMTD_BE_ADPATER, a);
|
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);
|
mgmt_be_adapters_add_tail(&mgmt_be_adapters, adapter);
|
||||||
RB_INIT(nb_config_cbs, &adapter->cfg_chgs);
|
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_notify_disconnect,
|
||||||
mgmt_be_adapter_process_msg,
|
mgmt_be_adapter_process_msg,
|
||||||
MGMTD_BE_MAX_NUM_MSG_PROC,
|
MGMTD_BE_MAX_NUM_MSG_PROC,
|
||||||
@ -878,17 +878,17 @@ void mgmt_be_adapter_status_write(struct vty *vty)
|
|||||||
|
|
||||||
FOREACH_ADAPTER_IN_LIST (adapter) {
|
FOREACH_ADAPTER_IN_LIST (adapter) {
|
||||||
vty_out(vty, " Client: \t\t\t%s\n", adapter->name);
|
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, " Client-Id: \t\t\t%d\n", adapter->id);
|
||||||
vty_out(vty, " Ref-Count: \t\t\t%u\n", adapter->refcount);
|
vty_out(vty, " Ref-Count: \t\t\t%u\n", adapter->refcount);
|
||||||
vty_out(vty, " Msg-Recvd: \t\t\t%" PRIu64 "\n",
|
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",
|
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",
|
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",
|
vty_out(vty, " Bytes-Sent: \t\t%" PRIu64 "\n",
|
||||||
adapter->mstate.ntxb);
|
adapter->conn->mstate.ntxb);
|
||||||
}
|
}
|
||||||
vty_out(vty, " Total: %d\n",
|
vty_out(vty, " Total: %d\n",
|
||||||
(int)mgmt_be_adapters_count(&mgmt_be_adapters));
|
(int)mgmt_be_adapters_count(&mgmt_be_adapters));
|
||||||
|
@ -42,8 +42,7 @@ PREDECL_LIST(mgmt_be_adapters);
|
|||||||
PREDECL_LIST(mgmt_txn_badapters);
|
PREDECL_LIST(mgmt_txn_badapters);
|
||||||
|
|
||||||
struct mgmt_be_client_adapter {
|
struct mgmt_be_client_adapter {
|
||||||
struct msg_conn conn;
|
struct msg_conn *conn;
|
||||||
struct mgmt_msg_state mstate;
|
|
||||||
|
|
||||||
struct event *conn_init_ev;
|
struct event *conn_init_ev;
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ static int mgmt_fe_adapter_send_msg(struct mgmt_fe_client_adapter *adapter,
|
|||||||
Mgmtd__FeMessage *fe_msg)
|
Mgmtd__FeMessage *fe_msg)
|
||||||
{
|
{
|
||||||
return msg_conn_send_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),
|
mgmtd__fe_message__get_packed_size(fe_msg),
|
||||||
(size_t(*)(void *, void *))mgmtd__fe_message__pack);
|
(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;
|
struct mgmt_fe_client_adapter *adapter;
|
||||||
|
|
||||||
FOREACH_ADAPTER_IN_LIST (adapter) {
|
FOREACH_ADAPTER_IN_LIST (adapter) {
|
||||||
if (adapter->conn.fd == conn_fd)
|
if (adapter->conn->fd == conn_fd)
|
||||||
return adapter;
|
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)
|
static int mgmt_fe_adapter_notify_disconnect(struct msg_conn *conn)
|
||||||
{
|
{
|
||||||
struct mgmt_fe_client_adapter *adapter;
|
struct mgmt_fe_client_adapter *adapter = conn->user;
|
||||||
|
|
||||||
adapter = container_of(conn, struct mgmt_fe_client_adapter, conn);
|
|
||||||
|
|
||||||
/* TODO: notify about client disconnect for appropriate cleanup */
|
/* TODO: notify about client disconnect for appropriate cleanup */
|
||||||
mgmt_fe_cleanup_sessions(adapter);
|
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(
|
MGMTD_FE_ADAPTER_DBG(
|
||||||
"Client '%s' (FD:%d) seems to have reconnected. Removing old connection (FD:%d)!",
|
"Client '%s' (FD:%d) seems to have reconnected. Removing old connection (FD:%d)!",
|
||||||
adapter->name, adapter->conn.fd, old->conn.fd);
|
adapter->name, adapter->conn->fd,
|
||||||
msg_conn_disconnect(&old->conn, false);
|
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,
|
static void mgmt_fe_adapter_process_msg(uint8_t version, uint8_t *data,
|
||||||
size_t len, struct msg_conn *conn)
|
size_t len, struct msg_conn *conn)
|
||||||
{
|
{
|
||||||
struct mgmt_fe_client_adapter *adapter;
|
struct mgmt_fe_client_adapter *adapter = conn->user;
|
||||||
Mgmtd__FeMessage *fe_msg;
|
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) {
|
if (!fe_msg) {
|
||||||
MGMTD_FE_ADAPTER_DBG(
|
MGMTD_FE_ADAPTER_DBG(
|
||||||
"Failed to decode %zu bytes for adapter: %s", len,
|
"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) {
|
if (!--a->refcount) {
|
||||||
mgmt_fe_adapters_del(&mgmt_fe_adapters, a);
|
mgmt_fe_adapters_del(&mgmt_fe_adapters, a);
|
||||||
msg_conn_cleanup(&a->conn);
|
msg_server_conn_delete(a->conn);
|
||||||
XFREE(MTYPE_MGMTD_BE_ADPATER, a);
|
XFREE(MTYPE_MGMTD_FE_ADPATER, a);
|
||||||
}
|
}
|
||||||
*adapter = NULL;
|
*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_adapter_lock(adapter);
|
||||||
mgmt_fe_adapters_add_tail(&mgmt_fe_adapters, adapter);
|
mgmt_fe_adapters_add_tail(&mgmt_fe_adapters, adapter);
|
||||||
|
|
||||||
msg_conn_accept_init(&adapter->conn, mgmt_loop, conn_fd,
|
adapter->conn = msg_server_conn_create(
|
||||||
mgmt_fe_adapter_notify_disconnect,
|
mgmt_loop, conn_fd, mgmt_fe_adapter_notify_disconnect,
|
||||||
mgmt_fe_adapter_process_msg,
|
mgmt_fe_adapter_process_msg, MGMTD_FE_MAX_NUM_MSG_PROC,
|
||||||
MGMTD_FE_MAX_NUM_MSG_PROC,
|
MGMTD_FE_MAX_NUM_MSG_WRITE, MGMTD_FE_MSG_MAX_LEN,
|
||||||
MGMTD_FE_MAX_NUM_MSG_WRITE,
|
adapter, "FE-adapter");
|
||||||
MGMTD_FE_MSG_MAX_LEN, "FE-adapter");
|
|
||||||
|
|
||||||
adapter->setcfg_stats.min_tm = ULONG_MAX;
|
adapter->setcfg_stats.min_tm = ULONG_MAX;
|
||||||
adapter->cmt_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) {
|
FOREACH_ADAPTER_IN_LIST (adapter) {
|
||||||
vty_out(vty, " Client: \t\t\t\t%s\n", adapter->name);
|
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) {
|
if (detail) {
|
||||||
mgmt_fe_adapter_setcfg_stats_write(vty, adapter);
|
mgmt_fe_adapter_setcfg_stats_write(vty, adapter);
|
||||||
mgmt_fe_adapter_cmt_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",
|
vty_out(vty, " Total-Sessions: \t\t\t%d\n",
|
||||||
(int)mgmt_fe_sessions_count(&adapter->fe_sessions));
|
(int)mgmt_fe_sessions_count(&adapter->fe_sessions));
|
||||||
vty_out(vty, " Msg-Recvd: \t\t\t\t%" PRIu64 "\n",
|
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",
|
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",
|
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",
|
vty_out(vty, " Bytes-Sent: \t\t\t%" PRIu64 "\n",
|
||||||
adapter->conn.mstate.ntxb);
|
adapter->conn->mstate.ntxb);
|
||||||
}
|
}
|
||||||
vty_out(vty, " Total: %d\n",
|
vty_out(vty, " Total: %d\n",
|
||||||
(int)mgmt_fe_adapters_count(&mgmt_fe_adapters));
|
(int)mgmt_fe_adapters_count(&mgmt_fe_adapters));
|
||||||
|
@ -55,7 +55,7 @@ PREDECL_LIST(mgmt_fe_sessions);
|
|||||||
PREDECL_LIST(mgmt_fe_adapters);
|
PREDECL_LIST(mgmt_fe_adapters);
|
||||||
|
|
||||||
struct mgmt_fe_client_adapter {
|
struct mgmt_fe_client_adapter {
|
||||||
struct msg_conn conn;
|
struct msg_conn *conn;
|
||||||
char name[MGMTD_CLIENT_NAME_MAX_LEN];
|
char name[MGMTD_CLIENT_NAME_MAX_LEN];
|
||||||
|
|
||||||
/* List of sessions created and being maintained for this client. */
|
/* List of sessions created and being maintained for this client. */
|
||||||
|
Loading…
Reference in New Issue
Block a user