Line data Source code
1 : /*
2 : * Copyright (c) 2019 Cisco and/or its affiliates.
3 : * Licensed under the Apache License, Version 2.0 (the "License");
4 : * you may not use this file except in compliance with the License.
5 : * You may obtain a copy of the License at:
6 : *
7 : * http://www.apache.org/licenses/LICENSE-2.0
8 : *
9 : * Unless required by applicable law or agreed to in writing, software
10 : * distributed under the License is distributed on an "AS IS" BASIS,
11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : * See the License for the specific language governing permissions and
13 : * limitations under the License.
14 : */
15 :
16 : #include <http_static/http_static.h>
17 : #include <vpp/app/version.h>
18 :
19 : hss_url_handler_rc_t
20 0 : handle_get_version (hss_url_handler_args_t *args)
21 : {
22 0 : u8 *s = 0;
23 :
24 0 : s = format (s, "{\"vpp_details\": {");
25 0 : s = format (s, " \"version\": \"%s\",", VPP_BUILD_VER);
26 0 : s = format (s, " \"build_date\": \"%s\"}}\r\n", VPP_BUILD_DATE);
27 :
28 0 : args->data = s;
29 0 : args->data_len = vec_len (s);
30 0 : args->free_vec_data = 1;
31 0 : return HSS_URL_HANDLER_OK;
32 : }
33 :
34 : void
35 0 : trim_path_from_request (u8 *s, char *path)
36 : {
37 : u8 *cp;
38 0 : int trim_length = strlen (path) + 1 /* remove '?' */;
39 :
40 : /* Get rid of the path and question-mark */
41 0 : vec_delete (s, trim_length, 0);
42 :
43 : /* Tail trim irrelevant browser info */
44 0 : cp = s;
45 0 : while ((cp - s) < vec_len (s))
46 : {
47 0 : if (*cp == ' ')
48 : {
49 : /*
50 : * Makes request a vector which happens to look
51 : * like a c-string.
52 : */
53 0 : *cp = 0;
54 0 : vec_set_len (s, cp - s);
55 0 : break;
56 : }
57 0 : cp++;
58 : }
59 0 : }
60 :
61 : hss_url_handler_rc_t
62 0 : handle_get_interface_stats (hss_url_handler_args_t *args)
63 : {
64 0 : u8 *s = 0, *stats = 0;
65 : uword *p;
66 0 : u32 *sw_if_indices = 0;
67 : vnet_hw_interface_t *hi;
68 : vnet_sw_interface_t *si;
69 0 : char *q = "\"";
70 : int i;
71 0 : int need_comma = 0;
72 : u8 *format_vnet_sw_interface_cntrs (u8 * s, vnet_interface_main_t * im,
73 : vnet_sw_interface_t * si, int json);
74 0 : vnet_main_t *vnm = vnet_get_main ();
75 0 : vnet_interface_main_t *im = &vnm->interface_main;
76 :
77 : /* Get stats for a single interface via http POST */
78 0 : if (args->reqtype == HTTP_REQ_POST)
79 : {
80 0 : trim_path_from_request (args->request, "interface_stats.json");
81 :
82 : /* Find the sw_if_index */
83 0 : p = hash_get (im->hw_interface_by_name, args->request);
84 0 : if (!p)
85 : {
86 0 : s = format (s, "{\"interface_stats\": {[\n");
87 0 : s = format (s, " \"name\": \"%s\",", args->request);
88 0 : s = format (s, " \"error\": \"%s\"", "UnknownInterface");
89 0 : s = format (s, "]}\n");
90 0 : goto out;
91 : }
92 :
93 0 : vec_add1 (sw_if_indices, p[0]);
94 : }
95 : else /* default, HTTP_BUILTIN_METHOD_GET */
96 : {
97 0 : pool_foreach (hi, im->hw_interfaces)
98 : {
99 0 : vec_add1 (sw_if_indices, hi->sw_if_index);
100 : }
101 : }
102 :
103 0 : s = format (s, "{%sinterface_stats%s: [\n", q, q);
104 :
105 0 : for (i = 0; i < vec_len (sw_if_indices); i++)
106 : {
107 0 : si = vnet_get_sw_interface (vnm, sw_if_indices[i]);
108 0 : if (need_comma)
109 0 : s = format (s, ",\n");
110 :
111 0 : need_comma = 1;
112 :
113 0 : s = format (s, "{%sname%s: %s%U%s, ", q, q, q,
114 0 : format_vnet_sw_if_index_name, vnm, sw_if_indices[i], q);
115 :
116 0 : stats = format_vnet_sw_interface_cntrs (stats, &vnm->interface_main, si,
117 : 1 /* want json */);
118 0 : if (vec_len (stats))
119 0 : s = format (s, "%v}", stats);
120 : else
121 0 : s = format (s, "%snone%s: %strue%s}", q, q, q, q);
122 0 : vec_reset_length (stats);
123 : }
124 :
125 0 : s = format (s, "]}\n");
126 :
127 0 : out:
128 0 : args->data = s;
129 0 : args->data_len = vec_len (s);
130 0 : args->free_vec_data = 1;
131 0 : vec_free (sw_if_indices);
132 0 : vec_free (stats);
133 0 : return HSS_URL_HANDLER_OK;
134 : }
135 :
136 : hss_url_handler_rc_t
137 0 : handle_get_interface_list (hss_url_handler_args_t *args)
138 : {
139 0 : u8 *s = 0;
140 : int i;
141 0 : vnet_main_t *vnm = vnet_get_main ();
142 0 : vnet_interface_main_t *im = &vnm->interface_main;
143 : vnet_hw_interface_t *hi;
144 0 : u32 *hw_if_indices = 0;
145 0 : int need_comma = 0;
146 :
147 : /* Construct vector of active hw_if_indexes ... */
148 0 : pool_foreach (hi, im->hw_interfaces)
149 : {
150 : /* No point in mentioning "local0"... */
151 0 : if (hi - im->hw_interfaces)
152 0 : vec_add1 (hw_if_indices, hi - im->hw_interfaces);
153 : }
154 :
155 : /* Build answer */
156 0 : s = format (s, "{\"interface_list\": [\n");
157 0 : for (i = 0; i < vec_len (hw_if_indices); i++)
158 : {
159 0 : if (need_comma)
160 0 : s = format (s, ",\n");
161 0 : hi = pool_elt_at_index (im->hw_interfaces, hw_if_indices[i]);
162 0 : s = format (s, "\"%v\"", hi->name);
163 0 : need_comma = 1;
164 : }
165 0 : s = format (s, "]}\n");
166 0 : vec_free (hw_if_indices);
167 :
168 0 : args->data = s;
169 0 : args->data_len = vec_len (s);
170 0 : args->free_vec_data = 1;
171 0 : return HSS_URL_HANDLER_OK;
172 : }
173 :
174 : void
175 0 : hss_builtinurl_json_handlers_init (void)
176 : {
177 0 : hss_register_url_handler (handle_get_version, "version.json", HTTP_REQ_GET);
178 0 : hss_register_url_handler (handle_get_interface_list, "interface_list.json",
179 : HTTP_REQ_GET);
180 0 : hss_register_url_handler (handle_get_interface_stats, "interface_stats.json",
181 : HTTP_REQ_GET);
182 0 : hss_register_url_handler (handle_get_interface_stats, "interface_stats.json",
183 : HTTP_REQ_POST);
184 0 : }
185 :
186 : /*
187 : * fd.io coding-style-patch-verification: ON
188 : *
189 : * Local Variables:
190 : * eval: (c-set-style "gnu")
191 : * End:
192 : */
|