diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/mgmt_fe_client.c | 19 | ||||
| -rw-r--r-- | lib/mgmt_fe_client.h | 11 | ||||
| -rw-r--r-- | lib/mgmt_msg_native.c | 1 | ||||
| -rw-r--r-- | lib/mgmt_msg_native.h | 28 | ||||
| -rw-r--r-- | lib/northbound_oper.c | 12 | ||||
| -rw-r--r-- | lib/vty.c | 15 | ||||
| -rw-r--r-- | lib/vty.h | 4 | ||||
| -rw-r--r-- | lib/yang.c | 27 |
8 files changed, 82 insertions, 35 deletions
diff --git a/lib/mgmt_fe_client.c b/lib/mgmt_fe_client.c index 0bea663004..57ac071ecf 100644 --- a/lib/mgmt_fe_client.c +++ b/lib/mgmt_fe_client.c @@ -306,25 +306,26 @@ int mgmt_fe_send_regnotify_req(struct mgmt_fe_client *client, } /* - * Send get-tree request. + * Send get-data request. */ -int mgmt_fe_send_get_tree_req(struct mgmt_fe_client *client, - uint64_t session_id, uint64_t req_id, - LYD_FORMAT result_type, const char *xpath) +int mgmt_fe_send_get_data_req(struct mgmt_fe_client *client, uint64_t session_id, + uint64_t req_id, LYD_FORMAT result_type, + uint8_t flags, const char *xpath) { - struct mgmt_msg_get_tree *msg; + struct mgmt_msg_get_data *msg; size_t xplen = strlen(xpath); int ret; - msg = mgmt_msg_native_alloc_msg(struct mgmt_msg_get_tree, xplen + 1, - MTYPE_MSG_NATIVE_GET_TREE); + msg = mgmt_msg_native_alloc_msg(struct mgmt_msg_get_data, xplen + 1, + MTYPE_MSG_NATIVE_GET_DATA); msg->refer_id = session_id; msg->req_id = req_id; - msg->code = MGMT_MSG_CODE_GET_TREE; + msg->code = MGMT_MSG_CODE_GET_DATA; msg->result_type = result_type; + msg->flags = flags; strlcpy(msg->xpath, xpath, xplen + 1); - MGMTD_FE_CLIENT_DBG("Sending GET_TREE_REQ session-id %" PRIu64 + MGMTD_FE_CLIENT_DBG("Sending GET_DATA_REQ session-id %" PRIu64 " req-id %" PRIu64 " xpath: %s", session_id, req_id, xpath); diff --git a/lib/mgmt_fe_client.h b/lib/mgmt_fe_client.h index f3292d18fd..3abe29b1cf 100644 --- a/lib/mgmt_fe_client.h +++ b/lib/mgmt_fe_client.h @@ -15,6 +15,7 @@ extern "C" { #include "mgmt_pb.h" #include "frrevent.h" #include "mgmt_defines.h" +#include "mgmt_msg_native.h" /*************************************************************** * Macros @@ -367,7 +368,7 @@ extern int mgmt_fe_send_regnotify_req(struct mgmt_fe_client *client, int num_reqs); /* - * Send GET-TREE to MGMTD daemon. + * Send GET-DATA to MGMTD daemon. * * client * Client object. @@ -381,15 +382,19 @@ extern int mgmt_fe_send_regnotify_req(struct mgmt_fe_client *client, * result_type * The LYD_FORMAT of the result. * + * flags + * Flags to control the behavior of the request. + * * xpath * the xpath to get. * * Returns: * 0 on success, otherwise msg_conn_send_msg() return values. */ -extern int mgmt_fe_send_get_tree_req(struct mgmt_fe_client *client, +extern int mgmt_fe_send_get_data_req(struct mgmt_fe_client *client, uint64_t session_id, uint64_t req_id, - LYD_FORMAT result_type, const char *xpath); + LYD_FORMAT result_type, uint8_t flags, + const char *xpath); /* * Destroy library and cleanup everything. diff --git a/lib/mgmt_msg_native.c b/lib/mgmt_msg_native.c index b6dc126d49..a9b26718db 100644 --- a/lib/mgmt_msg_native.c +++ b/lib/mgmt_msg_native.c @@ -13,6 +13,7 @@ DEFINE_MTYPE(MSG_NATIVE, MSG_NATIVE_MSG, "native mgmt msg"); DEFINE_MTYPE(MSG_NATIVE, MSG_NATIVE_ERROR, "native error msg"); DEFINE_MTYPE(MSG_NATIVE, MSG_NATIVE_GET_TREE, "native get tree msg"); DEFINE_MTYPE(MSG_NATIVE, MSG_NATIVE_TREE_DATA, "native tree data msg"); +DEFINE_MTYPE(MSG_NATIVE, MSG_NATIVE_GET_DATA, "native get data msg"); int vmgmt_msg_native_send_error(struct msg_conn *conn, uint64_t sess_or_txn_id, uint64_t req_id, bool short_circuit_ok, diff --git a/lib/mgmt_msg_native.h b/lib/mgmt_msg_native.h index 3f6283025c..069cb9b150 100644 --- a/lib/mgmt_msg_native.h +++ b/lib/mgmt_msg_native.h @@ -142,6 +142,7 @@ DECLARE_MTYPE(MSG_NATIVE_MSG); DECLARE_MTYPE(MSG_NATIVE_ERROR); DECLARE_MTYPE(MSG_NATIVE_GET_TREE); DECLARE_MTYPE(MSG_NATIVE_TREE_DATA); +DECLARE_MTYPE(MSG_NATIVE_GET_DATA); /* * Native message codes @@ -149,6 +150,7 @@ DECLARE_MTYPE(MSG_NATIVE_TREE_DATA); #define MGMT_MSG_CODE_ERROR 0 #define MGMT_MSG_CODE_GET_TREE 1 #define MGMT_MSG_CODE_TREE_DATA 2 +#define MGMT_MSG_CODE_GET_DATA 3 /** * struct mgmt_msg_header - Header common to all native messages. @@ -193,7 +195,7 @@ _Static_assert(sizeof(struct mgmt_msg_error) == "Size mismatch"); /** - * struct mgmt_msg_get_tree - Message carrying xpath query request. + * struct mgmt_msg_get_tree - backend oper data request. * * @result_type: ``LYD_FORMAT`` for the returned result. * @xpath: the query for the data to return. @@ -231,6 +233,30 @@ _Static_assert(sizeof(struct mgmt_msg_tree_data) == offsetof(struct mgmt_msg_tree_data, result), "Size mismatch"); +/* Flags for get-data request */ +#define GET_DATA_FLAG_STATE 0x01 /* get only "config false" data */ +#define GET_DATA_FLAG_CONFIG 0x02 /* get only "config true" data */ +#define GET_DATA_FLAG_EXACT 0x04 /* get exact data node instead of the full tree */ + +/** + * struct mgmt_msg_get_data - frontend get-data request. + * + * @result_type: ``LYD_FORMAT`` for the returned result. + * @flags: combination of ``GET_DATA_FLAG_*`` flags. + * @xpath: the query for the data to return. + */ +struct mgmt_msg_get_data { + struct mgmt_msg_header; + uint8_t result_type; + uint8_t flags; + uint8_t resv2[6]; + + alignas(8) char xpath[]; +}; +_Static_assert(sizeof(struct mgmt_msg_get_data) == + offsetof(struct mgmt_msg_get_data, xpath), + "Size mismatch"); + #define MGMT_MSG_VALIDATE_NUL_TERM(msgp, len) \ ((len) >= sizeof(*msg) + 1 && ((char *)msgp)[(len)-1] == 0) diff --git a/lib/northbound_oper.c b/lib/northbound_oper.c index afce773181..2394b5e865 100644 --- a/lib/northbound_oper.c +++ b/lib/northbound_oper.c @@ -515,8 +515,18 @@ static enum nb_error nb_op_ys_init_node_infos(struct nb_op_yield_state *ys) /* Move up to the container if on a leaf currently. */ if (node && - !CHECK_FLAG(node->schema->nodetype, LYS_CONTAINER | LYS_LIST)) + !CHECK_FLAG(node->schema->nodetype, LYS_CONTAINER | LYS_LIST)) { + struct lyd_node *leaf = node; + node = &node->parent->node; + + /* + * If the leaf is not a key, delete it, because it has a wrong + * empty value. + */ + if (!lysc_is_key(leaf->schema)) + lyd_free_tree(leaf); + } assert(!node || CHECK_FLAG(node->schema->nodetype, LYS_CONTAINER | LYS_LIST)); if (!node) @@ -4105,23 +4105,24 @@ int vty_mgmt_send_get_req(struct vty *vty, bool is_config, return 0; } -int vty_mgmt_send_get_tree_req(struct vty *vty, LYD_FORMAT result_type, - const char *xpath) +int vty_mgmt_send_get_data_req(struct vty *vty, LYD_FORMAT result_type, + uint8_t flags, const char *xpath) { LYD_FORMAT intern_format = result_type; vty->mgmt_req_id++; - if (mgmt_fe_send_get_tree_req(mgmt_fe_client, vty->mgmt_session_id, - vty->mgmt_req_id, intern_format, xpath)) { - zlog_err("Failed to send GET-TREE to MGMTD session-id: %" PRIu64 + if (mgmt_fe_send_get_data_req(mgmt_fe_client, vty->mgmt_session_id, + vty->mgmt_req_id, intern_format, flags, + xpath)) { + zlog_err("Failed to send GET-DATA to MGMTD session-id: %" PRIu64 " req-id %" PRIu64 ".", vty->mgmt_session_id, vty->mgmt_req_id); - vty_out(vty, "Failed to send GET-TREE to MGMTD!\n"); + vty_out(vty, "Failed to send GET-DATA to MGMTD!\n"); return -1; } - vty->mgmt_req_pending_cmd = "MESSAGE_GET_TREE_REQ"; + vty->mgmt_req_pending_cmd = "MESSAGE_GET_DATA_REQ"; vty->mgmt_req_pending_data = result_type; return 0; @@ -420,8 +420,8 @@ extern int vty_mgmt_send_commit_config(struct vty *vty, bool validate_only, extern int vty_mgmt_send_get_req(struct vty *vty, bool is_config, Mgmtd__DatastoreId datastore, const char **xpath_list, int num_req); -extern int vty_mgmt_send_get_tree_req(struct vty *vty, LYD_FORMAT result_type, - const char *xpath); +extern int vty_mgmt_send_get_data_req(struct vty *vty, LYD_FORMAT result_type, + uint8_t flags, const char *xpath); extern int vty_mgmt_send_lockds_req(struct vty *vty, Mgmtd__DatastoreId ds_id, bool lock, bool scok); extern void vty_mgmt_resume_response(struct vty *vty, int ret); diff --git a/lib/yang.c b/lib/yang.c index 5b177f7fbc..7d35fb0d3d 100644 --- a/lib/yang.c +++ b/lib/yang.c @@ -1089,7 +1089,7 @@ LY_ERR yang_lyd_trim_xpath(struct lyd_node **root, const char *xpath) } return LY_SUCCESS; #else - struct lyd_node *node; + struct lyd_node *node, *sib; struct lyd_node **remove = NULL; struct ly_set *set = NULL; uint32_t i; @@ -1123,18 +1123,21 @@ LY_ERR yang_lyd_trim_xpath(struct lyd_node **root, const char *xpath) } darr_ensure_cap(remove, 128); - LYD_TREE_DFS_BEGIN (*root, node) { - /* - * If this is a direct matching node then include it's subtree - * which won't be marked and would otherwise be removed. - */ - if (node->priv == (void *)2) - LYD_TREE_DFS_continue = 1; - else if (!node->priv) { - *darr_append(remove) = node; - LYD_TREE_DFS_continue = 1; + LY_LIST_FOR(*root, sib) { + LYD_TREE_DFS_BEGIN (sib, node) { + /* + * If this is a direct matching node then include its + * subtree which won't be marked and would otherwise + * be removed. + */ + if (node->priv == (void *)2) + LYD_TREE_DFS_continue = 1; + else if (!node->priv) { + *darr_append(remove) = node; + LYD_TREE_DFS_continue = 1; + } + LYD_TREE_DFS_END(sib, node); } - LYD_TREE_DFS_END(*root, node); } darr_foreach_i (remove, i) { if (remove[i] == *root) |
