diff --git a/src/config.c b/src/config.c index a00cf863272f9138c8314617436bf8a690954aa3..bd3ad64990f46ad1fc8eb86f6df33df846591c44 100644 --- a/src/config.c +++ b/src/config.c @@ -2930,6 +2930,7 @@ static int agent_config_get_dpp_uri(struct agent_config *a, const char *ifname; struct dpp_uri_cfg *uri; struct uci_element *xi; + bool has_chan = false; /* config dpp_uri @@ -2977,7 +2978,8 @@ config dpp_uri uri->band = BAND_5; else if (band == 6) uri->band = BAND_6; - } + } else + goto out_error; if (tb[DPP_TYPE]) { const char *type; @@ -3000,43 +3002,55 @@ config dpp_uri } uri->num_chan = 0; - uci_foreach_element(&tb[DPP_CHAN]->v.list, xi) { - char *p; - struct dpp_chan *chan = &uri->chan[uri->num_chan]; - - p = strstr(xi->name, "/"); - if (!p) { - warn("|%s:%d| Discarding chan '%s' of invalid format," \ - " please use 'opclass/chan', i.e. '81/1'\n", - __func__, __LINE__, xi->name); - continue; - } - *p = '\0'; - chan->opclass = atoi(xi->name); - if (!chan->opclass) { - warn("|%s:%d| Discarding chan option with invalid "\ - "opclass '%u'\n", __func__, __LINE__, - chan->opclass); - continue; - } + if (tb[DPP_CHAN]) { + uci_foreach_element(&tb[DPP_CHAN]->v.list, xi) { + warn("|%s:%d|", __func__, __LINE__); - p++; - chan->channel = atoi(p); - if (!chan->channel) { - warn("|%s:%d| Discarding chan option with invalid "\ - "channel '%u'\n", __func__, __LINE__, - chan->channel); - continue; - } + char *p; + struct dpp_chan *chan = &uri->chan[uri->num_chan]; + + p = strstr(xi->name, "/"); + if (!p) { + warn("|%s:%d| Discarding chan '%s' of invalid format," \ + " please use 'opclass/chan', i.e. '81/1'\n", + __func__, __LINE__, xi->name); + continue; + } + *p = '\0'; + + chan->opclass = atoi(xi->name); + if (!chan->opclass) { + warn("|%s:%d| Discarding chan option with invalid "\ + "opclass '%u'\n", __func__, __LINE__, + chan->opclass); + continue; + } + + p++; + chan->channel = atoi(p); + if (!chan->channel) { + warn("|%s:%d| Discarding chan option with invalid "\ + "channel '%u'\n", __func__, __LINE__, + chan->channel); + continue; + } - warn("|%s:%d| added chan pair '%u/%u'\n", __func__, __LINE__, - chan->opclass, chan->channel); + warn("|%s:%d| added chan pair '%u/%u'\n", __func__, __LINE__, + chan->opclass, chan->channel); - uri->num_chan++; + uri->num_chan++; + has_chan = true; + } } + if (!has_chan) + goto out_error; + return 0; +out_error: + clean_dpp_uri(uri); + return -1; } static int agent_config_get_dpp_controller(struct agent_config *a, @@ -3844,10 +3858,32 @@ int clean_all_radios(struct agent_config *cfg) return 0; } +#if (EASYMESH_VERSION > 2) +int clean_dpp_uri(struct dpp_uri_cfg *uri) +{ + list_del(&uri->list); + free(uri); + return 0; +} + +int clean_all_dpp_uris(struct agent_config *cfg) +{ + struct dpp_uri_cfg *p, *tmp; + + list_for_each_entry_safe(p, tmp, &cfg->urilist, list) + clean_dpp_uri(p); + + return 0; +} +#endif + int agent_config_clean(struct agent_config *cfg) { #ifdef VENDOR_EXTENSION list_flush(&cfg->extlist, struct agent_extension_config, list); +#endif +#if (EASYMESH_VERSION > 2) + clean_all_dpp_uris(cfg); #endif clean_all_fh(cfg); clean_all_bk(cfg); diff --git a/src/config.h b/src/config.h index fbb778edd2d95c8228c9ff0750e3218339e57cc0..a2b8546927d8f39b3212547383c0f8b163d707de 100644 --- a/src/config.h +++ b/src/config.h @@ -344,6 +344,11 @@ int clean_all_bk(struct agent_config *cfg); void clean_fh(struct netif_fhcfg *p); int clean_all_fh(struct agent_config *cfg); +#if (EASYMESH_VERSION > 2) +int clean_dpp_uri(struct dpp_uri_cfg *uri); +int clean_all_dpp_uris(struct agent_config *cfg); +#endif + int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, struct wps_credential *out, bool onboarded, struct wsc_ext *exts); int uci_apply_wps_credentials(struct agent_config *cfg, enum wifi_band band);