wsc: Move eapol_sm creation to netdev_connect_wsc

This commit is contained in:
Andrew Zaborowski 2016-12-12 18:34:18 +01:00 committed by Denis Kenzior
parent c9ee5b8e7f
commit d93a44a3f0
3 changed files with 26 additions and 23 deletions

View File

@ -1230,12 +1230,8 @@ static void netdev_cmd_connect_cb(struct l_genl_msg *msg, void *user_data)
* events can be reversed (e.g. connect_event, then PAE data) * events can be reversed (e.g. connect_event, then PAE data)
* due to scheduling * due to scheduling
*/ */
if (netdev->handshake) { if (netdev->sm)
if (!netdev->sm)
netdev->sm = eapol_sm_new(netdev->handshake);
eapol_register(netdev->sm); eapol_register(netdev->sm);
}
return; return;
} }
@ -1396,6 +1392,8 @@ int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
netdev_connect_cb_t cb, void *user_data) netdev_connect_cb_t cb, void *user_data)
{ {
struct l_genl_msg *cmd_connect; struct l_genl_msg *cmd_connect;
struct eapol_sm *sm = NULL;
bool is_rsn = hs != NULL;
if (netdev->connected) if (netdev->connected)
return -EISCONN; return -EISCONN;
@ -1404,14 +1402,19 @@ int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
if (!cmd_connect) if (!cmd_connect)
return -EINVAL; return -EINVAL;
return netdev_connect_common(netdev, cmd_connect, bss, hs, NULL, mde, if (is_rsn)
sm = eapol_sm_new(hs);
return netdev_connect_common(netdev, cmd_connect, bss, hs, sm, mde,
event_filter, cb, user_data); event_filter, cb, user_data);
} }
int netdev_connect_wsc(struct netdev *netdev, struct scan_bss *bss, int netdev_connect_wsc(struct netdev *netdev, struct scan_bss *bss,
struct handshake_state *hs, struct eapol_sm *sm, struct handshake_state *hs,
netdev_event_func_t event_filter, netdev_event_func_t event_filter,
netdev_connect_cb_t cb, void *user_data) netdev_connect_cb_t cb,
netdev_eapol_event_func_t eapol_cb,
void *user_data)
{ {
struct l_genl_msg *cmd_connect; struct l_genl_msg *cmd_connect;
struct wsc_association_request request; struct wsc_association_request request;
@ -1419,6 +1422,7 @@ int netdev_connect_wsc(struct netdev *netdev, struct scan_bss *bss,
size_t pdu_len; size_t pdu_len;
void *ie; void *ie;
size_t ie_len; size_t ie_len;
struct eapol_sm *sm;
if (netdev->connected) if (netdev->connected)
return -EISCONN; return -EISCONN;
@ -1443,6 +1447,10 @@ int netdev_connect_wsc(struct netdev *netdev, struct scan_bss *bss,
l_genl_msg_append_attr(cmd_connect, NL80211_ATTR_IE, ie_len, ie); l_genl_msg_append_attr(cmd_connect, NL80211_ATTR_IE, ie_len, ie);
l_free(ie); l_free(ie);
sm = eapol_sm_new(hs);
eapol_sm_set_user_data(sm, user_data);
eapol_sm_set_event_func(sm, eapol_cb);
return netdev_connect_common(netdev, cmd_connect, bss, hs, sm, NULL, return netdev_connect_common(netdev, cmd_connect, bss, hs, sm, NULL,
event_filter, cb, user_data); event_filter, cb, user_data);

View File

@ -66,6 +66,9 @@ typedef void (*netdev_watch_func_t)(struct netdev *netdev,
typedef void (*netdev_set_powered_cb_t)(struct netdev *netdev, int result, typedef void (*netdev_set_powered_cb_t)(struct netdev *netdev, int result,
void *user_data); void *user_data);
typedef void (*netdev_destroy_func_t)(void *user_data); typedef void (*netdev_destroy_func_t)(void *user_data);
typedef void (*netdev_eapol_event_func_t)(unsigned int event,
const void *event_data,
void *user_data);
const uint8_t *netdev_get_address(struct netdev *netdev); const uint8_t *netdev_get_address(struct netdev *netdev);
uint32_t netdev_get_ifindex(struct netdev *netdev); uint32_t netdev_get_ifindex(struct netdev *netdev);
@ -78,9 +81,11 @@ int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
netdev_event_func_t event_filter, netdev_event_func_t event_filter,
netdev_connect_cb_t cb, void *user_data); netdev_connect_cb_t cb, void *user_data);
int netdev_connect_wsc(struct netdev *netdev, struct scan_bss *bss, int netdev_connect_wsc(struct netdev *netdev, struct scan_bss *bss,
struct handshake_state *hs, struct eapol_sm *sm, struct handshake_state *hs,
netdev_event_func_t event_filter, netdev_event_func_t event_filter,
netdev_connect_cb_t cb, void *user_data); netdev_connect_cb_t cb,
netdev_eapol_event_func_t eapol_cb,
void *user_data);
int netdev_disconnect(struct netdev *netdev, int netdev_disconnect(struct netdev *netdev,
netdev_disconnect_cb_t cb, void *user_data); netdev_disconnect_cb_t cb, void *user_data);

View File

@ -37,7 +37,6 @@
#include "src/util.h" #include "src/util.h"
#include "src/wsc.h" #include "src/wsc.h"
#include "src/handshake.h" #include "src/handshake.h"
#include "src/eapol.h"
#include "src/eap-wsc.h" #include "src/eap-wsc.h"
#include "src/crypto.h" #include "src/crypto.h"
#include "src/common.h" #include "src/common.h"
@ -396,7 +395,6 @@ static inline enum wsc_rf_band freq_to_rf_band(uint32_t freq)
static void wsc_connect(struct wsc *wsc) static void wsc_connect(struct wsc *wsc)
{ {
struct handshake_state *hs; struct handshake_state *hs;
struct eapol_sm *sm;
struct l_settings *settings = l_settings_new(); struct l_settings *settings = l_settings_new();
struct scan_bss *bss = wsc->target; struct scan_bss *bss = wsc->target;
uint32_t ifindex = netdev_get_ifindex(device_get_netdev(wsc->device)); uint32_t ifindex = netdev_get_ifindex(device_get_netdev(wsc->device));
@ -405,11 +403,6 @@ static void wsc_connect(struct wsc *wsc)
hs = handshake_state_new(ifindex); hs = handshake_state_new(ifindex);
sm = eapol_sm_new(hs);
eapol_sm_set_user_data(sm, wsc);
eapol_sm_set_event_func(sm, wsc_eapol_event);
l_settings_set_string(settings, "Security", "EAP-Identity", l_settings_set_string(settings, "Security", "EAP-Identity",
"WFA-SimpleConfig-Enrollee-1-0"); "WFA-SimpleConfig-Enrollee-1-0");
l_settings_set_string(settings, "Security", "EAP-Method", "WSC"); l_settings_set_string(settings, "Security", "EAP-Method", "WSC");
@ -428,12 +421,9 @@ static void wsc_connect(struct wsc *wsc)
handshake_state_set_8021x_config(hs, settings); handshake_state_set_8021x_config(hs, settings);
wsc->eap_settings = settings; wsc->eap_settings = settings;
eapol_sm_set_use_eapol_start(sm, true); if (netdev_connect_wsc(device_get_netdev(wsc->device), bss, hs,
wsc_netdev_event, wsc_connect_cb,
if (netdev_connect_wsc(device_get_netdev(wsc->device), bss, hs, sm, wsc_eapol_event, wsc) < 0) {
wsc_netdev_event,
wsc_connect_cb, wsc) < 0) {
eapol_sm_free(sm);
dbus_pending_reply(&wsc->pending, dbus_pending_reply(&wsc->pending,
dbus_error_failed(wsc->pending)); dbus_error_failed(wsc->pending));
return; return;