nl80211: Fix cfg80211 workaround for IBSS join
The interface was incorrectly changed to station mode between the two IBSS join requests and that made the second attempt fail. Remove that undesired mode clearing from this special case of IBSS leave sequence. Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
cece9b7df7
commit
666e508ccf
1 changed files with 8 additions and 5 deletions
|
@ -173,7 +173,8 @@ static int nl80211_set_channel(struct i802_bss *bss,
|
||||||
static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
|
static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
|
||||||
int ifindex, int disabled);
|
int ifindex, int disabled);
|
||||||
|
|
||||||
static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv);
|
static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv,
|
||||||
|
int reset_mode);
|
||||||
|
|
||||||
static int i802_set_iface_flags(struct i802_bss *bss, int up);
|
static int i802_set_iface_flags(struct i802_bss *bss, int up);
|
||||||
static int nl80211_set_param(void *priv, const char *param);
|
static int nl80211_set_param(void *priv, const char *param);
|
||||||
|
@ -2627,7 +2628,7 @@ static int wpa_driver_nl80211_deauthenticate(struct i802_bss *bss,
|
||||||
|
|
||||||
if (drv->nlmode == NL80211_IFTYPE_ADHOC) {
|
if (drv->nlmode == NL80211_IFTYPE_ADHOC) {
|
||||||
nl80211_mark_disconnected(drv);
|
nl80211_mark_disconnected(drv);
|
||||||
return nl80211_leave_ibss(drv);
|
return nl80211_leave_ibss(drv, 1);
|
||||||
}
|
}
|
||||||
if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
|
if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
|
||||||
return wpa_driver_nl80211_disconnect(drv, reason_code);
|
return wpa_driver_nl80211_disconnect(drv, reason_code);
|
||||||
|
@ -4134,7 +4135,8 @@ static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv)
|
static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv,
|
||||||
|
int reset_mode)
|
||||||
{
|
{
|
||||||
struct nl_msg *msg;
|
struct nl_msg *msg;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -4149,7 +4151,8 @@ static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv)
|
||||||
"nl80211: Leave IBSS request sent successfully");
|
"nl80211: Leave IBSS request sent successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wpa_driver_nl80211_set_mode(drv->first_bss,
|
if (reset_mode &&
|
||||||
|
wpa_driver_nl80211_set_mode(drv->first_bss,
|
||||||
NL80211_IFTYPE_STATION)) {
|
NL80211_IFTYPE_STATION)) {
|
||||||
wpa_printf(MSG_INFO, "nl80211: Failed to set interface into "
|
wpa_printf(MSG_INFO, "nl80211: Failed to set interface into "
|
||||||
"station mode");
|
"station mode");
|
||||||
|
@ -4242,7 +4245,7 @@ retry:
|
||||||
if (ret == -EALREADY && count == 1) {
|
if (ret == -EALREADY && count == 1) {
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Retry IBSS join after "
|
wpa_printf(MSG_DEBUG, "nl80211: Retry IBSS join after "
|
||||||
"forced leave");
|
"forced leave");
|
||||||
nl80211_leave_ibss(drv);
|
nl80211_leave_ibss(drv, 0);
|
||||||
nlmsg_free(msg);
|
nlmsg_free(msg);
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue