30 #include <arpa/inet.h>
31 #include <json-c/json.h>
32 #include <rte_byteorder.h>
51 struct json_object *field;
53 if (!json_object_object_get_ex(container, name, &field) || json_object_get_type(field) != json_type_int) {
54 DOCA_LOG_ERR(
"Failed to parse JSON object u64 field '%s' from object: %s",
56 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
61 *val = json_object_get_int64(field);
76 struct json_object *field;
79 if (!json_object_object_get_ex(container, name, &field) || json_object_get_type(field) != json_type_string) {
80 DOCA_LOG_ERR(
"Failed to parse JSON object string field %s from object: %s",
82 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
86 if (sscanf(json_object_get_string(field),
"%lu", &tmp) != 1) {
87 DOCA_LOG_ERR(
"Failed to convert JSON string object to u64 from field %s object: %s",
89 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
108 struct json_object *field;
110 if (!json_object_object_get_ex(container, name, &field) || json_object_get_type(field) != json_type_int) {
111 DOCA_LOG_ERR(
"Failed to parse JSON object u32 field '%s' from object: %s",
113 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
118 *val = json_object_get_int(field);
138 struct json_object *elem;
139 struct json_object *arr;
143 if (!json_object_object_get_ex(container, name, &arr) || json_object_get_type(arr) != json_type_array) {
144 DOCA_LOG_ERR(
"Failed to parse JSON object u32 array field '%s' from object: %s",
146 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
150 elems_num = json_object_array_length(arr);
151 if (elems_num > val_size) {
152 DOCA_LOG_ERR(
"JSON object u32 array field '%s' too big: %s",
154 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
160 for (i = 0; i < elems_num; i++) {
161 elem = json_object_array_get_idx(arr, i);
162 if (!elem || json_object_get_type(elem) != json_type_int) {
163 DOCA_LOG_ERR(
"Failed to parse JSON object u32 array field '%s' from object: %s",
165 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
169 val[i] = json_object_get_int(elem);
172 *val_num = elems_num;
186 struct json_object *field;
189 if (!json_object_object_get_ex(container, name, &field) || json_object_get_type(field) != json_type_int) {
190 DOCA_LOG_ERR(
"Failed to parse JSON object u8 field '%s' from object: %s",
192 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
197 tmp = json_object_get_int(field);
198 if (tmp > UINT8_MAX) {
199 DOCA_LOG_ERR(
"JSON object u8 field '%s' is too big, object: %s",
201 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
219 struct json_object *field;
222 if (!json_object_object_get_ex(container, name, &field) || json_object_get_type(field) != json_type_string) {
223 DOCA_LOG_ERR(
"Failed to parse JSON object string field %s from object: %s",
225 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
229 if (sscanf(json_object_get_string(field),
"%hhu", &tmp) != 1) {
230 DOCA_LOG_ERR(
"Failed to convert JSON string object to integer from field %s object: %s",
232 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
255 struct json_object *field;
257 if (!json_object_object_get_ex(container, name, &field) || json_object_get_type(field) != json_type_string) {
258 DOCA_LOG_ERR(
"Failed to parse JSON object string field %s from object: %s",
260 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
264 if (sscanf(json_object_get_string(field),
265 "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx%*c",
272 DOCA_LOG_ERR(
"Failed to convert JSON string object to integer array from field %s object: %s",
274 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
303 struct json_object *field;
305 if (!json_object_object_get_ex(container, name, &field) || json_object_get_type(field) != json_type_string) {
306 DOCA_LOG_ERR(
"Failed to parse JSON object string field '%s' from object: %s",
308 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
312 if ((uint32_t)json_object_get_string_len(field) >= val_len) {
313 DOCA_LOG_ERR(
"Failed to copy JSON object string field '%s': string too big", name);
318 strncpy(val, json_object_get_string(field), val_len);
331 uint8_t o1, o2, o3, o4;
334 if (sscanf(str_addr,
"%hhd.%hhd.%hhd.%hhd/%hhd", &o1, &o2, &o3, &o4, &netmask) < 4)
337 val->
v4 = ((uint32_t)o1 << 24) | ((uint32_t)o2 << 16) | ((uint32_t)o3 << 8) | (uint32_t)o4;
338 val->
netmask = netmask ? netmask : 32;
355 ret = sscanf(str_port,
"%hu-%hu", &from_port, &to_port);
361 val->
from = from_port;
378 struct json_object *field;
379 struct json_object *
ip;
380 const char *str_addr;
382 if (!json_object_object_get_ex(container, name, &
ip)) {
383 DOCA_LOG_ERR(
"Failed to parse JSON object IP field '%s' from object: %s",
385 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
389 if (!json_object_object_get_ex(
ip,
"v4", &field) || json_object_get_type(field) != json_type_string) {
390 DOCA_LOG_ERR(
"Failed to parse JSON object IPv4 from object: %s",
391 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
395 str_addr = json_object_get_string(field);
398 DOCA_LOG_ERR(
"Failed to parse JSON object IPv4 from object: %s",
399 json_object_to_json_string_ext(container, JSON_C_TO_STRING_PRETTY));
445 if (!strcmp(str_proto,
"ip"))
447 else if (!strcmp(str_proto,
"tcp"))
449 else if (!strcmp(str_proto,
"udp"))
451 else if (sscanf(str_proto,
"%hu", &tmp) == 1)
468 char str_description[129] = {0};
469 struct json_object *sdf;
473 if (json_object_array_length(sdf_arr) != 1) {
474 DOCA_LOG_ERR(
"Failed to parse PDR SDF - unexpected size of object array: %s",
475 json_object_to_json_string_ext(sdf_arr, JSON_C_TO_STRING_PRETTY));
478 sdf = json_object_array_get_idx(sdf_arr, 0);
481 json_object_to_json_string_ext(sdf_arr, JSON_C_TO_STRING_PRETTY));
489 token = strtok_r(str_description,
" ", &parse_ctx);
490 if (!token || strcmp(token,
"permit")) {
491 DOCA_LOG_ERR(
"Only 'permit' action is supported in JSON PDR SDF FD, got token '%s' from object: %s",
492 token ? token :
"NULL",
493 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
496 token = strtok_r(
NULL,
" ", &parse_ctx);
497 if (!token || strcmp(token,
"out")) {
499 "Only outer header description is supported in JSON PDR SDF FD, got token '%s' from object: %s",
500 token ? token :
"NULL",
501 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
504 token = strtok_r(
NULL,
" ", &parse_ctx);
506 DOCA_LOG_ERR(
"Failed to parse protocol in JSON PDR SDF FD, got token '%s' from object: %s",
507 token ? token :
"NULL",
508 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
511 token = strtok_r(
NULL,
" ", &parse_ctx);
512 if (!token || strcmp(token,
"from")) {
513 DOCA_LOG_ERR(
"Unexpected value JSON PDR SDF FD 'from', got token '%s' from object: %s",
514 token ? token :
"NULL",
515 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
518 token = strtok_r(
NULL,
" ", &parse_ctx);
519 if (!token || (strcmp(token,
"any") &&
522 "Failed to parse IP address in JSON PDR SDF FD 'from' position, got token '%s' from object: %s",
523 token ? token :
"NULL",
524 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
527 token = strtok_r(
NULL,
" ", &parse_ctx);
529 DOCA_LOG_ERR(
"Empty port range in JSON PDR SDF FD 'from' position in object: %s",
530 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
533 token = strtok_r(
NULL,
" ", &parse_ctx);
539 if (!token || strcmp(token,
"to")) {
540 DOCA_LOG_ERR(
"Unexpected value JSON PDR SDF FD 'to', got token '%s' from object: %s",
541 token ? token :
"NULL",
542 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
545 token = strtok_r(
NULL,
" ", &parse_ctx);
546 if (!token || (strcmp(token,
"assigned") &&
549 "Failed to parse IP address in JSON PDR SDF FD 'to' position, got token '%s' from object: %s",
550 token ? token :
"NULL",
551 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
554 token = strtok_r(
NULL,
" ", &parse_ctx);
558 "Failed to parse port range in JSON PDR SDF FD 'to' position, got token '%s' from object: %s",
560 json_object_to_json_string_ext(sdf, JSON_C_TO_STRING_PRETTY));
580 struct json_object *local_fteid;
581 struct json_object *ue;
582 struct json_object *si;
586 if (!json_object_object_get_ex(pdi,
"sourceInterface", &si)) {
587 DOCA_LOG_ERR(
"Failed to parse JSON PDR SI child object");
598 if (json_object_object_get_ex(pdi,
"localFT", &local_fteid)) {
604 if (json_object_object_get(pdi,
"qfi") &&
608 if (!json_object_object_get_ex(pdi,
"userEquipment", &ue) ||
627 struct json_object *pdr;
628 struct json_object *pdi;
635 num_pdrs = json_object_array_length(pdr_arr);
636 pdrs = rte_zmalloc(
"UPF PDRs",
sizeof(*pdrs) +
sizeof(pdrs->
arr_pdrs[0]) *
num_pdrs, RTE_CACHE_LINE_SIZE);
644 pdr = json_object_array_get_idx(pdr_arr, i);
647 DOCA_LOG_ERR(
"Failed to parse JSON PDR object id %lu", i);
651 DOCA_LOG_DBG(
"PDR:\n%s", json_object_to_json_string_ext(pdr, JSON_C_TO_STRING_PRETTY));
677 DOCA_LOG_ERR(
"Each PDR must have at least one QER (has %u) and exactly one URR (has %u)",
684 if (!json_object_object_get_ex(pdr,
"pdi", &pdi)) {
685 DOCA_LOG_ERR(
"Failed to parse JSON PDR PDI child object");
694 "Parsed PDR id=%u\n\tfarId=%u first_urrid=%u first_qerid=%u\n\tPDI SI=%u QFI=%hhu teid_start=%u teid_end=%u IP=%x/%hhu UEIP=%x/%hhu\n\t\tSDF proto=%d from=%x/%hhu:%hu-%hu to=%x/%hhu:%hu-%hu",
750 DOCA_LOG_ERR(
"Failed to parse JSON object IP from object: %s",
751 json_object_to_json_string_ext(oh, JSON_C_TO_STRING_PRETTY));
767 struct json_object *oh;
769 if (json_object_object_get_ex(fp,
"outerHeader", &oh)) {
786 struct json_object *far;
788 struct json_object *fp;
794 num_fars = json_object_array_length(far_arr);
795 fars = rte_zmalloc(
"UPF FARs",
sizeof(*fars) +
sizeof(fars->
arr_fars[0]) *
num_fars, RTE_CACHE_LINE_SIZE);
803 far = json_object_array_get_idx(far_arr, i);
806 DOCA_LOG_ERR(
"Failed to parse JSON FAR object id %lu", i);
810 DOCA_LOG_DBG(
"FAR:\n%s", json_object_to_json_string_ext(far, JSON_C_TO_STRING_PRETTY));
817 if (json_object_object_get_ex(far,
"fp", &fp)) {
824 "\tOuter Header ip=%x/%hhu",
874 struct json_object *volume_quota;
875 struct json_object *urr;
882 num_urrs = json_object_array_length(urr_arr);
883 urrs = rte_zmalloc(
"UPF URRs",
sizeof(*urrs) +
sizeof(urrs->
arr_urrs[0]) *
num_urrs, RTE_CACHE_LINE_SIZE);
891 urr = json_object_array_get_idx(urr_arr, i);
894 DOCA_LOG_ERR(
"Failed to parse JSON URR object id %lu", i);
898 DOCA_LOG_DBG(
"URR:\n%s", json_object_to_json_string_ext(urr, JSON_C_TO_STRING_PRETTY));
905 if (!json_object_object_get_ex(urr,
"volumeQuota", &volume_quota)) {
906 DOCA_LOG_ERR(
"Failed to parse JSON URR volume quota child object");
914 DOCA_LOG_INFO(
"Parsed URR id=%u volume_quota_total_volume=%lu\n",
963 struct json_object *mbr;
964 struct json_object *qer;
971 num_qers = json_object_array_length(qer_arr);
972 qers = rte_zmalloc(
"UPF QERs",
sizeof(*qers) +
sizeof(qers->
arr_qers[0]) *
num_qers, RTE_CACHE_LINE_SIZE);
985 qer = json_object_array_get_idx(qer_arr, i);
988 DOCA_LOG_ERR(
"Failed to parse JSON QER object id %lu", i);
992 DOCA_LOG_DBG(
"QER:\n%s", json_object_to_json_string_ext(qer, JSON_C_TO_STRING_PRETTY));
1000 if (!json_object_object_get_ex(qer,
"maxBitRate", &mbr)) {
1001 DOCA_LOG_ERR(
"Failed to parse JSON QER mbr child object");
1011 "\tMBR dl=%lu ul=%lu\n",
1033 rte_free(
cfg->qers);
1045 struct json_object *pdr_arr;
1046 struct json_object *far_arr;
1047 struct json_object *urr_arr;
1048 struct json_object *qer_arr;
1049 struct json_object *root;
1052 root = json_object_from_file(
cfg->smf_config_file_path);
1054 DOCA_LOG_ERR(
"Failed to parse JSON SMF config: %s",
cfg->smf_config_file_path);
1058 if (!json_object_object_get_ex(root,
"createPdr", &pdr_arr) ||
1059 json_object_get_type(pdr_arr) != json_type_array) {
1065 if (!json_object_object_get_ex(root,
"createFar", &far_arr) ||
1066 json_object_get_type(far_arr) != json_type_array) {
1072 if (!json_object_object_get_ex(root,
"createUrr", &urr_arr) ||
1073 json_object_get_type(urr_arr) != json_type_array) {
1079 if (!json_object_object_get_ex(root,
"createQer", &qer_arr) ||
1080 json_object_get_type(qer_arr) != json_type_array) {
1102 json_object_put(root);
1112 json_object_put(root);
1140 struct json_object *vxlan;
1145 num_vxlans = json_object_array_length(vxlan_arr);
1146 vxlans = rte_zmalloc(
"UPF VXLANs",
1147 sizeof(*vxlans) +
sizeof(vxlans->
arr_vxlans[0]) * num_vxlans,
1148 RTE_CACHE_LINE_SIZE);
1155 for (i = 0; i < num_vxlans; i++) {
1156 vxlan = json_object_array_get_idx(vxlan_arr, i);
1159 DOCA_LOG_ERR(
"Failed to parse JSON VXLAN object id %lu", i);
1163 DOCA_LOG_DBG(
"VXLAN:\n%s", json_object_to_json_string_ext(vxlan, JSON_C_TO_STRING_PRETTY));
1181 "\tMAC=%hhu:%hhu:%hhu:%hhu:%hhu:%hhu\n"
1193 cfg->vxlans = vxlans;
1208 rte_free(
cfg->vxlans);
1220 struct json_object *vxlan_arr;
1221 struct json_object *root;
1224 root = json_object_from_file(
cfg->vxlan_config_file_path);
1226 DOCA_LOG_ERR(
"Failed to parse JSON VXLAN config: %s",
cfg->vxlan_config_file_path);
1230 if (!json_object_object_get_ex(root,
"CreateVXLAN", &vxlan_arr) ||
1231 json_object_get_type(vxlan_arr) != json_type_array) {
1241 json_object_put(root);
1245 json_object_put(root);
enum doca_error doca_error_t
DOCA API return codes.
@ DOCA_ERROR_INVALID_VALUE
#define DOCA_FLOW_ETHER_ADDR_LEN
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
#define DOCA_LOG_DBG(format,...)
Generates a DEBUG application log message.
const struct ip_frag_config * cfg
struct upf_accel_ip_addr fp_oh_ip
struct upf_accel_far arr_fars[]
uint32_t qerids[UPF_ACCEL_PDR_QERIDS_LEN]
struct upf_accel_ip_addr pdi_sdf_to_ip
struct upf_accel_ip_addr pdi_local_teid_ip
struct upf_accel_ip_addr pdi_sdf_from_ip
uint32_t pdi_local_teid_start
uint32_t pdi_local_teid_end
struct upf_accel_ip_addr pdi_ueip
uint32_t urrids[UPF_ACCEL_PDR_URRIDS_LEN]
struct upf_accel_ip_port_range pdi_sdf_from_port_range
enum upf_accel_pdr_pdi_si pdi_si
struct upf_accel_ip_port_range pdi_sdf_to_port_range
struct upf_accel_pdr arr_pdrs[]
struct upf_accel_qer arr_qers[]
uint64_t volume_quota_total_volume
struct upf_accel_urr arr_urrs[]
uint8_t mac[DOCA_FLOW_ETHER_ADDR_LEN]
struct upf_accel_vxlan arr_vxlans[]
#define UPF_ACCEL_PDR_URRIDS_LEN
#define UPF_ACCEL_PDR_QERIDS_LEN
#define UPF_ACCEL_MAX_PDR_NUM_RATE_METERS
#define UPF_ACCEL_MAX_NUM_PDR
@ UPF_ACCEL_PDR_PDI_SI_DL
@ UPF_ACCEL_PDR_PDI_SI_UL
static void upf_accel_far_cleanup(struct upf_accel_config *cfg)
static doca_error_t upf_accel_json_u32_parse(struct json_object *container, const char *name, uint32_t *val)
void upf_accel_vxlan_cleanup(struct upf_accel_config *cfg)
static void upf_accel_qer_cleanup(struct upf_accel_config *cfg)
doca_error_t upf_accel_vxlan_parse(struct upf_accel_config *cfg)
static void upf_accel_vxlan_arr_cleanup(struct upf_accel_config *cfg)
static doca_error_t upf_accel_sdf_parse(struct json_object *sdf_arr, struct upf_accel_pdr *upf_accel_pdr)
static doca_error_t upf_accel_json_u64_from_string_parse(struct json_object *container, const char *name, uint64_t *val)
static doca_error_t upf_accel_volume_quota_parse(struct json_object *volume_quota, struct upf_accel_urr *upf_accel_urr)
static doca_error_t upf_accel_json_u32_arr_parse(struct json_object *container, const char *name, size_t val_size, uint32_t *val, uint32_t *val_num)
static doca_error_t upf_accel_json_ip_parse(struct json_object *container, const char *name, struct upf_accel_ip_addr *val)
static doca_error_t upf_accel_oh_parse(struct json_object *oh, struct upf_accel_far *upf_accel_far)
static doca_error_t upf_accel_json_u8_parse(struct json_object *container, const char *name, uint8_t *val)
static doca_error_t upf_accel_qer_parse(struct json_object *qer_arr, struct upf_accel_config *cfg)
static doca_error_t upf_accel_str_to_proto_parse(const char *str_proto, uint16_t *val)
static doca_error_t upf_accel_str_to_ip_netmask_parse(const char *str_addr, struct upf_accel_ip_addr *val)
static void upf_accel_urr_cleanup(struct upf_accel_config *cfg)
static doca_error_t upf_accel_urr_parse(struct json_object *urr_arr, struct upf_accel_config *cfg)
static doca_error_t upf_accel_local_fteid_parse(struct json_object *local_fteid, struct upf_accel_pdr *upf_accel_pdr)
void upf_accel_smf_cleanup(struct upf_accel_config *cfg)
DOCA_LOG_REGISTER(UPF_ACCEL::JSON_PARSER)
static void upf_accel_pdr_cleanup(struct upf_accel_config *cfg)
static doca_error_t upf_accel_json_string_parse(struct json_object *container, const char *name, char *val, size_t val_len)
static doca_error_t upf_accel_pdr_parse(struct json_object *pdr_arr, struct upf_accel_config *cfg)
static doca_error_t upf_accel_json_u64_parse(struct json_object *container, const char *name, uint64_t *val)
static doca_error_t upf_accel_mbr_parse(struct json_object *mbr, struct upf_accel_qer *upf_accel_qer)
static doca_error_t upf_accel_far_parse(struct json_object *far_arr, struct upf_accel_config *cfg)
static doca_error_t upf_accel_fp_parse(struct json_object *fp, struct upf_accel_far *upf_accel_far)
doca_error_t upf_accel_smf_parse(struct upf_accel_config *cfg)
static doca_error_t upf_accel_vxlan_arr_parse(struct json_object *vxlan_arr, struct upf_accel_config *cfg)
static doca_error_t upf_accel_str_to_port_range_parse(const char *str_port, struct upf_accel_ip_port_range *val)
static doca_error_t upf_accel_json_u8_from_string_parse(struct json_object *container, const char *name, uint8_t *val)
static doca_error_t upf_accel_ue_parse(struct json_object *ue, struct upf_accel_pdr *upf_accel_pdr)
static doca_error_t upf_accel_json_mac_from_string_parse(struct json_object *container, const char *name, uint8_t val[DOCA_FLOW_ETHER_ADDR_LEN])
static doca_error_t upf_accel_pdi_parse(struct json_object *pdi, struct upf_accel_pdr *upf_accel_pdr)