Add encoder for monitoring responses
[trust_router.git] / include / tr_mon.h
1 /*
2  * Copyright (c) 2018, JANET(UK)
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. Neither the name of JANET(UK) nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31  * OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  */
34
35
36 #ifndef TRUST_ROUTER_TR_MON_REQ_H
37 #define TRUST_ROUTER_TR_MON_REQ_H
38
39 #include <talloc.h>
40 #include <jansson.h>
41 #include <gmodule.h>
42 #include <tr_name_internal.h>
43
44 /* Typedefs */
45 typedef struct tr_mon_req TR_MON_REQ;
46 typedef struct tr_mon_resp TR_MON_RESP;
47
48 typedef enum tr_mon_cmd TR_MON_CMD;
49 typedef enum tr_mon_resp_code TR_MON_RESP_CODE;
50
51 typedef struct tr_mon_opt TR_MON_OPT;
52 typedef enum tr_mon_opt_type TR_MON_OPT_TYPE;
53
54 typedef enum tr_mon_rc TR_MON_RC;
55
56
57 /* Struct and enum definitions */
58 enum tr_mon_rc {
59   TR_MON_SUCCESS=0,
60   TR_MON_ERROR, /* generic error */
61   TR_MON_BADARG, /* problem with the arguments */
62   TR_MON_NOMEM, /* out of memory */
63   TR_MON_NOPARSE, /* parsing failed */
64 };
65
66 enum tr_mon_cmd {
67   MON_CMD_UNKNOWN=0,
68   MON_CMD_RECONFIGURE,
69   MON_CMD_SHOW
70 };
71
72 /* These should be explicitly numbered because they form part of the public API */
73 enum tr_mon_resp_code {
74   MON_RESP_SUCCESS=0,
75   MON_RESP_ERROR=1, // generic error
76 };
77
78 enum tr_mon_opt_type {
79   OPT_TYPE_UNKNOWN=0,
80
81   // System information
82   OPT_TYPE_SHOW_VERSION,
83   OPT_TYPE_SHOW_SERIAL,
84
85   // System statistics
86   OPT_TYPE_SHOW_UPTIME,
87   OPT_TYPE_SHOW_TID_REQ_COUNT,
88   OPT_TYPE_SHOW_TID_REQ_PENDING,
89
90   // Dynamic trust router state
91   OPT_TYPE_SHOW_ROUTES,
92   OPT_TYPE_SHOW_COMMUNITIES
93 };
94
95 struct tr_mon_opt {
96   TR_MON_OPT_TYPE type;
97 };
98
99 struct tr_mon_req {
100   TR_MON_CMD command;
101   GArray *options;
102 };
103
104 struct tr_mon_resp {
105   TR_MON_REQ *req; // request this responds to
106   TR_MON_RESP_CODE code;
107   TR_NAME *message;
108   json_t *payload;
109 };
110
111 /* Prototypes */
112 /* tr_mon.c */
113 const char *cmd_to_string(TR_MON_CMD cmd);
114 TR_MON_CMD cmd_from_string(const char *s);
115 const char *opt_type_to_string(TR_MON_OPT_TYPE opt_type);
116 TR_MON_OPT_TYPE opt_type_from_string(const char *s);
117
118 /* tr_mon_req.c */
119 TR_MON_REQ *tr_mon_req_new(TALLOC_CTX *mem_ctx, TR_MON_CMD cmd);
120 void tr_mon_req_free(TR_MON_REQ *req);
121 TR_MON_RC tr_mon_req_add_option(TR_MON_REQ *req, TR_MON_OPT_TYPE opt_type);
122 size_t tr_mon_req_opt_count(TR_MON_REQ *req);
123 TR_MON_OPT *tr_mon_req_opt_index(TR_MON_REQ *req, size_t index);
124
125 /* tr_mon_req_encode.c */
126 json_t *tr_mon_req_encode(TR_MON_REQ *req);
127
128 /* tr_mon_req_decode.c */
129 TR_MON_REQ *tr_mon_req_decode(TALLOC_CTX *mem_ctx, const char *req_json);
130
131 /* tr_mon_resp.c */
132 TR_MON_RESP *tr_mon_resp_new(TALLOC_CTX *mem_ctx,
133                              TR_MON_REQ *req,
134                              TR_MON_RESP_CODE code,
135                              const char *msg,
136                              json_t *payload);
137 void tr_mon_resp_free(TR_MON_RESP *resp);
138
139 /* tr_mon_resp_encode.c */
140 json_t *tr_mon_resp_encode(TR_MON_RESP *resp);
141
142 #endif //TRUST_ROUTER_TR_MON_REQ_H