| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- From c7cca9b08f3e1e49c4a4a59ec66c47d91448e6ae Mon Sep 17 00:00:00 2001
- From: Jouni Malinen <[email protected]>
- Date: Sat, 13 Feb 2021 23:59:28 +0200
- Subject: [PATCH] nl80211: Ignore 4addr mode enabling error if it was already
- enabled
- nl80211_set_4addr_mode() could fail when trying to enable 4addr mode on
- an interface that is in a bridge and has 4addr mode already enabled.
- This operation would not have been necessary in the first place and this
- failure results in disconnecting, e.g., when roaming from one backhaul
- BSS to another BSS with Multi AP.
- Avoid this issue by ignoring the nl80211 command failure in the case
- where 4addr mode is being enabled while it has already been enabled.
- Signed-off-by: Jouni Malinen <[email protected]>
- ---
- src/drivers/driver_nl80211.c | 23 +++++++++++++++++++++++
- 1 file changed, 23 insertions(+)
- diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
- index 72189da24..011a15e68 100644
- --- a/src/drivers/driver_nl80211.c
- +++ b/src/drivers/driver_nl80211.c
- @@ -617,6 +617,7 @@ struct wiphy_idx_data {
- int wiphy_idx;
- enum nl80211_iftype nlmode;
- u8 *macaddr;
- + u8 use_4addr;
- };
-
-
- @@ -639,6 +640,9 @@ static int netdev_info_handler(struct nl_msg *msg, void *arg)
- os_memcpy(info->macaddr, nla_data(tb[NL80211_ATTR_MAC]),
- ETH_ALEN);
-
- + if (tb[NL80211_ATTR_4ADDR])
- + info->use_4addr = nla_get_u8(tb[NL80211_ATTR_4ADDR]);
- +
- return NL_SKIP;
- }
-
- @@ -691,6 +695,20 @@ static int nl80211_get_macaddr(struct i802_bss *bss)
- }
-
-
- +static int nl80211_get_4addr(struct i802_bss *bss)
- +{
- + struct nl_msg *msg;
- + struct wiphy_idx_data data = {
- + .use_4addr = 0,
- + };
- +
- + if (!(msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_GET_INTERFACE)) ||
- + send_and_recv_msgs(bss->drv, msg, netdev_info_handler, &data))
- + return -1;
- + return data.use_4addr;
- +}
- +
- +
- static int nl80211_register_beacons(struct wpa_driver_nl80211_data *drv,
- struct nl80211_wiphy_data *w)
- {
- @@ -11482,6 +11500,11 @@ static int nl80211_set_4addr_mode(void *priv, const char *bridge_ifname,
-
- ret = send_and_recv_msgs(drv, msg, NULL, NULL);
- msg = NULL;
- + if (ret && val && nl80211_get_4addr(bss) == 1) {
- + wpa_printf(MSG_DEBUG,
- + "nl80211: 4addr mode was already enabled");
- + ret = 0;
- + }
- if (!ret) {
- if (bridge_ifname[0] && val &&
- i802_check_bridge(drv, bss, bridge_ifname, bss->ifname) < 0)
- --
- 2.29.2
|