blob: 24a587861d0a5ad6487c8125193b1fe90da50205 [file] [log] [blame]
Michal Vasko7bcb48e2016-01-15 10:28:54 +01001/**
2 * \file messages_client.h
3 * \author Radek Krejci <rkrejci@cesnet.cz>
4 * \author Michal Vasko <mvasko@cesnet.cz>
5 * \brief libnetconf2's public functions and structures of NETCONF client messages.
6 *
7 * Copyright (c) 2015 CESNET, z.s.p.o.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 * 3. Neither the name of the Company nor the names of its contributors
19 * may be used to endorse or promote products derived from this
20 * software without specific prior written permission.
21 *
22 */
23
24#ifndef NC_MESSAGES_CLIENT_H_
25#define NC_MESSAGES_CLIENT_H_
26
27#include <stdint.h>
28
29#include "netconf.h"
30
31typedef enum {
Michal Vasko7f1c78b2016-01-19 09:52:14 +010032 NC_RPC_UNKNOWN = 0, /**< invalid RPC. */
Michal Vasko7bcb48e2016-01-15 10:28:54 +010033 NC_RPC_GENERIC, /**< user-defined generic RPC. */
34
35 /* ietf-netconf */
36 NC_RPC_GETCONFIG, /**< \<get-config\> RPC. */
37 NC_RPC_EDIT, /**< \<edit-config\> RPC. */
38 NC_RPC_COPY, /**< \<copy-config\> RPC. */
39 NC_RPC_DELETE, /**< \<delete-config\> RPC. */
40 NC_RPC_LOCK, /**< \<lock\> RPC. */
41 NC_RPC_UNLOCK, /**< \<unlock\> RPC. */
42 NC_RPC_GET, /**< \<get\> RPC. */
43 /* NC_RPC_CLOSE is not defined since sending \<close-session\> is done by nc_session_free() */
44 NC_RPC_KILL, /**< \<kill-session\> RPC. */
45 NC_RPC_COMMIT, /**< \<commit\> RPC. */
46 NC_RPC_DISCARD, /**< \<discard-changes\> RPC. */
47 NC_RPC_CANCEL, /**< \<cancel-commit\> RPC. */
48 NC_RPC_VALIDATE, /**< \<validate\> RPC. */
49
50 /* ietf-netconf-monitoring */
51 NC_RPC_GETSCHEMA, /**< \<get-schema\> RPC. */
52
53 /* notifications */
54 NC_RPC_SUBSCRIBE /**< \<create-subscription\> RPC. */
55} NC_RPC_TYPE;
56
57typedef enum {
58 NC_RPC_EDIT_DFLTOP_UNKNOWN = 0,
59 NC_RPC_EDIT_DFLTOP_MERGE,
60 NC_RPC_EDIT_DFLTOP_REPLACE,
61 NC_RPC_EDIT_DFLTOP_NONE
62} NC_RPC_EDIT_DFLTOP;
63
64typedef enum {
65 NC_RPC_EDIT_TESTOPT_UNKNOWN = 0,
66 NC_RPC_EDIT_TESTOPT_TESTSET,
67 NC_RPC_EDIT_TESTOPT_SET,
68 NC_RPC_EDIT_TESTOPT_TEST
69} NC_RPC_EDIT_TESTOPT;
70
71typedef enum {
72 NC_RPC_EDIT_ERROPT_UNKNOWN = 0,
73 NC_RPC_EDIT_ERROPT_STOP,
74 NC_RPC_EDIT_ERROPT_CONTINUE,
75 NC_RPC_EDIT_ERROPT_ROLLBACK
76} NC_RPC_EDIT_ERROPT;
77
78/**
79 * @brief NETCONF error structure representation
80 */
81struct nc_err {
82 /**
83 * @brief \<error-type\>, error layer where the error occurred.
84 */
85 const char *type;
86 /**
87 * @brief \<error-tag\>.
88 */
89 const char *tag;
90 /**
91 * @brief \<error-severity\>.
92 */
93 const char *severity;
94 /**
95 * @brief \<error-app-tag\>, the data-model-specific or implementation-specific error condition, if one exists.
96 */
97 const char *apptag;
98 /**
99 * @brief \<error-path\>, XPATH expression identifying the element with the error.
100 */
101 const char *path;
102 /**
103 * @brief \<error-message\>, Human-readable description of the error.
104 */
105 const char *message;
106 const char *message_lang;
107
108 /* <error-info> */
109
110 /**
111 * @brief \<session-id\>, session ID of the session holding the requested lock.
112 */
113 const char *sid;
114 /**
115 * @brief \<bad-attr\>, the name of the data-model-specific XML attribute that caused the error.
116 */
117 const char **attr;
118 uint16_t attr_count;
119 /**
120 * @brief \<bad-element\>, the name of the data-model-specific XML element that caused the error.
121 */
122 const char **elem;
123 uint16_t elem_count;
124 /**
125 * @brief \<bad-namespace\>, the name of the unexpected XML namespace that caused the error.
126 */
127 const char **ns;
128 uint16_t ns_count;
129 /**
130 * @brief Remaining non-standard elements.
131 */
132 struct lyxml_elem **other;
133 uint16_t other_count;
134};
135
136/**
137 * @brief NETCONF client RPC object
138 */
139struct nc_rpc;
140
Michal Vasko1a38c862016-01-15 15:50:07 +0100141/**
142 * @brief NETCONF client rpc-reply object
143 */
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100144struct nc_reply {
145 NC_RPL type;
146};
147
Michal Vasko1a38c862016-01-15 15:50:07 +0100148/**
149 * @brief NETCONF client data rpc-reply object
150 */
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100151struct nc_reply_data {
152 NC_RPL type; /**< NC_RPL_DATA */
153 struct lyd_node *data; /**< libyang data tree */
154};
155
Michal Vasko1a38c862016-01-15 15:50:07 +0100156/**
157 * @brief NETCONF client error rpc-reply object
158 */
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100159struct nc_reply_error {
Michal Vasko1a38c862016-01-15 15:50:07 +0100160 NC_RPL type; /**< NC_RPL_ERROR */
161 const struct nc_err *err; /**< errors, any of the values inside can be NULL */
162 uint32_t count; /**< number of error structures */
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100163};
164
Michal Vasko1a38c862016-01-15 15:50:07 +0100165/**
166 * @brief NETCONF client notification object
167 */
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100168struct nc_notif {
169 NC_RPL type; /**< NC_RPL_NOTIF */
170 const char *datetime; /**< eventTime of the notification */
171 struct lyd_node *tree; /**< libyang data tree of the message */
172};
173
174/**
175 * @brief Get the type of the RPC
176 *
177 * @param[in] rpc RPC to check the type of.
178 * @return Type of \p rpc.
179 */
180NC_RPC_TYPE nc_rpc_get_type(const struct nc_rpc *rpc);
181
182/**
183 * @brief Create a generic NETCONF RPC
184 *
185 * Note that created object can be sent via any NETCONF session that shares the context
186 * of the \p data.
187 *
188 * @param[in] data NETCONF RPC data as a data tree.
189 * @param[in] paramtype How to further manage data parameters.
190 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
191 */
192struct nc_rpc *nc_rpc_generic(const struct lyd_node *data, NC_PARAMTYPE paramtype);
193
194/**
195 * @brief Create a generic NETCONF RPC from an XML string
196 *
197 * Note that functions to create any RPC object do not check validity of the provided
198 * parameters. It is checked later while sending the RPC via a specific NETCONF session
199 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
200 * check. Created object can be sent via any NETCONF session which supports all the
201 * needed NETCONF capabilities for the RPC.
202 *
203 * @param[in] xml_str NETCONF RPC data as an XML string.
204 * @param[in] paramtype How to further manage data parameters.
205 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
206 */
207struct nc_rpc *nc_rpc_generic_xml(const char *xml_str, NC_PARAMTYPE paramtype);
208
209/**
210 * @brief Create NETCONF RPC \<get-config\>
211 *
212 * Note that functions to create any RPC object do not check validity of the provided
213 * parameters. It is checked later while sending the RPC via a specific NETCONF session
214 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
215 * check. Created object can be sent via any NETCONF session which supports all the
216 * needed NETCONF capabilities for the RPC.
217 *
218 * @param[in] source Source datastore being queried.
219 * @param[in] filter Optional filter data, an XML subtree or XPath expression.
220 * @param[in] wd_mode Optional with-defaults capability mode.
221 * @param[in] paramtype How to further manage data parameters.
222 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
223 */
224struct nc_rpc *nc_rpc_getconfig(NC_DATASTORE source, const char *filter, NC_WD_MODE wd_mode,
225 NC_PARAMTYPE paramtype);
226
227/**
228 * @brief Create NETCONF RPC \<edit-config\>
229 *
230 * Note that functions to create any RPC object do not check validity of the provided
231 * parameters. It is checked later while sending the RPC via a specific NETCONF session
232 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
233 * check. Created object can be sent via any NETCONF session which supports all the
234 * needed NETCONF capabilities for the RPC.
235 *
236 * @param[in] target Target datastore being edited.
237 * @param[in] default_op Optional default operation.
238 * @param[in] test_opt Optional test option.
239 * @param[in] error_opt Optional error option.
240 * @param[in] edit_content Config or URL where the config to perform is to be found.
241 * @param[in] paramtype How to further manage data parameters.
242 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
243 */
244struct nc_rpc *nc_rpc_edit(NC_DATASTORE target, NC_RPC_EDIT_DFLTOP default_op, NC_RPC_EDIT_TESTOPT test_opt,
245 NC_RPC_EDIT_ERROPT error_opt, const char *edit_content, NC_PARAMTYPE paramtype);
246
247/**
248 * @brief Create NETCONF RPC \<copy-config\>
249 *
250 * Note that functions to create any RPC object do not check validity of the provided
251 * parameters. It is checked later while sending the RPC via a specific NETCONF session
252 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
253 * check. Created object can be sent via any NETCONF session which supports all the
254 * needed NETCONF capabilities for the RPC.
255 *
256 * @param[in] target Target datastore.
257 * @param[in] url_trg Used instead \p target if the target is an URL.
258 * @param[in] source Source datastore.
259 * @param[in] url_or_config_src Used instead \p source if the source is an URL or a config.
260 * @param[in] wd_mode Optional with-defaults capability mode.
261 * @param[in] paramtype How to further manage data parameters.
262 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
263 */
264struct nc_rpc *nc_rpc_copy(NC_DATASTORE target, const char *url_trg, NC_DATASTORE source,
265 const char *url_or_config_src, NC_WD_MODE wd_mode, NC_PARAMTYPE paramtype);
266
267/**
268 * @brief Create NETCONF RPC \<delete-config\>
269 *
270 * Note that functions to create any RPC object do not check validity of the provided
271 * parameters. It is checked later while sending the RPC via a specific NETCONF session
272 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
273 * check. Created object can be sent via any NETCONF session which supports all the
274 * needed NETCONF capabilities for the RPC.
275 *
276 * @param[in] target Target datastore to delete.
277 * @param[in] url Used instead \p target if the target is an URL.
278 * @param[in] paramtype How to further manage data parameters.
279 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
280 */
281struct nc_rpc *nc_rpc_delete(NC_DATASTORE target, const char *url, NC_PARAMTYPE paramtype);
282
283/**
284 * @brief Create NETCONF RPC \<lock\>
285 *
286 * Note that functions to create any RPC object do not check validity of the provided
287 * parameters. It is checked later while sending the RPC via a specific NETCONF session
288 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
289 * check. Created object can be sent via any NETCONF session which supports all the
290 * needed NETCONF capabilities for the RPC.
291 *
292 * @param[in] target Target datastore of the operation.
293 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
294 */
295struct nc_rpc *nc_rpc_lock(NC_DATASTORE target);
296
297/**
298 * @brief Create NETCONF RPC \<unlock\>
299 *
300 * Note that functions to create any RPC object do not check validity of the provided
301 * parameters. It is checked later while sending the RPC via a specific NETCONF session
302 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
303 * check. Created object can be sent via any NETCONF session which supports all the
304 * needed NETCONF capabilities for the RPC.
305 *
306 * @param[in] target Target datastore of the operation.
307 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
308 */
309struct nc_rpc *nc_rpc_unlock(NC_DATASTORE target);
310
311/**
312 * @brief Create NETCONF RPC \<get\>
313 *
314 * Note that functions to create any RPC object do not check validity of the provided
315 * parameters. It is checked later while sending the RPC via a specific NETCONF session
316 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
317 * check. Created object can be sent via any NETCONF session which supports all the
318 * needed NETCONF capabilities for the RPC.
319 *
320 * @param[in] filter Optional filter data, an XML subtree or XPath expression.
321 * @param[in] wd_mode Optional with-defaults capability mode.
322 * @param[in] paramtype How to further manage data parameters.
323 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
324 */
325struct nc_rpc *nc_rpc_get(const char *filter, NC_WD_MODE wd_mode, NC_PARAMTYPE paramtype);
326
327/**
328 * @brief Create NETCONF RPC \<kill-session\>
329 *
330 * Note that functions to create any RPC object do not check validity of the provided
331 * parameters. It is checked later while sending the RPC via a specific NETCONF session
332 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
333 * check. Created object can be sent via any NETCONF session which supports all the
334 * needed NETCONF capabilities for the RPC.
335 *
336 * @param[in] session_id Session ID of the session to kill.
337 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
338 */
339struct nc_rpc *nc_rpc_kill(uint32_t session_id);
340
341/**
342 * @brief Create NETCONF RPC \<commit\>
343 *
344 * Note that functions to create any RPC object do not check validity of the provided
345 * parameters. It is checked later while sending the RPC via a specific NETCONF session
346 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
347 * check. Created object can be sent via any NETCONF session which supports all the
348 * needed NETCONF capabilities for the RPC.
349 *
350 * @param[in] confirmed Whether the commit is to be confirmed.
351 * @param[in] confirm_timeout Optional confirm timeout.
352 * @param[in] persist Optional identification string of a new persistent confirmed commit.
353 * @param[in] persist_id Optional identification string of a persistent confirmed commit to be commited.
354 * @param[in] paramtype How to further manage data parameters.
355 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
356 */
357struct nc_rpc *nc_rpc_commit(int confirmed, uint32_t confirm_timeout, const char *persist, const char *persist_id,
358 NC_PARAMTYPE paramtype);
359
360/**
361 * @brief Create NETCONF RPC \<discard-changes\>
362 *
363 * Note that functions to create any RPC object do not check validity of the provided
364 * parameters. It is checked later while sending the RPC via a specific NETCONF session
365 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
366 * check. Created object can be sent via any NETCONF session which supports all the
367 * needed NETCONF capabilities for the RPC.
368 *
369 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
370 */
371struct nc_rpc *nc_rpc_discard(void);
372
373/**
374 * @brief Create NETCONF RPC \<cancel-commit\>
375 *
376 * Note that functions to create any RPC object do not check validity of the provided
377 * parameters. It is checked later while sending the RPC via a specific NETCONF session
378 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
379 * check. Created object can be sent via any NETCONF session which supports all the
380 * needed NETCONF capabilities for the RPC.
381 *
382 * @param[in] persist_id Optional identification string of a persistent confirmed commit.
383 * @param[in] paramtype How to further manage data parameters.
384 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
385 */
386struct nc_rpc *nc_rpc_cancel(const char *persist_id, NC_PARAMTYPE paramtype);
387
388/**
389 * @brief Create NETCONF RPC \<validate\>
390 *
391 * Note that functions to create any RPC object do not check validity of the provided
392 * parameters. It is checked later while sending the RPC via a specific NETCONF session
393 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
394 * check. Created object can be sent via any NETCONF session which supports all the
395 * needed NETCONF capabilities for the RPC.
396 *
397 * @param[in] source Source datastore being validated.
398 * @param[in] url_or_config Usedn instead \p source if the source is an URL or a config.
399 * @param[in] paramtype How to further manage data parameters.
400 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
401 */
402struct nc_rpc *nc_rpc_validate(NC_DATASTORE source, const char *url_or_config, NC_PARAMTYPE paramtype);
403
404/**
405 * @brief Create NETCONF RPC \<get-schema\>
406 *
407 * Note that functions to create any RPC object do not check validity of the provided
408 * parameters. It is checked later while sending the RPC via a specific NETCONF session
409 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
410 * check. Created object can be sent via any NETCONF session which supports all the
411 * needed NETCONF capabilities for the RPC.
412 *
413 * @param[in] identifier Requested model identifier.
414 * @param[in] version Optional model version, either YANG version (1.0/1.1) or revision date.
415 * @param[in] format Optional format of the model (default is YANG).
416 * @param[in] paramtype How to further manage data parameters.
417 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
418 */
419struct nc_rpc *nc_rpc_getschema(const char *identifier, const char *version, const char *format, NC_PARAMTYPE paramtype);
420
421/**
422 * @brief Create NETCONF RPC \<create-subscription\>
423 *
424 * Note that functions to create any RPC object do not check validity of the provided
425 * parameters. It is checked later while sending the RPC via a specific NETCONF session
426 * (nc_send_rpc()) since the NETCONF capabilities of the session are needed for such a
427 * check. Created object can be sent via any NETCONF session which supports all the
428 * needed NETCONF capabilities for the RPC.
429 *
430 * @param[in] stream_name Optional name of a NETCONF stream to subscribe to.
431 * @param[in] filter Optional filter data, an XML subtree or XPath expression.
432 * @param[in] start_time Optional YANG datetime identifying the start of the subscription.
433 * @param[in] stop_time Optional YANG datetime identifying the end of the subscription.
434 * @param[in] paramtype How to further manage data parameters.
435 * @return Created RPC object to send via a NETCONF session or NULL in case of (memory allocation) error.
436 */
437struct nc_rpc *nc_rpc_subscribe(const char *stream_name, const char *filter, const char *start_time,
438 const char *stop_time, NC_PARAMTYPE paramtype);
439
440/**
441 * @brief Free the NETCONF RPC object.
442 * @param[in] rpc Object to free.
443 */
444void nc_rpc_free(struct nc_rpc *rpc);
445
446/**
447 * @brief Free the NETCONF RPC reply object.
448 * @param[in] rpc Object to free.
449 */
450void nc_reply_free(struct nc_reply *reply);
451
Michal Vasko1a38c862016-01-15 15:50:07 +0100452/**
453 * @brief Free the NETCONF Notification object.
454 * @param[in] rpc Object to free.
455 */
456void nc_notif_free(struct nc_notif *notif);
457
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100458#endif /* NC_MESSAGES_CLIENT_H_ */