diff --git a/src/qosmngr.c b/src/qosmngr.c index 90173f3058f447d25b583ce40367ea5c34e60301..a059ceebd395a2b03bf4fbc782199bf0d79fd6fc 100644 --- a/src/qosmngr.c +++ b/src/qosmngr.c @@ -209,101 +209,91 @@ static int init_qstat(void) struct json_object *lan = NULL; if (!json_object_object_get_ex(network, "lan", &lan)) { syslog(LOG_ERR, "lan object not found in board.json"); - json_object_put(network); json_object_put(board_json); ret = -1; goto free_and_return; } struct json_object *wan = NULL; - if (!json_object_object_get_ex(network, "wan", &wan)) { - syslog(LOG_ERR, "wan object not found in board.json"); - ret = -1; - json_object_put(lan); - json_object_put(network); - json_object_put(board_json); - goto free_and_return; + struct json_object *wan_device = NULL; + size_t wan_device_count = 0; + + // its not necessary that board.json has wan section at all + if (json_object_object_get_ex(network, "wan", &wan)) { + if (!json_object_object_get_ex(wan, "device", &wan_device)) { + syslog(LOG_ERR, "wan device object not found in board.json"); + ret = -1; + json_object_put(board_json); + goto free_and_return; + } + wan_device_count = 1; } + struct json_object *lan_ports = NULL; if (!json_object_object_get_ex(lan, "ports", &lan_ports)) { - syslog(LOG_ERR, "ports object not found in board.json"); - ret = -1; - json_object_put(lan); - json_object_put(wan); - json_object_put(network); - json_object_put(board_json); - goto free_and_return; + syslog(LOG_INFO, "lan ports object not found in board.json"); + if (!json_object_object_get_ex(lan, "device", &lan_ports)) { + syslog(LOG_INFO, "lan device object not found in board.json"); + ret = -1; + json_object_put(board_json); + goto free_and_return; + } } - struct json_object *wan_device = NULL; - if (!json_object_object_get_ex(wan, "device", &wan_device)) { - syslog(LOG_ERR, "device object not found in board.json"); - ret = -1; - json_object_put(lan_ports); - json_object_put(lan); - json_object_put(wan); - json_object_put(network); - json_object_put(board_json); - goto free_and_return; - } // create json object for all ports by reading from lan ports and wan device - interface_count = json_object_array_length(lan_ports) + 1; // +1 for wan device + if (json_object_is_type(lan_ports, json_type_array)) { + interface_count = json_object_array_length(lan_ports) + wan_device_count; + } else { + // single lan port device + interface_count = 1 + wan_device_count; + } interfaces = (qos_interface_data *)calloc(interface_count, sizeof(qos_interface_data)); if (interfaces == NULL) { syslog(LOG_ERR, "Initialization failed during memory allocation."); ret = -1; - json_object_put(lan_ports); - json_object_put(wan_device); - json_object_put(lan); - json_object_put(wan); - json_object_put(network); json_object_put(board_json); goto free_and_return; } size_t i = 0; - for (i = 0; i < json_object_array_length(lan_ports); i++) { - struct json_object *l_port_name = json_object_array_get_idx(lan_ports, i); - if (!l_port_name) { - syslog(LOG_ERR, "cannot read lan ports array"); - ret = -1; - json_object_put(lan_ports); - json_object_put(wan_device); - json_object_put(lan); - json_object_put(wan); - json_object_put(network); - json_object_put(board_json); - free(interfaces); - goto free_and_return; - } + if (json_object_is_type(lan_ports, json_type_array)) { + for (i = 0; i < json_object_array_length(lan_ports); i++) { + struct json_object *l_port_name = json_object_array_get_idx(lan_ports, i); + if (!l_port_name) { + syslog(LOG_ERR, "cannot read lan ports array"); + ret = -1; + json_object_put(board_json); + free(interfaces); + goto free_and_return; + } + + ret = init_interface(json_object_get_string(l_port_name), i); - ret = init_interface(json_object_get_string(l_port_name), i); + if (ret < 0) { + syslog(LOG_ERR, "cannot int lan ports qos"); + json_object_put(board_json); + free(interfaces); + goto free_and_return; + } + } + } else { + ret = init_interface(json_object_get_string(lan_ports), i); if (ret < 0) { - json_object_put(l_port_name); - json_object_put(lan_ports); - json_object_put(wan_device); - json_object_put(lan); - json_object_put(wan); - json_object_put(network); + syslog(LOG_ERR, "cannot int lan device qos"); json_object_put(board_json); free(interfaces); goto free_and_return; } - - json_object_put(l_port_name); + i++; } - ret = init_interface(json_object_get_string(wan_device), i); + if (wan_device) + ret = init_interface(json_object_get_string(wan_device), i); - json_object_put(lan_ports); - json_object_put(wan_device); - json_object_put(lan); - json_object_put(wan); - json_object_put(network); json_object_put(board_json); free_and_return: