summaryrefslogtreecommitdiff
path: root/lib/northbound_sysrepo.c
diff options
context:
space:
mode:
authorChristian Hopps <chopps@labn.net>2023-10-30 05:09:19 -0400
committerChristian Hopps <chopps@labn.net>2023-12-28 17:52:57 +0000
commitad1ccb6e621b2050697e738457b1ac7a465dae71 (patch)
tree5e34071091dcb91acf503bcdb892f00f18fb2c8c /lib/northbound_sysrepo.c
parentb7db6b26753cbdec2fa22ed4ad7a85deedf67f7b (diff)
lib: northbound: add yielding and batching to oper-state queries
Signed-off-by: Christian Hopps <chopps@labn.net>
Diffstat (limited to 'lib/northbound_sysrepo.c')
-rw-r--r--lib/northbound_sysrepo.c37
1 files changed, 12 insertions, 25 deletions
diff --git a/lib/northbound_sysrepo.c b/lib/northbound_sysrepo.c
index ea5aa22b14..535c8b637e 100644
--- a/lib/northbound_sysrepo.c
+++ b/lib/northbound_sysrepo.c
@@ -118,6 +118,9 @@ static int yang_data_frr2sr(struct yang_data *frr_data, sr_val_t *sr_data)
sr_data->type = SR_INT64_T;
sr_data->data.int64_val = yang_str2int64(frr_data->value);
break;
+ case LY_TYPE_LEAFREF:
+ sr_val_set_str_data(sr_data, SR_STRING_T, frr_data->value);
+ break;
case LY_TYPE_STRING:
sr_val_set_str_data(sr_data, SR_STRING_T, frr_data->value);
break;
@@ -137,6 +140,11 @@ static int yang_data_frr2sr(struct yang_data *frr_data, sr_val_t *sr_data)
sr_data->type = SR_UINT64_T;
sr_data->data.uint64_val = yang_str2uint64(frr_data->value);
break;
+ case LY_TYPE_UNION:
+ /* No way to deal with this using un-typed yang_data object */
+ sr_val_set_str_data(sr_data, SR_STRING_T, frr_data->value);
+ break;
+ case LY_TYPE_UNKNOWN:
default:
return -1;
}
@@ -340,6 +348,8 @@ static int frr_sr_config_change_cb(sr_session_ctx_t *session, uint32_t sub_id,
return frr_sr_config_change_cb_apply(session, module_name);
case SR_EV_ABORT:
return frr_sr_config_change_cb_abort(session, module_name);
+ case SR_EV_RPC:
+ case SR_EV_UPDATE:
default:
flog_err(EC_LIB_LIBSYSREPO, "%s: unexpected sysrepo event: %u",
__func__, sr_ev);
@@ -347,39 +357,16 @@ static int frr_sr_config_change_cb(sr_session_ctx_t *session, uint32_t sub_id,
}
}
-static int frr_sr_state_data_iter_cb(const struct lysc_node *snode,
- struct yang_translator *translator,
- struct yang_data *data, void *arg)
-{
- struct lyd_node *dnode = arg;
- LY_ERR ly_errno;
-
- ly_errno = 0;
- ly_errno = lyd_new_path(NULL, ly_native_ctx, data->xpath, data->value,
- 0, &dnode);
- if (ly_errno) {
- flog_warn(EC_LIB_LIBYANG, "%s: lyd_new_path() failed",
- __func__);
- yang_data_free(data);
- return NB_ERR;
- }
-
- yang_data_free(data);
- return NB_OK;
-}
-
/* Callback for state retrieval. */
static int frr_sr_state_cb(sr_session_ctx_t *session, uint32_t sub_id,
const char *module_name, const char *xpath,
const char *request_xpath, uint32_t request_id,
struct lyd_node **parent, void *private_ctx)
{
- struct lyd_node *dnode;
+ struct lyd_node *dnode = NULL;
dnode = *parent;
- if (nb_oper_data_iterate(request_xpath, NULL, 0,
- frr_sr_state_data_iter_cb, dnode, NULL)
- != NB_OK) {
+ if (nb_oper_iterate_legacy(request_xpath, NULL, 0, NULL, NULL, &dnode)) {
flog_warn(EC_LIB_NB_OPERATIONAL_DATA,
"%s: failed to obtain operational data [xpath %s]",
__func__, xpath);