summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/mgmt_fe_client.c19
-rw-r--r--lib/mgmt_fe_client.h11
-rw-r--r--lib/mgmt_msg_native.c1
-rw-r--r--lib/mgmt_msg_native.h28
-rw-r--r--lib/northbound_oper.c12
-rw-r--r--lib/vty.c15
-rw-r--r--lib/vty.h4
-rw-r--r--lib/yang.c27
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)
diff --git a/lib/vty.c b/lib/vty.c
index 5f9f0dc243..3fc7c38083 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -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;
diff --git a/lib/vty.h b/lib/vty.h
index 5866eccde0..73e0d238ad 100644
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -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)