Make control response processing available to other control interfaces

The D-Bus interface wants to use it too, so it makes sense
to have it generic.

Signed-off-by: Dan Williams <dcbw@redhat.com>
This commit is contained in:
Dan Williams 2011-10-24 11:07:02 -05:00 committed by Jouni Malinen
parent 81c57e221d
commit 7de5688d68
2 changed files with 85 additions and 48 deletions

View file

@ -40,6 +40,7 @@
#include "ctrl_iface.h" #include "ctrl_iface.h"
#include "interworking.h" #include "interworking.h"
#include "blacklist.h" #include "blacklist.h"
#include "wpas_glue.h"
extern struct wpa_driver_ops *wpa_drivers[]; extern struct wpa_driver_ops *wpa_drivers[];
@ -684,6 +685,73 @@ static int wpa_supplicant_ctrl_iface_ibss_rsn(
#endif /* CONFIG_IBSS_RSN */ #endif /* CONFIG_IBSS_RSN */
int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
struct wpa_ssid *ssid,
const char *field,
const char *value)
{
struct eap_peer_config *eap = &ssid->eap;
wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
(const u8 *) value, os_strlen(value));
switch (wpa_supplicant_ctrl_req_from_string(field)) {
case WPA_CTRL_REQ_EAP_IDENTITY:
os_free(eap->identity);
eap->identity = (u8 *) os_strdup(value);
eap->identity_len = os_strlen(value);
eap->pending_req_identity = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
break;
case WPA_CTRL_REQ_EAP_PASSWORD:
os_free(eap->password);
eap->password = (u8 *) os_strdup(value);
eap->password_len = os_strlen(value);
eap->pending_req_password = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
break;
case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
os_free(eap->new_password);
eap->new_password = (u8 *) os_strdup(value);
eap->new_password_len = os_strlen(value);
eap->pending_req_new_password = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
break;
case WPA_CTRL_REQ_EAP_PIN:
os_free(eap->pin);
eap->pin = os_strdup(value);
eap->pending_req_pin = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
break;
case WPA_CTRL_REQ_EAP_OTP:
os_free(eap->otp);
eap->otp = (u8 *) os_strdup(value);
eap->otp_len = os_strlen(value);
os_free(eap->pending_req_otp);
eap->pending_req_otp = NULL;
eap->pending_req_otp_len = 0;
break;
case WPA_CTRL_REQ_EAP_PASSPHRASE:
os_free(eap->private_key_passwd);
eap->private_key_passwd = (u8 *) os_strdup(value);
eap->pending_req_passphrase = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
break;
default:
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
return -1;
}
return 0;
}
static int wpa_supplicant_ctrl_iface_ctrl_rsp(struct wpa_supplicant *wpa_s, static int wpa_supplicant_ctrl_iface_ctrl_rsp(struct wpa_supplicant *wpa_s,
char *rsp) char *rsp)
{ {
@ -691,7 +759,6 @@ static int wpa_supplicant_ctrl_iface_ctrl_rsp(struct wpa_supplicant *wpa_s,
char *pos, *id_pos; char *pos, *id_pos;
int id; int id;
struct wpa_ssid *ssid; struct wpa_ssid *ssid;
struct eap_peer_config *eap;
pos = os_strchr(rsp, '-'); pos = os_strchr(rsp, '-');
if (pos == NULL) if (pos == NULL)
@ -713,54 +780,9 @@ static int wpa_supplicant_ctrl_iface_ctrl_rsp(struct wpa_supplicant *wpa_s,
"to update", id); "to update", id);
return -1; return -1;
} }
eap = &ssid->eap;
if (os_strcmp(rsp, "IDENTITY") == 0) { return wpa_supplicant_ctrl_iface_ctrl_rsp_handle(wpa_s, ssid, rsp,
os_free(eap->identity); pos);
eap->identity = (u8 *) os_strdup(pos);
eap->identity_len = os_strlen(pos);
eap->pending_req_identity = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
} else if (os_strcmp(rsp, "PASSWORD") == 0) {
os_free(eap->password);
eap->password = (u8 *) os_strdup(pos);
eap->password_len = os_strlen(pos);
eap->pending_req_password = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
} else if (os_strcmp(rsp, "NEW_PASSWORD") == 0) {
os_free(eap->new_password);
eap->new_password = (u8 *) os_strdup(pos);
eap->new_password_len = os_strlen(pos);
eap->pending_req_new_password = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
} else if (os_strcmp(rsp, "PIN") == 0) {
os_free(eap->pin);
eap->pin = os_strdup(pos);
eap->pending_req_pin = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
} else if (os_strcmp(rsp, "OTP") == 0) {
os_free(eap->otp);
eap->otp = (u8 *) os_strdup(pos);
eap->otp_len = os_strlen(pos);
os_free(eap->pending_req_otp);
eap->pending_req_otp = NULL;
eap->pending_req_otp_len = 0;
} else if (os_strcmp(rsp, "PASSPHRASE") == 0) {
os_free(eap->private_key_passwd);
eap->private_key_passwd = (u8 *) os_strdup(pos);
eap->pending_req_passphrase = 0;
if (ssid == wpa_s->current_ssid)
wpa_s->reassociate = 1;
} else {
wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", rsp);
return -1;
}
return 0;
#else /* IEEE8021X_EAPOL */ #else /* IEEE8021X_EAPOL */
wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included");
return -1; return -1;

View file

@ -94,6 +94,21 @@ void wpa_supplicant_ctrl_iface_deinit(struct ctrl_iface_priv *priv);
*/ */
void wpa_supplicant_ctrl_iface_wait(struct ctrl_iface_priv *priv); void wpa_supplicant_ctrl_iface_wait(struct ctrl_iface_priv *priv);
/**
* wpa_supplicant_ctrl_iface_ctrl_rsp_handle - Handle a control response
* @wpa_s: Pointer to wpa_supplicant data
* @ssid: Pointer to the network block the reply is for
* @field: field the response is a reply for
* @value: value (ie, password, etc) for @field
* Returns: 0 on success, non-zero on error
*
* Helper function to handle replies to control interface requests.
*/
int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
struct wpa_ssid *ssid,
const char *field,
const char *value);
/** /**
* wpa_supplicant_global_ctrl_iface_init - Initialize global control interface * wpa_supplicant_global_ctrl_iface_init - Initialize global control interface
* @global: Pointer to global data from wpa_supplicant_init() * @global: Pointer to global data from wpa_supplicant_init()