mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2024-11-25 00:38:24 -05:00
Move network add/remove operations to a common function
All the 3 control interfaces: socket based, dbus & binder needs to perform the same sequence of steps for network add/remove. So, move these to a common utility method in |wpa_supplicant.c| instead of duplicating the code everywhere. Signed-off-by: Roshan Pius <rpius@google.com>
This commit is contained in:
parent
052b8d38c5
commit
d015bb05df
@ -2919,15 +2919,10 @@ static int wpa_supplicant_ctrl_iface_add_network(
|
|||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: ADD_NETWORK");
|
wpa_printf(MSG_DEBUG, "CTRL_IFACE: ADD_NETWORK");
|
||||||
|
|
||||||
ssid = wpa_config_add_network(wpa_s->conf);
|
ssid = wpa_supplicant_add_network(wpa_s);
|
||||||
if (ssid == NULL)
|
if (ssid == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
wpas_notify_network_added(wpa_s, ssid);
|
|
||||||
|
|
||||||
ssid->disabled = 1;
|
|
||||||
wpa_config_set_network_defaults(ssid);
|
|
||||||
|
|
||||||
ret = os_snprintf(buf, buflen, "%d\n", ssid->id);
|
ret = os_snprintf(buf, buflen, "%d\n", ssid->id);
|
||||||
if (os_snprintf_error(buflen, ret))
|
if (os_snprintf_error(buflen, ret))
|
||||||
return -1;
|
return -1;
|
||||||
@ -2940,7 +2935,7 @@ static int wpa_supplicant_ctrl_iface_remove_network(
|
|||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
struct wpa_ssid *ssid;
|
struct wpa_ssid *ssid;
|
||||||
int was_disabled;
|
int result;
|
||||||
|
|
||||||
/* cmd: "<network id>" or "all" */
|
/* cmd: "<network id>" or "all" */
|
||||||
if (os_strcmp(cmd, "all") == 0) {
|
if (os_strcmp(cmd, "all") == 0) {
|
||||||
@ -2976,54 +2971,17 @@ static int wpa_supplicant_ctrl_iface_remove_network(
|
|||||||
id = atoi(cmd);
|
id = atoi(cmd);
|
||||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: REMOVE_NETWORK id=%d", id);
|
wpa_printf(MSG_DEBUG, "CTRL_IFACE: REMOVE_NETWORK id=%d", id);
|
||||||
|
|
||||||
ssid = wpa_config_get_network(wpa_s->conf, id);
|
result = wpa_supplicant_remove_network(wpa_s, id);
|
||||||
if (ssid)
|
if (result == -1) {
|
||||||
wpas_notify_network_removed(wpa_s, ssid);
|
|
||||||
if (ssid == NULL) {
|
|
||||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network "
|
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network "
|
||||||
"id=%d", id);
|
"id=%d", id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (result == -2) {
|
||||||
if (wpa_s->last_ssid == ssid)
|
|
||||||
wpa_s->last_ssid = NULL;
|
|
||||||
|
|
||||||
if (ssid == wpa_s->current_ssid || wpa_s->current_ssid == NULL) {
|
|
||||||
#ifdef CONFIG_SME
|
|
||||||
wpa_s->sme.prev_bssid_set = 0;
|
|
||||||
#endif /* CONFIG_SME */
|
|
||||||
/*
|
|
||||||
* Invalidate the EAP session cache if the current or
|
|
||||||
* previously used network is removed.
|
|
||||||
*/
|
|
||||||
eapol_sm_invalidate_cached_session(wpa_s->eapol);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ssid == wpa_s->current_ssid) {
|
|
||||||
wpa_sm_set_config(wpa_s->wpa, NULL);
|
|
||||||
eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
|
|
||||||
|
|
||||||
if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
|
|
||||||
wpa_s->own_disconnect_req = 1;
|
|
||||||
wpa_supplicant_deauthenticate(wpa_s,
|
|
||||||
WLAN_REASON_DEAUTH_LEAVING);
|
|
||||||
}
|
|
||||||
|
|
||||||
was_disabled = ssid->disabled;
|
|
||||||
|
|
||||||
if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
|
|
||||||
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Not able to remove the "
|
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Not able to remove the "
|
||||||
"network id=%d", id);
|
"network id=%d", id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!was_disabled && wpa_s->sched_scanning) {
|
|
||||||
wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to remove "
|
|
||||||
"network from filters");
|
|
||||||
wpa_supplicant_cancel_sched_scan(wpa_s);
|
|
||||||
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1504,7 +1504,7 @@ DBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
|
|||||||
dbus_message_iter_init(message, &iter);
|
dbus_message_iter_init(message, &iter);
|
||||||
|
|
||||||
if (wpa_s->dbus_new_path)
|
if (wpa_s->dbus_new_path)
|
||||||
ssid = wpa_config_add_network(wpa_s->conf);
|
ssid = wpa_supplicant_add_network(wpa_s);
|
||||||
if (ssid == NULL) {
|
if (ssid == NULL) {
|
||||||
wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.",
|
wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.",
|
||||||
__func__);
|
__func__);
|
||||||
@ -1513,9 +1513,6 @@ DBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
|
|||||||
"wpa_supplicant could not add a network on this interface.");
|
"wpa_supplicant could not add a network on this interface.");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
wpas_notify_network_added(wpa_s, ssid);
|
|
||||||
ssid->disabled = 1;
|
|
||||||
wpa_config_set_network_defaults(ssid);
|
|
||||||
|
|
||||||
dbus_error_init(&error);
|
dbus_error_init(&error);
|
||||||
if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
|
if (!set_network_properties(wpa_s, ssid, &iter, &error)) {
|
||||||
@ -1662,8 +1659,7 @@ DBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
|
|||||||
const char *op;
|
const char *op;
|
||||||
char *iface, *net_id;
|
char *iface, *net_id;
|
||||||
int id;
|
int id;
|
||||||
struct wpa_ssid *ssid;
|
int result;
|
||||||
int was_disabled;
|
|
||||||
|
|
||||||
dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
|
dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
|
||||||
DBUS_TYPE_INVALID);
|
DBUS_TYPE_INVALID);
|
||||||
@ -1686,27 +1682,12 @@ DBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssid = wpa_config_get_network(wpa_s->conf, id);
|
result = wpa_supplicant_remove_network(wpa_s, id);
|
||||||
if (ssid == NULL) {
|
if (result == -1) {
|
||||||
reply = wpas_dbus_error_network_unknown(message);
|
reply = wpas_dbus_error_network_unknown(message);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
if (result == -2) {
|
||||||
was_disabled = ssid->disabled;
|
|
||||||
|
|
||||||
wpas_notify_network_removed(wpa_s, ssid);
|
|
||||||
|
|
||||||
if (ssid == wpa_s->current_ssid)
|
|
||||||
wpa_supplicant_deauthenticate(wpa_s,
|
|
||||||
WLAN_REASON_DEAUTH_LEAVING);
|
|
||||||
else if (!was_disabled && wpa_s->sched_scanning) {
|
|
||||||
wpa_printf(MSG_DEBUG,
|
|
||||||
"Stop ongoing sched_scan to remove network from filters");
|
|
||||||
wpa_supplicant_cancel_sched_scan(wpa_s);
|
|
||||||
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
|
|
||||||
wpa_printf(MSG_ERROR,
|
wpa_printf(MSG_ERROR,
|
||||||
"%s[dbus]: error occurred when removing network %d",
|
"%s[dbus]: error occurred when removing network %d",
|
||||||
__func__, id);
|
__func__, id);
|
||||||
|
@ -717,16 +717,13 @@ DBusMessage * wpas_dbus_iface_add_network(DBusMessage *message,
|
|||||||
char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
|
char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf;
|
||||||
|
|
||||||
if (wpa_s->dbus_path)
|
if (wpa_s->dbus_path)
|
||||||
ssid = wpa_config_add_network(wpa_s->conf);
|
ssid = wpa_supplicant_add_network(wpa_s);
|
||||||
if (ssid == NULL) {
|
if (ssid == NULL) {
|
||||||
reply = dbus_message_new_error(
|
reply = dbus_message_new_error(
|
||||||
message, WPAS_ERROR_ADD_NETWORK_ERROR,
|
message, WPAS_ERROR_ADD_NETWORK_ERROR,
|
||||||
"wpa_supplicant could not add a network on this interface.");
|
"wpa_supplicant could not add a network on this interface.");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
wpas_notify_network_added(wpa_s, ssid);
|
|
||||||
ssid->disabled = 1;
|
|
||||||
wpa_config_set_network_defaults(ssid);
|
|
||||||
|
|
||||||
/* Construct the object path for this network. */
|
/* Construct the object path for this network. */
|
||||||
os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
|
os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
|
||||||
@ -758,7 +755,7 @@ DBusMessage * wpas_dbus_iface_remove_network(DBusMessage *message,
|
|||||||
const char *op;
|
const char *op;
|
||||||
char *iface = NULL, *net_id = NULL;
|
char *iface = NULL, *net_id = NULL;
|
||||||
int id;
|
int id;
|
||||||
struct wpa_ssid *ssid;
|
int result;
|
||||||
|
|
||||||
if (!dbus_message_get_args(message, NULL,
|
if (!dbus_message_get_args(message, NULL,
|
||||||
DBUS_TYPE_OBJECT_PATH, &op,
|
DBUS_TYPE_OBJECT_PATH, &op,
|
||||||
@ -781,19 +778,12 @@ DBusMessage * wpas_dbus_iface_remove_network(DBusMessage *message,
|
|||||||
}
|
}
|
||||||
|
|
||||||
id = strtoul(net_id, NULL, 10);
|
id = strtoul(net_id, NULL, 10);
|
||||||
ssid = wpa_config_get_network(wpa_s->conf, id);
|
result = wpa_supplicant_remove_network(wpa_s, id);
|
||||||
if (ssid == NULL) {
|
if (result == -1) {
|
||||||
reply = wpas_dbus_new_invalid_network_error(message);
|
reply = wpas_dbus_new_invalid_network_error(message);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
if (result == -2) {
|
||||||
wpas_notify_network_removed(wpa_s, ssid);
|
|
||||||
|
|
||||||
if (ssid == wpa_s->current_ssid)
|
|
||||||
wpa_supplicant_deauthenticate(wpa_s,
|
|
||||||
WLAN_REASON_DEAUTH_LEAVING);
|
|
||||||
|
|
||||||
if (wpa_config_remove_network(wpa_s->conf, id) < 0) {
|
|
||||||
reply = dbus_message_new_error(
|
reply = dbus_message_new_error(
|
||||||
message, WPAS_ERROR_REMOVE_NETWORK_ERROR,
|
message, WPAS_ERROR_REMOVE_NETWORK_ERROR,
|
||||||
"error removing the specified on this interface.");
|
"error removing the specified on this interface.");
|
||||||
|
@ -2752,6 +2752,95 @@ static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wpa_supplicant_add_network - Add a new network
|
||||||
|
* @wpa_s: wpa_supplicant structure for a network interface
|
||||||
|
* Returns: The new network configuration or %NULL if operation failed
|
||||||
|
*
|
||||||
|
* This function performs the following operations:
|
||||||
|
* 1. Adds a new network.
|
||||||
|
* 2. Send network addition notification.
|
||||||
|
* 3. Marks the network disabled.
|
||||||
|
* 4. Set network default parameters.
|
||||||
|
*/
|
||||||
|
struct wpa_ssid * wpa_supplicant_add_network(struct wpa_supplicant *wpa_s)
|
||||||
|
{
|
||||||
|
struct wpa_ssid *ssid;
|
||||||
|
|
||||||
|
ssid = wpa_config_add_network(wpa_s->conf);
|
||||||
|
if (!ssid)
|
||||||
|
return NULL;
|
||||||
|
wpas_notify_network_added(wpa_s, ssid);
|
||||||
|
ssid->disabled = 1;
|
||||||
|
wpa_config_set_network_defaults(ssid);
|
||||||
|
|
||||||
|
return ssid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wpa_supplicant_remove_network - Remove a configured network based on id
|
||||||
|
* @wpa_s: wpa_supplicant structure for a network interface
|
||||||
|
* @id: Unique network id to search for
|
||||||
|
* Returns: 0 on success, or -1 if the network was not found, -2 if the network
|
||||||
|
* could not be removed
|
||||||
|
*
|
||||||
|
* This function performs the following operations:
|
||||||
|
* 1. Removes the network.
|
||||||
|
* 2. Send network removal notification.
|
||||||
|
* 3. Update internal state machines.
|
||||||
|
* 4. Stop any running sched scans.
|
||||||
|
*/
|
||||||
|
int wpa_supplicant_remove_network(struct wpa_supplicant *wpa_s, int id)
|
||||||
|
{
|
||||||
|
struct wpa_ssid *ssid;
|
||||||
|
int was_disabled;
|
||||||
|
|
||||||
|
ssid = wpa_config_get_network(wpa_s->conf, id);
|
||||||
|
if (!ssid)
|
||||||
|
return -1;
|
||||||
|
wpas_notify_network_removed(wpa_s, ssid);
|
||||||
|
|
||||||
|
if (wpa_s->last_ssid == ssid)
|
||||||
|
wpa_s->last_ssid = NULL;
|
||||||
|
|
||||||
|
if (ssid == wpa_s->current_ssid || !wpa_s->current_ssid) {
|
||||||
|
#ifdef CONFIG_SME
|
||||||
|
wpa_s->sme.prev_bssid_set = 0;
|
||||||
|
#endif /* CONFIG_SME */
|
||||||
|
/*
|
||||||
|
* Invalidate the EAP session cache if the current or
|
||||||
|
* previously used network is removed.
|
||||||
|
*/
|
||||||
|
eapol_sm_invalidate_cached_session(wpa_s->eapol);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssid == wpa_s->current_ssid) {
|
||||||
|
wpa_sm_set_config(wpa_s->wpa, NULL);
|
||||||
|
eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
|
||||||
|
|
||||||
|
if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
|
||||||
|
wpa_s->own_disconnect_req = 1;
|
||||||
|
wpa_supplicant_deauthenticate(wpa_s,
|
||||||
|
WLAN_REASON_DEAUTH_LEAVING);
|
||||||
|
}
|
||||||
|
|
||||||
|
was_disabled = ssid->disabled;
|
||||||
|
|
||||||
|
if (wpa_config_remove_network(wpa_s->conf, id) < 0)
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
if (!was_disabled && wpa_s->sched_scanning) {
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"Stop ongoing sched_scan to remove network from filters");
|
||||||
|
wpa_supplicant_cancel_sched_scan(wpa_s);
|
||||||
|
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wpa_supplicant_enable_network - Mark a configured network as enabled
|
* wpa_supplicant_enable_network - Mark a configured network as enabled
|
||||||
* @wpa_s: wpa_supplicant structure for a network interface
|
* @wpa_s: wpa_supplicant structure for a network interface
|
||||||
|
@ -1107,6 +1107,8 @@ void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s);
|
|||||||
void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
|
void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
|
||||||
int reason_code);
|
int reason_code);
|
||||||
|
|
||||||
|
struct wpa_ssid * wpa_supplicant_add_network(struct wpa_supplicant *wpa_s);
|
||||||
|
int wpa_supplicant_remove_network(struct wpa_supplicant *wpa_s, int id);
|
||||||
void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
|
void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_ssid *ssid);
|
struct wpa_ssid *ssid);
|
||||||
void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
|
void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
|
||||||
|
Loading…
Reference in New Issue
Block a user