]> git.puffer.fish Git - matthieu/frr.git/commitdiff
mgmtd: add ietf-yang-library support
authorChristian Hopps <chopps@labn.net>
Tue, 17 Sep 2024 01:34:10 +0000 (21:34 -0400)
committerChristian Hopps <chopps@labn.net>
Wed, 18 Sep 2024 02:27:36 +0000 (22:27 -0400)
Signed-off-by: Christian Hopps <chopps@labn.net>
lib/northbound.h
lib/northbound_oper.c
mgmtd/mgmt.c
mgmtd/mgmt_fe_adapter.c

index b2cccb67163e8ab55ef99cfe9d90b6663fea93ff..dd3fbf8f73415d58db6058f531f744e80f8ed4dc 100644 (file)
@@ -1716,6 +1716,7 @@ extern void nb_terminate(void);
 
 extern void nb_oper_init(struct event_loop *loop);
 extern void nb_oper_terminate(void);
+extern bool nb_oper_is_yang_lib_query(const char *xpath);
 
 #ifdef __cplusplus
 }
index e95f99a2bdcc0737b7335d194b85b47acf19f200..a3ff3607800e31edacda44dd7c8c140a1b87bfce 100644 (file)
@@ -1741,6 +1741,16 @@ static enum nb_error nb_op_walk_start(struct nb_op_yield_state *ys)
        return __walk(ys, false);
 }
 
+bool nb_oper_is_yang_lib_query(const char *xpath)
+{
+       const char *libstr = "/ietf-yang-library:";
+       const unsigned long liblen = strlen(libstr);
+
+       if (strncmp(libstr, xpath, liblen))
+               return false;
+
+       return strlen(xpath) > liblen;
+}
 
 void *nb_oper_walk(const char *xpath, struct yang_translator *translator,
                   uint32_t flags, bool should_batch, nb_oper_data_cb cb,
index cfadad4829e255ad57b2155b5aeaa6a8c8f0d30e..02c54b921542b43e5ff006d795f3c63c9ac1a7f1 100644 (file)
@@ -57,6 +57,9 @@ void mgmt_init(void)
        /* Initialize MGMTD Transaction module */
        mgmt_txn_init(mm, mm->master);
 
+       /* Add yang-library module */
+       yang_module_load("ietf-yang-library", NULL);
+
        /* Initialize the MGMTD Frontend Adapter Module */
        mgmt_fe_adapter_init(mm->master);
 
index 8d305ed52fd22bace5824d818e1bda2c68d99a46..32f28a5774c583260ef558835ca4b3f8607859b4 100644 (file)
@@ -1337,6 +1337,31 @@ static void fe_adapter_handle_get_data(struct mgmt_fe_session_ctx *session,
                goto done;
        }
 
+       /* Check for yang-library shortcut */
+       if (nb_oper_is_yang_lib_query(msg->xpath)) {
+               struct lyd_node *ylib = NULL;
+               LY_ERR err;
+
+               err = ly_ctx_get_yanglib_data(ly_native_ctx, &ylib, "%u",
+                                             ly_ctx_get_change_count(
+                                                     ly_native_ctx));
+               if (err) {
+                       fe_adapter_send_error(session, req_id, false, err,
+                                             "Error getting yang-library data, session-id: %" PRIu64
+                                             " error: %s",
+                                             session->session_id,
+                                             ly_last_errmsg());
+               } else {
+                       yang_lyd_trim_xpath(&ylib, msg->xpath);
+                       (void)fe_adapter_send_tree_data(session, req_id, false,
+                                                       msg->result_type,
+                                                       wd_options, ylib, 0);
+               }
+               if (ylib)
+                       lyd_free_all(ylib);
+               goto done;
+       }
+
        switch (msg->datastore) {
        case MGMT_MSG_DATASTORE_CANDIDATE:
                ds_id = MGMTD_DS_CANDIDATE;