]> git.proxmox.com Git - mirror_frr.git/blame - lib/yang.h
tools: fix frr-reload.py daemon option
[mirror_frr.git] / lib / yang.h
CommitLineData
1c2facd1
RW
1/*
2 * Copyright (C) 2018 NetDEF, Inc.
3 * Renato Westphal
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; either version 2 of the License, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; see the file COPYING; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20#ifndef _FRR_YANG_H_
21#define _FRR_YANG_H_
22
23#include "memory.h"
24
25#include <libyang/libyang.h>
26#ifdef HAVE_SYSREPO
27#include <sysrepo.h>
28#endif
29
30#include "yang_wrappers.h"
31
5e244469
RW
32#ifdef __cplusplus
33extern "C" {
34#endif
35
1c2facd1 36/* Maximum XPath length. */
8f866890 37#define XPATH_MAXLEN 512
1c2facd1
RW
38
39/* Maximum list key length. */
40#define LIST_MAXKEYS 8
41
42/* Maximum list key length. */
43#define LIST_MAXKEYLEN 128
44
45/* Maximum string length of an YANG value. */
46#define YANG_VALUE_MAXLEN 1024
47
3a11599c
DL
48struct yang_module_embed {
49 struct yang_module_embed *next;
50 const char *mod_name, *mod_rev;
51 const char *data;
52 LYS_INFORMAT format;
53};
54
1c2facd1
RW
55struct yang_module {
56 RB_ENTRY(yang_module) entry;
57 const char *name;
58 const struct lys_module *info;
59#ifdef HAVE_CONFD
60 int confd_hash;
61#endif
62#ifdef HAVE_SYSREPO
63 sr_subscription_ctx_t *sr_subscription;
64#endif
65};
66RB_HEAD(yang_modules, yang_module);
67RB_PROTOTYPE(yang_modules, yang_module, entry, yang_module_compare);
68
69struct yang_data {
70 /* XPath identifier of the data element. */
71 char xpath[XPATH_MAXLEN];
72
1c2facd1
RW
73 /* Value encoded as a raw string. */
74 char *value;
75};
76
77struct yang_list_keys {
78 /* Number os keys (max: LIST_MAXKEYS). */
79 uint8_t num;
80
80243aef
RW
81 /* Value encoded as a raw string. */
82 char key[LIST_MAXKEYS][LIST_MAXKEYLEN];
1c2facd1
RW
83};
84
85enum yang_path_type {
86 YANG_PATH_SCHEMA = 0,
87 YANG_PATH_DATA,
88};
89
e0ccfad2
RW
90enum yang_iter_flags {
91 /* Filter non-presence containers. */
92 YANG_ITER_FILTER_NPCONTAINERS = (1<<0),
93
94 /* Filter list keys (leafs). */
95 YANG_ITER_FILTER_LIST_KEYS = (1<<1),
96
97 /* Filter RPC input/output nodes. */
98 YANG_ITER_FILTER_INPUT_OUTPUT = (1<<2),
99
100 /* Filter implicitely created nodes. */
101 YANG_ITER_FILTER_IMPLICIT = (1<<3),
544ca69a
RW
102
103 /* Allow iteration over augmentations. */
104 YANG_ITER_ALLOW_AUGMENTATIONS = (1<<4),
e0ccfad2
RW
105};
106
107/* Callback used by the yang_snodes_iterate_*() family of functions. */
108typedef int (*yang_iterate_cb)(const struct lys_node *snode, void *arg);
109
7b611145
RW
110/* Callback used by the yang_dnode_iterate() function. */
111typedef int (*yang_dnode_iter_cb)(const struct lyd_node *dnode, void *arg);
112
e0ccfad2
RW
113/* Return values of the 'yang_iterate_cb' callback. */
114#define YANG_ITER_CONTINUE 0
115#define YANG_ITER_STOP -1
1c2facd1
RW
116
117/* Global libyang context for native FRR models. */
118extern struct ly_ctx *ly_native_ctx;
119
8a328d17
RW
120/* Tree of all loaded YANG modules. */
121extern struct yang_modules yang_modules;
122
1c2facd1
RW
123/*
124 * Create a new YANG module and load it using libyang. If the YANG module is not
125 * found in the YANG_MODELS_PATH directory, the program will exit with an error.
126 * Once loaded, a YANG module can't be unloaded anymore.
127 *
128 * module_name
129 * Name of the YANG module.
130 *
131 * Returns:
132 * Pointer to newly created YANG module.
133 */
134extern struct yang_module *yang_module_load(const char *module_name);
135
a1b5f469
RW
136/*
137 * Load all FRR native YANG models.
138 */
139extern void yang_module_load_all(void);
140
1c2facd1
RW
141/*
142 * Find a YANG module by its name.
143 *
144 * module_name
145 * Name of the YANG module.
146 *
147 * Returns:
148 * Pointer to YANG module if found, NULL otherwise.
149 */
150extern struct yang_module *yang_module_find(const char *module_name);
151
3a11599c
DL
152/*
153 * Register a YANG module embedded in the binary file. Should be called
154 * from a constructor function.
155 *
156 * embed
157 * YANG module embedding structure to register. (static global provided
158 * by caller.)
159 */
160extern void yang_module_embed(struct yang_module_embed *embed);
161
e0ccfad2
RW
162/*
163 * Iterate recursively over all children of a schema node.
164 *
165 * snode
166 * YANG schema node to operate on.
167 *
168 * cb
169 * Function to call with each schema node.
170 *
171 * flags
172 * YANG_ITER_* flags to control how the iteration is performed.
173 *
174 * arg
175 * Arbitrary argument passed as the second parameter in each call to 'cb'.
176 *
177 * Returns:
178 * The return value of the last called callback.
179 */
180extern int yang_snodes_iterate_subtree(const struct lys_node *snode,
181 yang_iterate_cb cb, uint16_t flags,
182 void *arg);
183
1c2facd1
RW
184/*
185 * Iterate over all libyang schema nodes from the given YANG module.
186 *
187 * module
188 * YANG module to operate on.
189 *
e0ccfad2 190 * cb
1c2facd1
RW
191 * Function to call with each schema node.
192 *
193 * flags
e0ccfad2 194 * YANG_ITER_* flags to control how the iteration is performed.
1c2facd1 195 *
e0ccfad2
RW
196 * arg
197 * Arbitrary argument passed as the second parameter in each call to 'cb'.
1c2facd1 198 *
e0ccfad2
RW
199 * Returns:
200 * The return value of the last called callback.
1c2facd1 201 */
e0ccfad2
RW
202extern int yang_snodes_iterate_module(const struct lys_module *module,
203 yang_iterate_cb cb, uint16_t flags,
204 void *arg);
1c2facd1
RW
205
206/*
207 * Iterate over all libyang schema nodes from all loaded YANG modules.
208 *
e0ccfad2 209 * cb
1c2facd1
RW
210 * Function to call with each schema node.
211 *
212 * flags
e0ccfad2 213 * YANG_ITER_* flags to control how the iteration is performed.
1c2facd1 214 *
e0ccfad2
RW
215 * arg
216 * Arbitrary argument passed as the second parameter in each call to 'cb'.
1c2facd1 217 *
e0ccfad2
RW
218 * Returns:
219 * The return value of the last called callback.
1c2facd1 220 */
e0ccfad2
RW
221extern int yang_snodes_iterate_all(yang_iterate_cb cb, uint16_t flags,
222 void *arg);
1c2facd1
RW
223
224/*
225 * Build schema path or data path of the schema node.
226 *
227 * snode
228 * libyang schema node to be processed.
229 *
230 * type
231 * Specify whether a schema path or a data path should be built.
232 *
233 * xpath
234 * Pointer to previously allocated buffer.
235 *
236 * xpath_len
237 * Size of the xpath buffer.
238 */
239extern void yang_snode_get_path(const struct lys_node *snode,
240 enum yang_path_type type, char *xpath,
241 size_t xpath_len);
242
243/*
244 * Find first parent schema node which is a presence-container or a list
245 * (non-presence containers are ignored).
246 *
247 * snode
248 * libyang schema node to operate on.
249 *
250 * Returns:
251 * The parent libyang schema node if found, or NULL if not found.
252 */
253extern struct lys_node *yang_snode_real_parent(const struct lys_node *snode);
254
255/*
256 * Find first parent schema node which is a list.
257 *
258 * snode
259 * libyang schema node to operate on.
260 *
261 * Returns:
262 * The parent libyang schema node (list) if found, or NULL if not found.
263 */
264extern struct lys_node *yang_snode_parent_list(const struct lys_node *snode);
265
266/*
267 * Check if the libyang schema node represents typeless data (e.g. containers,
268 * leafs of type empty, etc).
269 *
270 * snode
271 * libyang schema node to operate on.
272 *
273 * Returns:
274 * true if the schema node represents typeless data, false otherwise.
275 */
276extern bool yang_snode_is_typeless_data(const struct lys_node *snode);
277
278/*
279 * Get the default value associated to a YANG leaf or leaf-list.
280 *
281 * snode
282 * libyang schema node to operate on.
283 *
284 * Returns:
285 * The default value if it exists, NULL otherwise.
286 */
287extern const char *yang_snode_get_default(const struct lys_node *snode);
288
289/*
290 * Get the type structure of a leaf of leaf-list. If the type is a leafref, the
291 * final (if there is a chain of leafrefs) target's type is found.
292 *
293 * snode
294 * libyang schema node to operate on.
295 *
296 * Returns:
297 * The found type if the schema node represents a leaf or a leaf-list, NULL
298 * otherwise.
299 */
300extern const struct lys_type *yang_snode_get_type(const struct lys_node *snode);
301
302/*
303 * Build data path of the data node.
304 *
305 * dnode
306 * libyang data node to be processed.
307 *
308 * xpath
309 * Pointer to previously allocated buffer.
310 *
311 * xpath_len
312 * Size of the xpath buffer.
313 */
314extern void yang_dnode_get_path(const struct lyd_node *dnode, char *xpath,
315 size_t xpath_len);
316
3f662078
RW
317/*
318 * Return the schema name of the given libyang data node.
319 *
320 * dnode
321 * libyang data node.
322 *
323 * xpath_fmt
324 * Optional XPath expression (absolute or relative) to specify a different
325 * data node to operate on in the same data tree.
326 *
327 * Returns:
328 * Schema name of the libyang data node.
329 */
330extern const char *yang_dnode_get_schema_name(const struct lyd_node *dnode,
331 const char *xpath_fmt, ...);
332
1c2facd1
RW
333/*
334 * Find a libyang data node by its YANG data path.
335 *
336 * dnode
337 * Base libyang data node to operate on.
338 *
339 * xpath_fmt
340 * XPath expression (absolute or relative).
341 *
342 * Returns:
343 * The libyang data node if found, or NULL if not found.
344 */
345extern struct lyd_node *yang_dnode_get(const struct lyd_node *dnode,
346 const char *xpath_fmt, ...);
347
348/*
349 * Check if a libyang data node exists.
350 *
351 * dnode
352 * Base libyang data node to operate on.
353 *
354 * xpath_fmt
355 * XPath expression (absolute or relative).
356 *
357 * Returns:
358 * true if the libyang data node was found, false otherwise.
359 */
360extern bool yang_dnode_exists(const struct lyd_node *dnode,
361 const char *xpath_fmt, ...);
362
7b611145
RW
363/*
364 * Iterate over all libyang data nodes that satisfy an XPath query.
365 *
366 * cb
367 * Function to call with each data node.
368 *
369 * arg
370 * Arbitrary argument passed as the second parameter in each call to 'cb'.
371 *
372 * dnode
373 * Base libyang data node to operate on.
374 *
375 * xpath_fmt
376 * XPath expression (absolute or relative).
377 */
378void yang_dnode_iterate(yang_dnode_iter_cb cb, void *arg,
379 const struct lyd_node *dnode, const char *xpath_fmt,
380 ...);
381
1c2facd1
RW
382/*
383 * Check if the libyang data node contains a default value. Non-presence
384 * containers are assumed to always contain a default value.
385 *
386 * dnode
387 * Base libyang data node to operate on.
388 *
389 * xpath_fmt
390 * Optional XPath expression (absolute or relative) to specify a different
391 * data node to operate on in the same data tree.
392 *
393 * Returns:
394 * true if the data node contains the default value, false otherwise.
395 */
396extern bool yang_dnode_is_default(const struct lyd_node *dnode,
397 const char *xpath_fmt, ...);
398
399/*
400 * Check if the libyang data node and all of its children contain default
401 * values. Non-presence containers are assumed to always contain a default
402 * value.
403 *
404 * dnode
405 * libyang data node to operate on.
406 *
407 * Returns:
408 * true if the data node and all of its children contain default values,
409 * false otherwise.
410 */
411extern bool yang_dnode_is_default_recursive(const struct lyd_node *dnode);
412
413/*
414 * Change the value of a libyang leaf node.
415 *
416 * dnode
417 * libyang data node to operate on.
418 *
419 * value
420 * String representing the new value.
421 */
422extern void yang_dnode_change_leaf(struct lyd_node *dnode, const char *value);
423
1c2facd1
RW
424/*
425 * Create a new libyang data node.
426 *
427 * ly_ctx
428 * libyang context to operate on.
429 *
5e02643a
RW
430 * config
431 * Specify whether the data node will contain only configuration data (true)
432 * or both configuration data and state data (false).
433 *
1c2facd1
RW
434 * Returns:
435 * Pointer to newly created libyang data node.
436 */
5e02643a 437extern struct lyd_node *yang_dnode_new(struct ly_ctx *ly_ctx, bool config_only);
1c2facd1
RW
438
439/*
440 * Duplicate a libyang data node.
441 *
442 * dnode
443 * libyang data node to duplicate.
444 *
445 * Returns:
446 * Pointer to duplicated libyang data node.
447 */
448extern struct lyd_node *yang_dnode_dup(const struct lyd_node *dnode);
449
450/*
451 * Delete a libyang data node.
452 *
453 * dnode
454 * Pointer to the libyang data node that is going to be deleted.
455 */
456extern void yang_dnode_free(struct lyd_node *dnode);
457
458/*
459 * Create a new yang_data structure.
460 *
461 * xpath
462 * Data path of the YANG data.
463 *
464 * value
465 * String representing the value of the YANG data.
466 *
467 * Returns:
468 * Pointer to newly created yang_data structure.
469 */
470extern struct yang_data *yang_data_new(const char *xpath, const char *value);
471
472/*
473 * Delete a yang_data structure.
474 *
475 * data
476 * yang_data to delete.
477 */
478extern void yang_data_free(struct yang_data *data);
479
480/*
481 * Create a new linked list of yang_data structures. The list 'del' callback is
482 * initialized appropriately so that the entire list can be deleted safely with
483 * list_delete_and_null().
484 *
485 * Returns:
486 * Pointer to newly created linked list.
487 */
488extern struct list *yang_data_list_new(void);
489
fcb7bffd
RW
490/*
491 * Find the yang_data structure corresponding to an XPath in a list.
492 *
493 * list
494 * list of yang_data structures to operate on.
495 *
496 * xpath_fmt
497 * XPath to search for (format string).
498 *
499 * Returns:
500 * Pointer to yang_data if found, NULL otherwise.
501 */
502extern struct yang_data *yang_data_list_find(const struct list *list,
503 const char *xpath_fmt, ...);
504
591f57cf
DL
505/*
506 * Create and set up a libyang context (for use by the translator)
b90204a8
RW
507 *
508 * embedded_modules
509 * Specify whether libyang should attempt to look for embedded YANG modules.
591f57cf 510 */
b90204a8 511extern struct ly_ctx *yang_ctx_new_setup(bool embedded_modules);
591f57cf 512
62ae9ade
RW
513/*
514 * Enable or disable libyang verbose debugging.
515 *
516 * enable
517 * When set to true, enable libyang verbose debugging, otherwise disable it.
518 */
519extern void yang_debugging_set(bool enable);
520
df5eda3d
RW
521/*
522 * Print libyang error messages into the provided buffer.
523 *
524 * ly_ctx
525 * libyang context to operate on.
526 *
527 * buf
528 * Buffer to store the libyang error messages.
529 *
530 * buf_len
531 * Size of buf.
532 *
533 * Returns:
534 * The provided buffer.
535 */
536extern const char *yang_print_errors(struct ly_ctx *ly_ctx, char *buf,
537 size_t buf_len);
538
1c2facd1
RW
539/*
540 * Initialize the YANG subsystem. Should be called only once during the
541 * daemon initialization process.
b90204a8
RW
542 *
543 * embedded_modules
544 * Specify whether libyang should attempt to look for embedded YANG modules.
1c2facd1 545 */
b90204a8 546extern void yang_init(bool embedded_modules);
1c2facd1
RW
547
548/*
549 * Finish the YANG subsystem gracefully. Should be called only when the daemon
550 * is exiting.
551 */
552extern void yang_terminate(void);
553
5e244469
RW
554#ifdef __cplusplus
555}
556#endif
557
1c2facd1 558#endif /* _FRR_YANG_H_ */