xref: /dpdk/app/graph/utils.c (revision 9236e5b31d909b45fa52c5e19adf02108a2052d1)
1984a315aSSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause
2984a315aSSunil Kumar Kori  * Copyright(c) 2023 Marvell.
3984a315aSSunil Kumar Kori  */
4984a315aSSunil Kumar Kori 
5984a315aSSunil Kumar Kori #include <ctype.h>
6984a315aSSunil Kumar Kori #include <errno.h>
7984a315aSSunil Kumar Kori #include <stdio.h>
8984a315aSSunil Kumar Kori #include <stdlib.h>
9984a315aSSunil Kumar Kori #include <string.h>
10984a315aSSunil Kumar Kori 
11984a315aSSunil Kumar Kori #include <rte_common.h>
122df20a1dSDavid Marchand #include <rte_string_fns.h>
13984a315aSSunil Kumar Kori 
14984a315aSSunil Kumar Kori #include "module_api.h"
15984a315aSSunil Kumar Kori 
16984a315aSSunil Kumar Kori static void
17984a315aSSunil Kumar Kori hex_string_to_uint64(uint64_t *dst, const char *hexs)
18984a315aSSunil Kumar Kori {
19984a315aSSunil Kumar Kori 	char buf[2] = {0};
20984a315aSSunil Kumar Kori 	uint8_t shift = 4;
21984a315aSSunil Kumar Kori 	int iter = 0;
22984a315aSSunil Kumar Kori 	char c;
23984a315aSSunil Kumar Kori 
24984a315aSSunil Kumar Kori 	while ((c = *hexs++)) {
25984a315aSSunil Kumar Kori 		buf[0] = c;
26984a315aSSunil Kumar Kori 		*dst |= (strtol(buf, NULL, 16) << shift);
27984a315aSSunil Kumar Kori 		shift -= 4;
28984a315aSSunil Kumar Kori 		iter++;
29984a315aSSunil Kumar Kori 		if (iter == 2) {
30984a315aSSunil Kumar Kori 			iter = 0;
31984a315aSSunil Kumar Kori 			shift = 4;
32984a315aSSunil Kumar Kori 			dst++;
33984a315aSSunil Kumar Kori 		}
34984a315aSSunil Kumar Kori 	}
35984a315aSSunil Kumar Kori }
36984a315aSSunil Kumar Kori 
37984a315aSSunil Kumar Kori int
38984a315aSSunil Kumar Kori parser_uint64_read(uint64_t *value, const char *p)
39984a315aSSunil Kumar Kori {
40984a315aSSunil Kumar Kori 	char *next;
41984a315aSSunil Kumar Kori 	uint64_t val;
42984a315aSSunil Kumar Kori 
432df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
44984a315aSSunil Kumar Kori 	if (!isdigit(*p))
45984a315aSSunil Kumar Kori 		return -EINVAL;
46984a315aSSunil Kumar Kori 
47984a315aSSunil Kumar Kori 	val = strtoul(p, &next, 0);
48984a315aSSunil Kumar Kori 	if (p == next)
49984a315aSSunil Kumar Kori 		return -EINVAL;
50984a315aSSunil Kumar Kori 
51984a315aSSunil Kumar Kori 	p = next;
52984a315aSSunil Kumar Kori 	switch (*p) {
53984a315aSSunil Kumar Kori 	case 'T':
54984a315aSSunil Kumar Kori 		val *= 1024ULL;
55984a315aSSunil Kumar Kori 		/* fall through */
56984a315aSSunil Kumar Kori 	case 'G':
57984a315aSSunil Kumar Kori 		val *= 1024ULL;
58984a315aSSunil Kumar Kori 		/* fall through */
59984a315aSSunil Kumar Kori 	case 'M':
60984a315aSSunil Kumar Kori 		val *= 1024ULL;
61984a315aSSunil Kumar Kori 		/* fall through */
62984a315aSSunil Kumar Kori 	case 'k':
63984a315aSSunil Kumar Kori 	case 'K':
64984a315aSSunil Kumar Kori 		val *= 1024ULL;
65984a315aSSunil Kumar Kori 		p++;
66984a315aSSunil Kumar Kori 		break;
67984a315aSSunil Kumar Kori 	}
68984a315aSSunil Kumar Kori 
692df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
70984a315aSSunil Kumar Kori 	if (*p != '\0')
71984a315aSSunil Kumar Kori 		return -EINVAL;
72984a315aSSunil Kumar Kori 
73984a315aSSunil Kumar Kori 	*value = val;
74984a315aSSunil Kumar Kori 	return 0;
75984a315aSSunil Kumar Kori }
76984a315aSSunil Kumar Kori 
77984a315aSSunil Kumar Kori int
78984a315aSSunil Kumar Kori parser_uint32_read(uint32_t *value, const char *p)
79984a315aSSunil Kumar Kori {
80984a315aSSunil Kumar Kori 	uint64_t val = 0;
81984a315aSSunil Kumar Kori 	int rc = parser_uint64_read(&val, p);
82984a315aSSunil Kumar Kori 
83984a315aSSunil Kumar Kori 	if (rc < 0)
84984a315aSSunil Kumar Kori 		return rc;
85984a315aSSunil Kumar Kori 
86984a315aSSunil Kumar Kori 	if (val > UINT32_MAX)
87984a315aSSunil Kumar Kori 		return -ERANGE;
88984a315aSSunil Kumar Kori 
89984a315aSSunil Kumar Kori 	*value = val;
90984a315aSSunil Kumar Kori 	return 0;
91984a315aSSunil Kumar Kori }
92984a315aSSunil Kumar Kori 
93984a315aSSunil Kumar Kori int
94984a315aSSunil Kumar Kori parser_ip4_read(uint32_t *value, char *p)
95984a315aSSunil Kumar Kori {
96984a315aSSunil Kumar Kori 	uint8_t shift = 24;
97984a315aSSunil Kumar Kori 	uint32_t ip = 0;
98*9236e5b3SStephen Hemminger 	char *token, *saveptr = NULL;
99984a315aSSunil Kumar Kori 
100*9236e5b3SStephen Hemminger 	token = strtok_r(p, ".", &saveptr);
101984a315aSSunil Kumar Kori 	while (token != NULL) {
102984a315aSSunil Kumar Kori 		ip |= (((uint32_t)strtoul(token, NULL, 10)) << shift);
103*9236e5b3SStephen Hemminger 		token = strtok_r(NULL, ".", &saveptr);
104984a315aSSunil Kumar Kori 		shift -= 8;
105984a315aSSunil Kumar Kori 	}
106984a315aSSunil Kumar Kori 
107984a315aSSunil Kumar Kori 	*value = ip;
108984a315aSSunil Kumar Kori 
109984a315aSSunil Kumar Kori 	return 0;
110984a315aSSunil Kumar Kori }
111984a315aSSunil Kumar Kori 
112984a315aSSunil Kumar Kori int
113984a315aSSunil Kumar Kori parser_ip6_read(uint8_t *value, char *p)
114984a315aSSunil Kumar Kori {
115984a315aSSunil Kumar Kori 	uint64_t val = 0;
116*9236e5b3SStephen Hemminger 	char *token, *saveptr = NULL;
117984a315aSSunil Kumar Kori 
118*9236e5b3SStephen Hemminger 	token = strtok_r(p, ":", &saveptr);
119984a315aSSunil Kumar Kori 	while (token != NULL) {
120984a315aSSunil Kumar Kori 		hex_string_to_uint64(&val, token);
121984a315aSSunil Kumar Kori 		*value = val;
122*9236e5b3SStephen Hemminger 		token = strtok_r(NULL, ":", &saveptr);
123984a315aSSunil Kumar Kori 		value++;
124984a315aSSunil Kumar Kori 		val = 0;
125984a315aSSunil Kumar Kori 	}
126984a315aSSunil Kumar Kori 
127984a315aSSunil Kumar Kori 	return 0;
128984a315aSSunil Kumar Kori }
129984a315aSSunil Kumar Kori 
130984a315aSSunil Kumar Kori int
131984a315aSSunil Kumar Kori parser_mac_read(uint64_t *value, char *p)
132984a315aSSunil Kumar Kori {
133984a315aSSunil Kumar Kori 	uint64_t mac = 0, val = 0;
134984a315aSSunil Kumar Kori 	uint8_t shift = 40;
135*9236e5b3SStephen Hemminger 	char *token, *saveptr = NULL;
136984a315aSSunil Kumar Kori 
137*9236e5b3SStephen Hemminger 	token = strtok_r(p, ":", &saveptr);
138984a315aSSunil Kumar Kori 	while (token != NULL) {
139984a315aSSunil Kumar Kori 		hex_string_to_uint64(&val, token);
140984a315aSSunil Kumar Kori 		mac |= val << shift;
141*9236e5b3SStephen Hemminger 		token = strtok_r(NULL, ":", &saveptr);
142984a315aSSunil Kumar Kori 		shift -= 8;
143984a315aSSunil Kumar Kori 		val = 0;
144984a315aSSunil Kumar Kori 	}
145984a315aSSunil Kumar Kori 
146984a315aSSunil Kumar Kori 	*value = mac;
147984a315aSSunil Kumar Kori 
148984a315aSSunil Kumar Kori 	return 0;
149984a315aSSunil Kumar Kori }
150