blob: a9bbbae08001c6112f1ae0a8d4b37a5c67c2af61 [file] [log] [blame]
Michal Vasko7bcb48e2016-01-15 10:28:54 +01001/**
Michal Vaskoc446a382021-06-18 08:54:05 +02002 * @file messages_server.h
3 * @author Michal Vasko <mvasko@cesnet.cz>
4 * @brief libnetconf2's functions and structures of server NETCONF messages.
Michal Vasko7bcb48e2016-01-15 10:28:54 +01005 *
Michal Vasko95ea9ff2021-11-09 12:29:14 +01006 * @copyright
Michal Vaskoc446a382021-06-18 08:54:05 +02007 * Copyright (c) 2015-2021 CESNET, z.s.p.o.
Michal Vasko7bcb48e2016-01-15 10:28:54 +01008 *
Radek Krejci9b81f5b2016-02-24 13:14:49 +01009 * This source code is licensed under BSD 3-Clause License (the "License").
10 * You may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
Michal Vaskoafd416b2016-02-25 14:51:46 +010012 *
Radek Krejci9b81f5b2016-02-24 13:14:49 +010013 * https://opensource.org/licenses/BSD-3-Clause
Michal Vasko7bcb48e2016-01-15 10:28:54 +010014 */
15
16#ifndef NC_MESSAGES_SERVER_H_
17#define NC_MESSAGES_SERVER_H_
18
Michal Vaskoc09730e2019-01-17 10:07:26 +010019#ifdef __cplusplus
20extern "C" {
21#endif
22
Michal Vasko488f4802018-09-07 13:04:41 +020023#include <libyang/libyang.h>
Michal Vaskob83a3fa2021-05-26 09:53:42 +020024#include <stdint.h>
Michal Vasko7bcb48e2016-01-15 10:28:54 +010025
26#include "netconf.h"
Radek Krejci93e80222016-10-03 13:34:25 +020027#include "session.h"
Michal Vasko7bcb48e2016-01-15 10:28:54 +010028
Michal Vaskof0537d82016-01-29 14:42:38 +010029/**
Radek Krejci6799a052017-05-19 14:23:23 +020030 * @defgroup server_msg Server Messages
31 * @ingroup server
32 *
33 * @brief Functions to create NETCONF Event notifications and replies to the NETCONF RPCs (or actions).
34 * @{
35 */
36
37/**
Michal Vaskof0537d82016-01-29 14:42:38 +010038 * @brief Enumeration of NETCONF errors
39 */
Michal Vasko495c9462016-01-15 11:27:43 +010040typedef enum NC_ERROR {
Michal Vaskof0537d82016-01-29 14:42:38 +010041 NC_ERR_UNKNOWN = 0, /**< unknown error */
42 NC_ERR_IN_USE, /**< in-use error */
43 NC_ERR_INVALID_VALUE, /**< invalid-value error */
44 NC_ERR_TOO_BIG, /**< too-big error */
45 NC_ERR_MISSING_ATTR, /**< missing-attribute error */
46 NC_ERR_BAD_ATTR, /**< bad-attribute error */
47 NC_ERR_UNKNOWN_ATTR, /**< unknown-attribute error */
48 NC_ERR_MISSING_ELEM, /**< missing-element error */
49 NC_ERR_BAD_ELEM, /**< bad-element error */
50 NC_ERR_UNKNOWN_ELEM, /**< unknown-element error */
51 NC_ERR_UNKNOWN_NS, /**< unknown-namespace error */
52 NC_ERR_ACCESS_DENIED, /**< access-denied error */
53 NC_ERR_LOCK_DENIED, /**< lock-denied error */
54 NC_ERR_RES_DENIED, /**< resource-denied error */
55 NC_ERR_ROLLBACK_FAILED, /**< rollback-failed error */
56 NC_ERR_DATA_EXISTS, /**< data-exists error */
57 NC_ERR_DATA_MISSING, /**< data-missing error */
58 NC_ERR_OP_NOT_SUPPORTED, /**< operation-not-supported error */
59 NC_ERR_OP_FAILED, /**< operation-failed error */
60 NC_ERR_MALFORMED_MSG /**< malformed-message error */
Michal Vasko7bcb48e2016-01-15 10:28:54 +010061} NC_ERR;
62
Michal Vaskof0537d82016-01-29 14:42:38 +010063/**
64 * @brief Enumeration of NETCONF error type (layer)
65 */
Michal Vasko495c9462016-01-15 11:27:43 +010066typedef enum NC_ERROR_TYPE {
Michal Vaskof0537d82016-01-29 14:42:38 +010067 NC_ERR_TYPE_UNKNOWN = 0, /**< unknown layer */
68 NC_ERR_TYPE_TRAN, /**< transport layer */
69 NC_ERR_TYPE_RPC, /**< RPC layer */
70 NC_ERR_TYPE_PROT, /**< protocol layer */
71 NC_ERR_TYPE_APP /**< application layer */
Michal Vasko7bcb48e2016-01-15 10:28:54 +010072} NC_ERR_TYPE;
73
74/**
Michal Vasko1a38c862016-01-15 15:50:07 +010075 * @brief NETCONF server rpc-reply object
Michal Vasko7bcb48e2016-01-15 10:28:54 +010076 */
77struct nc_server_reply;
78
Michal Vasko1a38c862016-01-15 15:50:07 +010079/**
Radek Krejci93e80222016-10-03 13:34:25 +020080 * @brief NETCONF server Event Notification object
81 */
82struct nc_server_notif;
83
84/**
Michal Vasko1a38c862016-01-15 15:50:07 +010085 * @brief NETCONF server error structure
86 */
Michal Vasko7bcb48e2016-01-15 10:28:54 +010087struct nc_server_error;
88
Michal Vasko1a38c862016-01-15 15:50:07 +010089/**
90 * @brief Create an OK rpc-reply object.
91 *
92 * @return rpc-reply object, NULL on error.
93 */
Michal Vasko7bcb48e2016-01-15 10:28:54 +010094struct nc_server_reply *nc_server_reply_ok(void);
95
Michal Vasko1a38c862016-01-15 15:50:07 +010096/**
97 * @brief Create a DATA rpc-reply object.
98 *
Michal Vasko3824fa72022-06-06 11:50:35 +020099 * @param[in] data Reply data tree pointing to the RPC/action itself. This tree must be valid according to
Michal Vaskob08743b2016-04-13 14:23:49 +0200100 * the RPC output of the RPC this is a reply to.
Radek Krejci36dfdb32016-09-01 16:56:35 +0200101 * @param[in] wd with-default mode if applicable
Michal Vaskoc446a382021-06-18 08:54:05 +0200102 * @param[in] paramtype Determines how the @p data parameter is treated.
Michal Vasko1a38c862016-01-15 15:50:07 +0100103 * @return rpc-reply object, NULL on error.
104 */
Radek Krejci36dfdb32016-09-01 16:56:35 +0200105struct nc_server_reply *nc_server_reply_data(struct lyd_node *data, NC_WD_MODE wd, NC_PARAMTYPE paramtype);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100106
Michal Vasko1a38c862016-01-15 15:50:07 +0100107/**
108 * @brief Create an ERROR rpc-reply object.
109 *
Michal Vasko3824fa72022-06-06 11:50:35 +0200110 * @param[in] err Errors created by ::nc_err(). It will be freed with the returned object.
Michal Vasko1a38c862016-01-15 15:50:07 +0100111 * @return rpc-reply object, NULL on error.
112 */
Michal Vasko77367452021-02-16 16:32:18 +0100113struct nc_server_reply *nc_server_reply_err(struct lyd_node *err);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100114
Michal Vasko1a38c862016-01-15 15:50:07 +0100115/**
Michal Vasko77367452021-02-16 16:32:18 +0100116 * @brief Add another error opaque data node tree to an ERROR rpc-reply object.
Michal Vasko1a38c862016-01-15 15:50:07 +0100117 *
118 * @param[in] reply ERROR reply to add to.
Michal Vasko3824fa72022-06-06 11:50:35 +0200119 * @param[in] err Error created by ::nc_err(). It will be freed with the returned object.
Michal Vasko1a38c862016-01-15 15:50:07 +0100120 * @return 0 on success, -1 on errror.
121 */
Michal Vasko77367452021-02-16 16:32:18 +0100122int nc_server_reply_add_err(struct nc_server_reply *reply, struct lyd_node *err);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100123
Michal Vasko1a38c862016-01-15 15:50:07 +0100124/**
Michal Vaskof1c26c22021-04-12 16:34:33 +0200125 * @brief Get last error from an ERROR rpc-reply object.
Michal Vaskoaa2e5a72017-03-16 09:48:44 +0100126 *
127 * @param[in] reply ERROR reply to read from.
Michal Vasko77367452021-02-16 16:32:18 +0100128 * @return Last error opaque data tree, NULL on failure.
Michal Vaskoaa2e5a72017-03-16 09:48:44 +0100129 */
Michal Vasko77367452021-02-16 16:32:18 +0100130const struct lyd_node *nc_server_reply_get_last_err(const struct nc_server_reply *reply);
Michal Vaskoaa2e5a72017-03-16 09:48:44 +0100131
132/**
Michal Vasko1a38c862016-01-15 15:50:07 +0100133 * @brief Create a server error structure. Its \<error-message\> is filled with
134 * a general description of the specific error.
135 *
Michal Vasko77367452021-02-16 16:32:18 +0100136 * @param[in] ctx libyang context to use.
Radek Krejci127f8952016-10-12 14:57:16 +0200137 * @param[in] tag \<error-tag\> of the server error specified as #NC_ERR value. According to the tag, the
Michal Vasko1a38c862016-01-15 15:50:07 +0100138 * specific additional parameters are required:
139 * - #NC_ERR_IN_USE
140 * - #NC_ERR_INVALID_VALUE
141 * - #NC_ERR_ACCESS_DENIED
142 * - #NC_ERR_ROLLBACK_FAILED
Michal Vaskof0537d82016-01-29 14:42:38 +0100143 * - #NC_ERR_OP_NOT_SUPPORTED
Michal Vasko1a38c862016-01-15 15:50:07 +0100144 * - #NC_ERR_TOO_BIG
145 * - #NC_ERR_RES_DENIED
146 * - #NC_ERR_OP_FAILED
147 * - `NC_ERR_TYPE type;` - type (layer) of the error.
148 * - #NC_ERR_MISSING_ATTR
149 * - #NC_ERR_BAD_ATTR
150 * - #NC_ERR_UNKNOWN_ATTR
151 * - `NC_ERR_TYPE type;` - type (layer) of the error.
152 * - `const char *attr_name;` - error \<bad-attribute\> value.
153 * - `const char *elem_name;` - error \<bad-element\> value.
154 * - #NC_ERR_MISSING_ELEM
155 * - #NC_ERR_BAD_ELEM
156 * - #NC_ERR_UNKNOWN_ELEM
157 * - `NC_ERR_TYPE type;` - type (layer) of the error.
158 * - `const char *elem_name;` - error \<bad-element\> value.
159 * - #NC_ERR_UNKNOWN_NS
160 * - `NC_ERR_TYPE type;` - type (layer) of the error.
161 * - `const char *elem_name;` - error \<bad-element\> value.
162 * - `const char *nc_name;` - error \<bad-namespace\> value.
163 * - #NC_ERR_LOCK_DENIED
164 * - `uint32_t session_id;` - error \<session-id\> value.
165 * - #NC_ERR_DATA_EXISTS
166 * - #NC_ERR_DATA_MISSING
Michal Vaskof0537d82016-01-29 14:42:38 +0100167 * - #NC_ERR_MALFORMED_MSG
Michal Vasko1a38c862016-01-15 15:50:07 +0100168 * - no additional arguments
Michal Vasko3824fa72022-06-06 11:50:35 +0200169 * @param[in] ... Additional arguments depending on the @p tag used.
Michal Vasko77367452021-02-16 16:32:18 +0100170 * @return Opaque data node tree representing the error.
Michal Vasko1a38c862016-01-15 15:50:07 +0100171 */
Michal Vasko77367452021-02-16 16:32:18 +0100172struct lyd_node *nc_err(const struct ly_ctx *ctx, NC_ERR tag, ...);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100173
Michal Vasko1a38c862016-01-15 15:50:07 +0100174/**
Michal Vasko8f3198f2016-05-04 10:45:28 +0200175 * @brief Get the \<error-type\> of a server error.
176 *
Michal Vasko77367452021-02-16 16:32:18 +0100177 * @param[in] err Error opaque data node tree to read from.
Michal Vasko8f3198f2016-05-04 10:45:28 +0200178 * @return Server error type, 0 on error.
179 */
Michal Vasko77367452021-02-16 16:32:18 +0100180NC_ERR_TYPE nc_err_get_type(const struct lyd_node *err);
Michal Vasko8f3198f2016-05-04 10:45:28 +0200181
182/**
183 * @brief Get the \<error-tag\> of a server error.
184 *
Michal Vasko77367452021-02-16 16:32:18 +0100185 * @param[in] err Error opaque data node tree to read from.
Michal Vasko8f3198f2016-05-04 10:45:28 +0200186 * @return Server error tag, 0 on error.
187 */
Michal Vasko77367452021-02-16 16:32:18 +0100188NC_ERR nc_err_get_tag(const struct lyd_node *err);
Michal Vasko8f3198f2016-05-04 10:45:28 +0200189
190/**
Michal Vasko1a38c862016-01-15 15:50:07 +0100191 * @brief Set the \<error-app-tag\> element of an error. Any previous value will be overwritten.
192 *
Michal Vasko77367452021-02-16 16:32:18 +0100193 * @param[in] err Error opaque data node tree to modify.
Michal Vasko1a38c862016-01-15 15:50:07 +0100194 * @param[in] error_app_tag New value of \<error-app-tag\>.
195 * @return 0 on success, -1 on error.
196 */
Michal Vasko77367452021-02-16 16:32:18 +0100197int nc_err_set_app_tag(struct lyd_node *err, const char *error_app_tag);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100198
Michal Vasko1a38c862016-01-15 15:50:07 +0100199/**
Michal Vasko8f3198f2016-05-04 10:45:28 +0200200 * @brief Get the \<error-app-tag\> of a server error.
201 *
Michal Vasko77367452021-02-16 16:32:18 +0100202 * @param[in] err Error opaque data node tree to read from.
Michal Vasko8f3198f2016-05-04 10:45:28 +0200203 * @return Server error app tag, NULL on error.
204 */
Michal Vasko77367452021-02-16 16:32:18 +0100205const char *nc_err_get_app_tag(const struct lyd_node *err);
Michal Vasko8f3198f2016-05-04 10:45:28 +0200206
207/**
Michal Vasko1a38c862016-01-15 15:50:07 +0100208 * @brief Set the \<error-path\> element of an error. Any previous value will be overwritten.
209 *
Michal Vasko77367452021-02-16 16:32:18 +0100210 * @param[in] err Error opaque data node tree to modify.
Michal Vasko1a38c862016-01-15 15:50:07 +0100211 * @param[in] error_path New value of \<error-path\>.
212 * @return 0 on success, -1 on error.
213 */
Michal Vasko77367452021-02-16 16:32:18 +0100214int nc_err_set_path(struct lyd_node *err, const char *error_path);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100215
Michal Vasko1a38c862016-01-15 15:50:07 +0100216/**
Michal Vasko8f3198f2016-05-04 10:45:28 +0200217 * @brief Get the \<error-path\> of a server error.
218 *
Michal Vasko77367452021-02-16 16:32:18 +0100219 * @param[in] err Error opaque data node tree to read from.
Michal Vasko8f3198f2016-05-04 10:45:28 +0200220 * @return Server error path, NULL on error.
221 */
Michal Vasko77367452021-02-16 16:32:18 +0100222const char *nc_err_get_path(const struct lyd_node *err);
Michal Vasko8f3198f2016-05-04 10:45:28 +0200223
224/**
Michal Vasko1a38c862016-01-15 15:50:07 +0100225 * @brief Set the \<error-message\> element of an error. Any previous value will be overwritten.
226 *
Michal Vasko77367452021-02-16 16:32:18 +0100227 * @param[in] err Error opaque data node tree to modify.
Michal Vasko1a38c862016-01-15 15:50:07 +0100228 * @param[in] error_message New value of \<error-message\>.
Michal Vaskoc446a382021-06-18 08:54:05 +0200229 * @param[in] lang Optional language of @p error_message.
Michal Vasko1a38c862016-01-15 15:50:07 +0100230 * @return 0 on success, -1 on error.
231 */
Michal Vasko77367452021-02-16 16:32:18 +0100232int nc_err_set_msg(struct lyd_node *err, const char *error_message, const char *lang);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100233
Michal Vasko1a38c862016-01-15 15:50:07 +0100234/**
Michal Vasko8f3198f2016-05-04 10:45:28 +0200235 * @brief Get the \<error-message\> of a server error.
236 *
Michal Vasko77367452021-02-16 16:32:18 +0100237 * @param[in] err Error opaque data node tree to read from.
Michal Vasko8f3198f2016-05-04 10:45:28 +0200238 * @return Server error message, NULL on error.
239 */
Michal Vasko77367452021-02-16 16:32:18 +0100240const char *nc_err_get_msg(const struct lyd_node *err);
Michal Vasko8f3198f2016-05-04 10:45:28 +0200241
242/**
Michal Vasko1a38c862016-01-15 15:50:07 +0100243 * @brief Set the \<session-id\> element of an error. Any previous value will be overwritten.
244 *
Michal Vasko77367452021-02-16 16:32:18 +0100245 * @param[in] err Error opaque data node tree to modify.
Michal Vaskof0537d82016-01-29 14:42:38 +0100246 * @param[in] session_id New value of \<session-id\>.
Michal Vasko1a38c862016-01-15 15:50:07 +0100247 * @return 0 on success, -1 on error.
248 */
Michal Vasko77367452021-02-16 16:32:18 +0100249int nc_err_set_sid(struct lyd_node *err, uint32_t session_id);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100250
Michal Vasko1a38c862016-01-15 15:50:07 +0100251/**
252 * @brief Add a \<bad-attribute\> element to an error.
253 *
Michal Vasko77367452021-02-16 16:32:18 +0100254 * @param[in] err Error opaque data node tree to modify.
Michal Vasko1a38c862016-01-15 15:50:07 +0100255 * @param[in] attr_name Value of the new \<bad-attribute\> element.
256 * @return 0 on success, -1 on error.
257 */
Michal Vasko77367452021-02-16 16:32:18 +0100258int nc_err_add_bad_attr(struct lyd_node *err, const char *attr_name);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100259
Michal Vasko1a38c862016-01-15 15:50:07 +0100260/**
261 * @brief Add a \<bad-element\> element to an error.
262 *
Michal Vasko77367452021-02-16 16:32:18 +0100263 * @param[in] err Error opaque data node tree to modify.
Michal Vasko1a38c862016-01-15 15:50:07 +0100264 * @param[in] elem_name Value of the new \<bad-element\> element.
265 * @return 0 on success, -1 on error.
266 */
Michal Vasko77367452021-02-16 16:32:18 +0100267int nc_err_add_bad_elem(struct lyd_node *err, const char *elem_name);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100268
Michal Vasko1a38c862016-01-15 15:50:07 +0100269/**
270 * @brief Add a \<bad-namespace\> element to an error.
271 *
Michal Vasko77367452021-02-16 16:32:18 +0100272 * @param[in] err Error opaque data node tree to modify.
Michal Vasko1a38c862016-01-15 15:50:07 +0100273 * @param[in] ns_name Value of the new \<bad-namespace\> element.
274 * @return 0 on success, -1 on error.
275 */
Michal Vasko77367452021-02-16 16:32:18 +0100276int nc_err_add_bad_ns(struct lyd_node *err, const char *ns_name);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100277
Michal Vasko1a38c862016-01-15 15:50:07 +0100278/**
279 * @brief Add an additional custom element to an error.
280 *
Michal Vasko77367452021-02-16 16:32:18 +0100281 * @param[in] err Error opaque data node tree to modify.
282 * @param[in] other Other error opaque data node tree.
Michal Vasko1a38c862016-01-15 15:50:07 +0100283 * @return 0 on success, -1 on error.
284 */
Michal Vasko77367452021-02-16 16:32:18 +0100285int nc_err_add_info_other(struct lyd_node *err, struct lyd_node *other);
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100286
Michal Vasko1a38c862016-01-15 15:50:07 +0100287/**
288 * @brief Free a server rpc-reply object.
289 *
290 * @param[in] reply Server rpc-reply object to free.
291 */
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100292void nc_server_reply_free(struct nc_server_reply *reply);
293
Michal Vasko1a38c862016-01-15 15:50:07 +0100294/**
Radek Krejci93e80222016-10-03 13:34:25 +0200295 * @brief Create Event Notification object to be sent to the subscribed client(s).
296 *
297 * @param[in] event Notification data tree (valid as LYD_OPT_NOTIF) from libyang. The tree is directly used in created
298 * object, so the caller is supposed to not free the tree on its own, but only via freeng the created object.
299 * @param[in] eventtime YANG dateTime format value of the time when the event was generated by the event source.
Michal Vasko49eb3f42021-05-19 10:20:57 +0200300 * Caller can use nc_timespec2datetime() to create the value from a timespec value.
Michal Vaskofc9dbdd2017-03-17 09:27:57 +0100301 * @param[in] paramtype How to further manage data parameters.
Radek Krejci93e80222016-10-03 13:34:25 +0200302 * @return Newly created structure of the Event Notification object to be sent to the clients via nc_server_send_notif()
303 * and freed using nc_server_notif_free().
304 */
Radek Krejci6799a052017-05-19 14:23:23 +0200305struct nc_server_notif *nc_server_notif_new(struct lyd_node *event, char *eventtime, NC_PARAMTYPE paramtype);
Radek Krejci93e80222016-10-03 13:34:25 +0200306
307/**
308 * @brief Send NETCONF Event Notification via the session.
309 *
310 * @param[in] session NETCONF session where the Event Notification will be written.
311 * @param[in] notif NETCOFN Notification object to send via specified session. Object can be created by
312 * nc_notif_new() function.
313 * @param[in] timeout Timeout for writing in milliseconds. Use negative value for infinite
314 * waiting and 0 for return if data cannot be sent immediately.
315 * @return #NC_MSG_NOTIF on success,
316 * #NC_MSG_WOULDBLOCK in case of a busy session, and
317 * #NC_MSG_ERROR on error.
318 */
319NC_MSG_TYPE nc_server_notif_send(struct nc_session *session, struct nc_server_notif *notif, int timeout);
320
321/**
322 * @brief Free a server Event Notification object.
323 *
324 * @param[in] notif Server Event Notification object to free.
325 */
326void nc_server_notif_free(struct nc_server_notif *notif);
327
Michal Vasko9a2e4d22017-03-17 09:44:49 +0100328/**
329 * @brief Get the notification timestamp.
330 *
331 * @param[in] notif Server notification to read from.
332 * @return Datetime timestamp of the notification, NULL on error.
333 */
334const char *nc_server_notif_get_time(const struct nc_server_notif *notif);
335
Michal Vaskoc446a382021-06-18 08:54:05 +0200336/** @} Client Messages */
Radek Krejci6799a052017-05-19 14:23:23 +0200337
Michal Vaskoc09730e2019-01-17 10:07:26 +0100338#ifdef __cplusplus
339}
340#endif
341
Michal Vasko7bcb48e2016-01-15 10:28:54 +0100342#endif /* NC_MESSAGES_SERVER_H_ */