HS 2.0: Remove temporary network block on cred block removal
If the credential that was used to create a temporary HS 2.0 network block is removed, remove the network block, too. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
f403dcd648
commit
736d4f2d77
3 changed files with 44 additions and 11 deletions
|
@ -542,6 +542,15 @@ struct wpa_ssid {
|
|||
* disabled_until - Network block disabled until this time if non-zero
|
||||
*/
|
||||
struct os_time disabled_until;
|
||||
|
||||
/**
|
||||
* parent_cred - Pointer to parent wpa_cred entry
|
||||
*
|
||||
* This pointer can be used to delete temporary networks when a wpa_cred
|
||||
* that was used to create them is removed. This pointer should not be
|
||||
* dereferences since it may not be updated in all cases.
|
||||
*/
|
||||
void *parent_cred;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_SSID_H */
|
||||
|
|
|
@ -2306,20 +2306,48 @@ static int wpa_supplicant_ctrl_iface_add_cred(struct wpa_supplicant *wpa_s,
|
|||
}
|
||||
|
||||
|
||||
static int wpas_ctrl_remove_cred(struct wpa_supplicant *wpa_s,
|
||||
struct wpa_cred *cred)
|
||||
{
|
||||
struct wpa_ssid *ssid;
|
||||
char str[20];
|
||||
|
||||
if (cred == NULL || wpa_config_remove_cred(wpa_s->conf, cred->id) < 0) {
|
||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find cred");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Remove any network entry created based on the removed credential */
|
||||
ssid = wpa_s->conf->ssid;
|
||||
while (ssid) {
|
||||
if (ssid->parent_cred == cred) {
|
||||
wpa_printf(MSG_DEBUG, "Remove network id %d since it "
|
||||
"used the removed credential", ssid->id);
|
||||
os_snprintf(str, sizeof(str), "%d", ssid->id);
|
||||
ssid = ssid->next;
|
||||
wpa_supplicant_ctrl_iface_remove_network(wpa_s, str);
|
||||
} else
|
||||
ssid = ssid->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int wpa_supplicant_ctrl_iface_remove_cred(struct wpa_supplicant *wpa_s,
|
||||
char *cmd)
|
||||
{
|
||||
int id;
|
||||
struct wpa_cred *cred;
|
||||
struct wpa_cred *cred, *prev;
|
||||
|
||||
/* cmd: "<cred id>" or "all" */
|
||||
if (os_strcmp(cmd, "all") == 0) {
|
||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: REMOVE_CRED all");
|
||||
cred = wpa_s->conf->cred;
|
||||
while (cred) {
|
||||
id = cred->id;
|
||||
prev = cred;
|
||||
cred = cred->next;
|
||||
wpa_config_remove_cred(wpa_s->conf, id);
|
||||
wpas_ctrl_remove_cred(wpa_s, prev);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -2328,14 +2356,7 @@ static int wpa_supplicant_ctrl_iface_remove_cred(struct wpa_supplicant *wpa_s,
|
|||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: REMOVE_CRED id=%d", id);
|
||||
|
||||
cred = wpa_config_get_cred(wpa_s->conf, id);
|
||||
if (cred == NULL ||
|
||||
wpa_config_remove_cred(wpa_s->conf, id) < 0) {
|
||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find cred id=%d",
|
||||
id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return wpas_ctrl_remove_cred(wpa_s, cred);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -786,6 +786,7 @@ static int interworking_connect_3gpp(struct wpa_supplicant *wpa_s,
|
|||
ssid = wpa_config_add_network(wpa_s->conf);
|
||||
if (ssid == NULL)
|
||||
return -1;
|
||||
ssid->parent_cred = cred;
|
||||
|
||||
wpas_notify_network_added(wpa_s, ssid);
|
||||
wpa_config_set_network_defaults(ssid);
|
||||
|
@ -1095,6 +1096,7 @@ static int interworking_connect_roaming_consortium(
|
|||
ssid = wpa_config_add_network(wpa_s->conf);
|
||||
if (ssid == NULL)
|
||||
return -1;
|
||||
ssid->parent_cred = cred;
|
||||
wpas_notify_network_added(wpa_s, ssid);
|
||||
wpa_config_set_network_defaults(ssid);
|
||||
ssid->priority = cred->priority;
|
||||
|
@ -1209,6 +1211,7 @@ int interworking_connect(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
|
|||
nai_realm_free(realm, count);
|
||||
return -1;
|
||||
}
|
||||
ssid->parent_cred = cred;
|
||||
wpas_notify_network_added(wpa_s, ssid);
|
||||
wpa_config_set_network_defaults(ssid);
|
||||
ssid->priority = cred->priority;
|
||||
|
|
Loading…
Reference in a new issue