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