3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-12-22 21:22:37 +01:00

wsc: Accept extra IEs in wsc_enrollee_new

This commit is contained in:
Andrew Zaborowski 2020-01-16 05:29:31 +01:00 committed by Denis Kenzior
parent ce16ba3bf8
commit 1f14941011
2 changed files with 15 additions and 9 deletions

View File

@ -324,7 +324,8 @@ static inline enum wsc_rf_band freq_to_rf_band(uint32_t freq)
} }
static int wsc_enrollee_connect(struct wsc_enrollee *wsce, struct scan_bss *bss, static int wsc_enrollee_connect(struct wsc_enrollee *wsce, struct scan_bss *bss,
const char *pin) const char *pin, struct iovec *ies,
unsigned int ies_num)
{ {
struct handshake_state *hs; struct handshake_state *hs;
struct l_settings *settings = l_settings_new(); struct l_settings *settings = l_settings_new();
@ -332,7 +333,7 @@ static int wsc_enrollee_connect(struct wsc_enrollee *wsce, struct scan_bss *bss,
struct wsc_association_request request; struct wsc_association_request request;
uint8_t *pdu; uint8_t *pdu;
size_t pdu_len; size_t pdu_len;
struct iovec ie_iov; struct iovec ie_iov[1 + ies_num];
hs = netdev_handshake_state_new(wsce->netdev); hs = netdev_handshake_state_new(wsce->netdev);
@ -376,19 +377,22 @@ static int wsc_enrollee_connect(struct wsc_enrollee *wsce, struct scan_bss *bss,
goto error; goto error;
} }
ie_iov.iov_base = ie_tlv_encapsulate_wsc_payload(pdu, pdu_len, ie_iov[0].iov_base = ie_tlv_encapsulate_wsc_payload(pdu, pdu_len,
&ie_iov.iov_len); &ie_iov[0].iov_len);
l_free(pdu); l_free(pdu);
if (!ie_iov.iov_base) { if (!ie_iov[0].iov_base) {
r = -ENOMEM; r = -ENOMEM;
goto error; goto error;
} }
r = netdev_connect(wsce->netdev, bss, hs, &ie_iov, 1, if (ies_num)
memcpy(ie_iov + 1, ies, sizeof(struct iovec) * ies_num);
r = netdev_connect(wsce->netdev, bss, hs, ie_iov, 1 + ies_num,
wsc_enrollee_netdev_event, wsc_enrollee_netdev_event,
wsc_enrollee_connect_cb, wsce); wsc_enrollee_connect_cb, wsce);
l_free(ie_iov.iov_base); l_free(ie_iov[0].iov_base);
if (r == 0) if (r == 0)
return 0; return 0;
@ -401,6 +405,7 @@ error:
struct wsc_enrollee *wsc_enrollee_new(struct netdev *netdev, struct wsc_enrollee *wsc_enrollee_new(struct netdev *netdev,
struct scan_bss *target, struct scan_bss *target,
const char *pin, const char *pin,
struct iovec *ies, unsigned int ies_num,
wsc_done_cb_t done_cb, void *user_data) wsc_done_cb_t done_cb, void *user_data)
{ {
struct wsc_enrollee *wsce; struct wsc_enrollee *wsce;
@ -410,7 +415,7 @@ struct wsc_enrollee *wsc_enrollee_new(struct netdev *netdev,
wsce->done_cb = done_cb; wsce->done_cb = done_cb;
wsce->done_data = user_data; wsce->done_data = user_data;
if (wsc_enrollee_connect(wsce, target, pin) == 0) if (wsc_enrollee_connect(wsce, target, pin, ies, ies_num) == 0)
return wsce; return wsce;
wsc_enrollee_free(wsce); wsc_enrollee_free(wsce);
@ -617,7 +622,7 @@ static void wsc_connect(struct wsc_station_dbus *wsc)
l_dbus_message_get_arguments(wsc->super.pending_connect, "s", l_dbus_message_get_arguments(wsc->super.pending_connect, "s",
&pin); &pin);
wsc->enrollee = wsc_enrollee_new(wsc->netdev, wsc->target, pin, wsc->enrollee = wsc_enrollee_new(wsc->netdev, wsc->target, pin, NULL, 0,
wsc_dbus_done_cb, wsc); wsc_dbus_done_cb, wsc);
if (wsc->enrollee) if (wsc->enrollee)
return; return;

View File

@ -39,6 +39,7 @@ typedef void (*wsc_done_cb_t)(int err, struct wsc_credentials_info *creds,
struct wsc_enrollee *wsc_enrollee_new(struct netdev *netdev, struct wsc_enrollee *wsc_enrollee_new(struct netdev *netdev,
struct scan_bss *target, struct scan_bss *target,
const char *pin, const char *pin,
struct iovec *ies, unsigned int ies_num,
wsc_done_cb_t done_cb, void *user_data); wsc_done_cb_t done_cb, void *user_data);
void wsc_enrollee_cancel(struct wsc_enrollee *wsce, bool defer_cb); void wsc_enrollee_cancel(struct wsc_enrollee *wsce, bool defer_cb);
void wsc_enrollee_destroy(struct wsc_enrollee *wsce); void wsc_enrollee_destroy(struct wsc_enrollee *wsce);