config->dnode = yang_dnode_new(ly_native_ctx, true);
config->version = 0;
- RB_INIT(nb_config_cbs, &config->cfg_chgs);
-
return config;
}
{
if (config->dnode)
yang_dnode_free(config->dnode);
- nb_config_diff_del_changes(&config->cfg_chgs);
+
XFREE(MTYPE_NB_CONFIG, config);
}
dup->dnode = yang_dnode_dup(config->dnode);
dup->version = config->version;
- RB_INIT(nb_config_cbs, &dup->cfg_chgs);
-
return dup;
}
return NB_OK;
}
-static void nb_update_candidate_changes(struct nb_config *candidate,
- struct nb_cfg_change *change,
- uint32_t *seq)
-{
- enum nb_operation oper = change->operation;
- char *xpath = change->xpath;
- struct lyd_node *root = NULL;
- struct lyd_node *dnode;
- struct nb_config_cbs *cfg_chgs = &candidate->cfg_chgs;
- int op;
-
- switch (oper) {
- case NB_OP_CREATE:
- case NB_OP_MODIFY:
- root = yang_dnode_get(candidate->dnode, xpath);
- break;
- case NB_OP_DESTROY:
- root = yang_dnode_get(running_config->dnode, xpath);
- /* code */
- break;
- case NB_OP_MOVE:
- case NB_OP_PRE_VALIDATE:
- case NB_OP_APPLY_FINISH:
- case NB_OP_GET_ELEM:
- case NB_OP_GET_NEXT:
- case NB_OP_GET_KEYS:
- case NB_OP_LOOKUP_ENTRY:
- case NB_OP_RPC:
- break;
- default:
- assert(!"non-enum value, invalid");
- }
-
- if (!root)
- return;
-
- LYD_TREE_DFS_BEGIN (root, dnode) {
- op = nb_lyd_diff_get_op(dnode);
- switch (op) {
- case 'c': /* create */
- nb_config_diff_created(dnode, seq, cfg_chgs);
- LYD_TREE_DFS_continue = 1;
- break;
- case 'd': /* delete */
- nb_config_diff_deleted(dnode, seq, cfg_chgs);
- LYD_TREE_DFS_continue = 1;
- break;
- case 'r': /* replace */
- nb_config_diff_add_change(cfg_chgs, NB_OP_MODIFY, seq,
- dnode);
- break;
- case 'n': /* none */
- default:
- break;
- }
- LYD_TREE_DFS_END(root, dnode);
- }
-}
-
static bool nb_is_operation_allowed(struct nb_node *nb_node,
struct nb_cfg_change *change)
{
size_t num_cfg_changes, const char *xpath_base, const char *curr_xpath,
int xpath_index, char *err_buf, int err_bufsize, bool *error)
{
- uint32_t seq = 0;
-
if (error)
*error = false;
*error = true;
continue;
}
- nb_update_candidate_changes(candidate_config, change, &seq);
}
if (error && *error) {
dst->root.dnode_root = yang_dnode_dup(src->root.dnode_root);
}
- if (src->ds_id == MGMTD_DS_CANDIDATE) {
- /*
- * Drop the changes in scratch-buffer.
- */
- MGMTD_DS_DBG("Emptying Candidate Scratch buffer!");
- nb_config_diff_del_changes(&src->root.cfg_root->cfg_chgs);
- }
-
return 0;
}
return ret;
}
- if (src->ds_id == MGMTD_DS_CANDIDATE) {
- /*
- * Drop the changes in scratch-buffer.
- */
- MGMTD_DS_DBG("Emptying Candidate Scratch buffer!");
- nb_config_diff_del_changes(&src->root.cfg_root->cfg_chgs);
- }
-
return 0;
}
goto mgmt_txn_prepare_config_done;
}
- /*
- * Check for diffs from scratch buffer. If found empty
- * get the diff from Candidate DS itself.
- */
- cfg_chgs = &nb_config->cfg_chgs;
- if (RB_EMPTY(nb_config_cbs, cfg_chgs)) {
- /*
- * This could be the case when the config is directly
- * loaded onto the candidate DS from a file. Get the
- * diff from a full comparison of the candidate and
- * running DSs.
- */
- nb_config_diff(mgmt_ds_get_nb_config(
- txn->commit_cfg_req->req.commit_cfg
- .dst_ds_ctx),
- nb_config, &changes);
- cfg_chgs = &changes;
- del_cfg_chgs = true;
- }
+ nb_config_diff(mgmt_ds_get_nb_config(txn->commit_cfg_req->req.commit_cfg
+ .dst_ds_ctx),
+ nb_config, &changes);
+ cfg_chgs = &changes;
+ del_cfg_chgs = true;
if (RB_EMPTY(nb_config_cbs, cfg_chgs)) {
/*