Line data Source code
1 : /*
2 : * vt_gen_lib.c --
3 : *
4 : * Copyright(c) 2015, Juniper Networks, Inc.
5 : * Copyright Contributors to the OpenSDN project
6 : * All rights reserved
7 : */
8 : #include <stdio.h>
9 : #include <string.h>
10 : #include <inttypes.h>
11 : #include <stdlib.h>
12 : #include <stdbool.h>
13 : #include <errno.h>
14 : #include <ctype.h>
15 : #include <strings.h>
16 :
17 : #include <vr_types.h>
18 : #include <vt_gen_lib.h>
19 :
20 : unsigned char *
21 0 : vt_gen_skip_space(unsigned char *string)
22 : {
23 0 : unsigned int i = 0, len;
24 :
25 0 : if (!string)
26 0 : return string;
27 :
28 0 : len = strlen(string);
29 0 : if (!len)
30 0 : return string;
31 :
32 0 : while ((i < len) && isspace(string[i])) {
33 0 : i++;
34 : }
35 :
36 0 : if (i == len)
37 0 : return NULL;
38 :
39 0 : return &string[i];
40 : }
41 :
42 : unsigned char *
43 0 : vt_gen_skip_char(unsigned char *string, unsigned char c)
44 : {
45 0 : unsigned int i = 0, len;
46 :
47 0 : if (!string)
48 0 : return string;
49 :
50 0 : len = strlen(string);
51 0 : if (!len)
52 0 : return string;
53 :
54 0 : while ((i < len) && string[i] == c) {
55 0 : i++;
56 : }
57 :
58 0 : if (i == len)
59 0 : return NULL;
60 :
61 0 : return &string[i];
62 : }
63 :
64 : unsigned char *
65 0 : vt_gen_reach_char(unsigned char *string, unsigned char c)
66 : {
67 0 : unsigned int i = 0, len;
68 :
69 0 : if (!string)
70 0 : return string;
71 :
72 0 : len = strlen(string);
73 0 : if (!len)
74 0 : return string;
75 :
76 0 : while ((i < len) && (string[i] != c)) {
77 0 : i++;
78 : }
79 :
80 0 : return &string[i];
81 : }
82 :
83 : unsigned char *
84 0 : vt_gen_reach_space(unsigned char *string)
85 : {
86 0 : return vt_gen_reach_char(string, ' ');
87 : }
88 :
89 : bool
90 0 : vt_gen_byte_compare(uint8_t one, uint8_t two)
91 : {
92 0 : return one == two;
93 : }
94 :
95 : bool
96 0 : vt_gen_short_compare(uint16_t one, uint16_t two)
97 : {
98 0 : return one == two;
99 : }
100 :
101 : bool
102 0 : vt_gen_int_compare(unsigned int one, unsigned int two)
103 : {
104 0 : return one == two;
105 : }
106 :
107 : bool
108 0 : vt_gen_int64_compare(uint64_t one, uint64_t two)
109 : {
110 0 : return one == two;
111 : }
112 :
113 : bool
114 0 : vt_gen_flow_op_compare(int op, unsigned char *string)
115 : {
116 0 : int expected_op = 0;
117 :
118 0 : if (!string)
119 0 : return -1;
120 :
121 0 : if (!strncasecmp(string, "flow_set", strlen("flow_set")) ||
122 0 : !strncasecmp(string, "0", strlen("0"))) {
123 0 : expected_op = FLOW_OP_FLOW_SET;
124 0 : } else if (!strncasecmp(string, "flow_table_get",
125 0 : strlen("flow_table_get")) ||
126 0 : !strncasecmp(string, "2", strlen("2"))) {
127 0 : expected_op = FLOW_OP_FLOW_TABLE_GET;
128 : }
129 :
130 0 : return op == expected_op;
131 : }
132 :
133 : int
134 322 : vt_gen_flow_op(unsigned char *string)
135 : {
136 322 : if (!string)
137 0 : return -1;
138 :
139 322 : if (!strncasecmp(string, "flow_set", strlen("flow_set")) ||
140 322 : !strncasecmp(string, "0", strlen("0"))) {
141 322 : return FLOW_OP_FLOW_SET;
142 0 : } else if (!strncasecmp(string, "flow_table_get",
143 0 : strlen("flow_table_get")) ||
144 0 : !strncasecmp(string, "2", strlen("2"))) {
145 0 : return FLOW_OP_FLOW_TABLE_GET;
146 : }
147 :
148 0 : return -1;
149 : }
150 :
151 : bool
152 0 : vt_gen_op_compare(int op, unsigned char *string)
153 : {
154 0 : int expected_op = 0;
155 :
156 0 : if (!strncasecmp(string, "Add", strlen("Add"))) {
157 0 : expected_op = SANDESH_OP_ADD;
158 0 : } else if (!strncasecmp(string, "Get", strlen("Get"))) {
159 0 : expected_op = SANDESH_OP_GET;
160 0 : } else if (!strncasecmp(string, "Delete", strlen("Delete"))) {
161 0 : expected_op = SANDESH_OP_DEL;
162 0 : } else if (!strncasecmp(string, "Dump", strlen("Dump"))) {
163 0 : expected_op = SANDESH_OP_DUMP;
164 0 : } else if (!strncasecmp(string, "Reset", strlen("Reset"))) {
165 0 : expected_op = SANDESH_OP_RESET;
166 : }
167 :
168 0 : return op == expected_op;
169 : }
170 :
171 : int
172 2472 : vt_gen_op(unsigned char *string)
173 : {
174 2472 : if (!string)
175 0 : return -1;
176 :
177 2472 : if (!strncasecmp(string, "Add", strlen("Add")) ||
178 2472 : !strncasecmp(string, "0", strlen("0"))) {
179 863 : return SANDESH_OP_ADD;
180 1609 : } else if (!strncasecmp(string, "Get", strlen("Get")) ||
181 1609 : !strncasecmp(string, "1", strlen("1"))) {
182 483 : return SANDESH_OP_GET;
183 1126 : } else if (!strncasecmp(string, "Delete", strlen("Delete")) ||
184 1126 : !strncasecmp(string, "2", strlen("2"))) {
185 1122 : return SANDESH_OP_DEL;
186 4 : } else if (!strncasecmp(string, "Dump", strlen("Dump")) ||
187 4 : !strncasecmp(string, "3", strlen("3"))) {
188 0 : return SANDESH_OP_DUMP;
189 4 : } else if (!strncasecmp(string, "Reset", strlen("Reset")) ||
190 4 : !strncasecmp(string, "5", strlen("5"))) {
191 4 : return SANDESH_OP_RESET;
192 : }
193 :
194 0 : return -1;
195 : }
196 :
197 :
198 : /*TODO
199 : *
200 : * Create a generic function -> delimiter and base
201 : * */
202 :
203 : void *
204 0 : vt_gen_list(unsigned char *list, unsigned int type, unsigned int *list_size)
205 : {
206 0 : unsigned int i = 0, j = 0, type_size;
207 : unsigned int string_size;
208 0 : unsigned char *local_list = list;
209 : unsigned char *end;
210 : char *tmp;
211 0 : char *is_colon = NULL;
212 :
213 : unsigned char *store;
214 : uint8_t *store_b;
215 : uint16_t *store_i16;
216 : uint32_t *store_i32;
217 : uint64_t *store_i64;
218 :
219 0 : *list_size = 0;
220 0 : if (!list)
221 0 : return NULL;
222 :
223 0 : switch (type) {
224 0 : case GEN_TYPE_U8:
225 0 : type_size = 1;
226 0 : break;
227 :
228 0 : case GEN_TYPE_U16:
229 0 : type_size = 2;
230 0 : break;
231 :
232 0 : case GEN_TYPE_U32:
233 0 : type_size = 4;
234 0 : break;
235 :
236 0 : case GEN_TYPE_U64:
237 0 : type_size = 8;
238 0 : break;
239 :
240 0 : default:
241 0 : return NULL;
242 : }
243 :
244 0 : string_size = strlen(list);
245 0 : end = list + string_size;
246 :
247 :
248 :
249 : while (1) {
250 0 : local_list = vt_gen_skip_char(local_list, ':');
251 0 : if (!strlen(local_list))
252 0 : break;
253 :
254 0 : j++;
255 :
256 0 : local_list = vt_gen_reach_char(local_list, ':');
257 0 : if (!local_list)
258 0 : break;
259 : }
260 :
261 :
262 0 : store = calloc(j, type_size);
263 0 : if (!store)
264 0 : return NULL;
265 :
266 0 : *list_size = type_size * j;
267 :
268 0 : store_b = (uint8_t *)store;
269 0 : store_i16 = (uint16_t *)store;
270 0 : store_i32 = (uint32_t *)store;
271 0 : store_i64 = (uint64_t *)store;
272 :
273 0 : local_list = list;
274 0 : for (i = 0; i < j; i++) {
275 0 : switch (type) {
276 0 : case GEN_TYPE_U8:
277 : /*TODO For now only mac addresses are mapped to base 16*/
278 0 : store_b[i] = strtoul(local_list, &tmp, 16);
279 0 : break;
280 :
281 0 : case GEN_TYPE_U16:
282 0 : store_i16[i] = strtoul(local_list, &tmp, 0);
283 0 : break;
284 :
285 0 : case GEN_TYPE_U32:
286 0 : store_i32[i] = strtoul(local_list, &tmp, 0);
287 0 : break;
288 :
289 0 : case GEN_TYPE_U64:
290 0 : store_i64[i] = strtoul(local_list, &tmp, 0);
291 0 : break;
292 : }
293 :
294 0 : if (errno == ERANGE) {
295 0 : free(store);
296 0 : return NULL;
297 : }
298 :
299 0 : local_list = tmp;
300 :
301 0 : local_list = vt_gen_skip_char(local_list, ':');
302 :
303 0 : if (!local_list)
304 0 : break;
305 : }
306 :
307 0 : return store;
308 : }
309 :
310 : bool
311 0 : vt_gen_list_compare(void *list, unsigned int list_size,
312 : unsigned char *string, unsigned int type)
313 : {
314 : unsigned int buf_size;
315 : void *buf;
316 :
317 0 : buf = vt_gen_list(string, type, &buf_size);
318 0 : if (!buf)
319 0 : return false;
320 :
321 0 : if (buf_size != list_size)
322 0 : return false;
323 :
324 0 : if (memcmp(list, buf, list_size))
325 0 : return false;
326 :
327 0 : return true;
328 : }
329 :
330 : void *
331 826 : vt_gen_string(char *string)
332 : {
333 : unsigned int string_len;
334 : char *store;
335 :
336 826 : string_len = strlen(string);
337 826 : store = malloc(string_len + 1);
338 826 : if (!store)
339 0 : return NULL;
340 :
341 826 : strcpy(store, string);
342 :
343 826 : return store;
344 : }
345 :
|