Revert "[wpa_supplicant] Cumulative patch from commit 0c5ededed"
This reverts commit 1a1e642fd6c1200e7e1979ea70103c484062f3a9.
Reason for revert: Droidcop: Potential culprit for Bug 154881734 - verifying through Forrest before revert submission
Change-Id: I85f75adeb43554b0ebbf295fea51e1b68b169ed2
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index c624c29..032bbd8 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1838,7 +1838,7 @@
#define WPA_DRIVER_FLAGS_FTM_RESPONDER 0x0100000000000000ULL
/** Driver support 4-way handshake offload for WPA-Personal */
#define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK 0x0200000000000000ULL
-/** Driver supports a separate control port TX for EAPOL frames */
+/** Driver supports a separate control port for EAPOL frames */
#define WPA_DRIVER_FLAGS_CONTROL_PORT 0x0400000000000000ULL
/** Driver supports VLAN offload */
#define WPA_DRIVER_FLAGS_VLAN_OFFLOAD 0x0800000000000000ULL
@@ -1852,10 +1852,6 @@
#define WPA_DRIVER_FLAGS_EXTENDED_KEY_ID 0x8000000000000000ULL
u64 flags;
-/** Driver supports a separate control port RX for EAPOL frames */
-#define WPA_DRIVER_FLAGS2_CONTROL_PORT_RX 0x0000000000000001ULL
- u64 flags2;
-
#define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
(drv_flags & WPA_DRIVER_FLAGS_FULL_AP_CLIENT_STATE)
@@ -4424,17 +4420,6 @@
*/
int (*update_dh_ie)(void *priv, const u8 *peer_mac, u16 reason_code,
const u8 *ie, size_t ie_len);
-
- /**
- * dpp_listen - Notify driver about start/stop of DPP listen
- * @priv: Private driver interface data
- * @enable: Whether listen state is enabled (or disabled)
- * Returns: 0 on success, -1 on failure
- *
- * This optional callback can be used to update RX frame filtering to
- * explicitly allow reception of broadcast Public Action frames.
- */
- int (*dpp_listen)(void *priv, bool enable);
};
/**
@@ -5936,7 +5921,6 @@
const struct wpa_driver_capa *capa);
/* Convert driver flag to string */
const char * driver_flag_to_string(u64 flag);
-const char * driver_flag2_to_string(u64 flag2);
/* NULL terminated array of linked in driver wrappers */
extern const struct wpa_driver_ops *const wpa_drivers[];
diff --git a/src/drivers/driver_common.c b/src/drivers/driver_common.c
index 23a6a42..63846db 100644
--- a/src/drivers/driver_common.c
+++ b/src/drivers/driver_common.c
@@ -321,14 +321,3 @@
return "UNKNOWN";
#undef DF2S
}
-
-
-const char * driver_flag2_to_string(u64 flag2)
-{
-#define DF2S(x) case WPA_DRIVER_FLAGS2_ ## x: return #x
- switch (flag2) {
- DF2S(CONTROL_PORT_RX);
- }
- return "UNKNOWN";
-#undef DF2S
-}
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 75792f3..3b7c31c 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -30,6 +30,7 @@
#include "common/ieee802_11_defs.h"
#include "common/ieee802_11_common.h"
#include "common/wpa_common.h"
+#include "l2_packet/l2_packet.h"
#include "netlink.h"
#include "linux_defines.h"
#include "linux_ioctl.h"
@@ -437,52 +438,6 @@
}
-/* Use this method to mark that it is necessary to own the connection/interface
- * for this operation.
- * handle may be set to NULL, to get the same behavior as send_and_recv_msgs().
- * set_owner can be used to mark this socket for receiving control port frames.
- */
-static int send_and_recv_msgs_owner(struct wpa_driver_nl80211_data *drv,
- struct nl_msg *msg,
- struct nl_sock *handle, int set_owner,
- int (*valid_handler)(struct nl_msg *,
- void *),
- void *valid_data)
-{
- /* Control port over nl80211 needs the flags and attributes below.
- *
- * The Linux kernel has initial checks for them (in nl80211.c) like:
- * validate_pae_over_nl80211(...)
- * or final checks like:
- * dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid
- *
- * Final operations (e.g., disassociate) don't need to set these
- * attributes, but they have to be performed on the socket, which has
- * the connection owner property set in the kernel.
- */
- if ((drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) &&
- handle && set_owner &&
- (nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_OVER_NL80211) ||
- nla_put_flag(msg, NL80211_ATTR_SOCKET_OWNER) ||
- nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, ETH_P_PAE) ||
- nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_NO_PREAUTH)))
- return -1;
-
- return send_and_recv(drv->global, handle ? handle : drv->global->nl,
- msg, valid_handler, valid_data);
-}
-
-
-struct nl_sock * get_connect_handle(struct i802_bss *bss)
-{
- if ((bss->drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) ||
- bss->use_nl_connect)
- return bss->nl_connect;
-
- return NULL;
-}
-
-
struct family_data {
const char *group;
int id;
@@ -1963,25 +1918,6 @@
}
-static int nl80211_init_connect_handle(struct i802_bss *bss)
-{
- if (bss->nl_connect) {
- wpa_printf(MSG_DEBUG,
- "nl80211: Connect handle already created (nl_connect=%p)",
- bss->nl_connect);
- return -1;
- }
-
- bss->nl_connect = nl_create_handle(bss->nl_cb, "connect");
- if (!bss->nl_connect)
- return -1;
- nl80211_register_eloop_read(&bss->nl_connect,
- wpa_driver_nl80211_event_receive,
- bss->nl_cb, 1);
- return 0;
-}
-
-
static int nl80211_init_bss(struct i802_bss *bss)
{
bss->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
@@ -1993,8 +1929,6 @@
nl_cb_set(bss->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
process_bss_event, bss);
- nl80211_init_connect_handle(bss);
-
return 0;
}
@@ -2003,9 +1937,6 @@
{
nl_cb_put(bss->nl_cb);
bss->nl_cb = NULL;
-
- if (bss->nl_connect)
- nl80211_destroy_eloop_handle(&bss->nl_connect, 1);
}
@@ -2229,6 +2160,25 @@
}
+static int nl80211_init_connect_handle(struct i802_bss *bss)
+{
+ if (bss->nl_connect) {
+ wpa_printf(MSG_DEBUG,
+ "nl80211: Connect handle already created (nl_connect=%p)",
+ bss->nl_connect);
+ return -1;
+ }
+
+ bss->nl_connect = nl_create_handle(bss->nl_cb, "connect");
+ if (!bss->nl_connect)
+ return -1;
+ nl80211_register_eloop_read(&bss->nl_connect,
+ wpa_driver_nl80211_event_receive,
+ bss->nl_cb, 1);
+ return 0;
+}
+
+
static int nl80211_mgmt_subscribe_non_ap(struct i802_bss *bss)
{
struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -2766,6 +2716,8 @@
if (drv->vendor_cmd_test_avail)
qca_vendor_test(drv);
+ nl80211_init_connect_handle(bss);
+
return 0;
}
@@ -2878,6 +2830,9 @@
nl80211_del_p2pdev(bss);
}
+ if (bss->nl_connect)
+ nl80211_destroy_eloop_handle(&bss->nl_connect, 1);
+
nl80211_destroy_bss(drv->first_bss);
os_free(drv->filter_ssids);
@@ -3482,14 +3437,18 @@
return nl80211_leave_ibss(drv, 1);
}
if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) {
+ struct nl_sock *nl_connect = NULL;
+
+ if (bss->use_nl_connect)
+ nl_connect = bss->nl_connect;
return wpa_driver_nl80211_disconnect(drv, reason_code,
- get_connect_handle(bss));
+ nl_connect);
}
wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " reason_code=%d)",
__func__, MAC2STR(addr), reason_code);
nl80211_mark_disconnected(drv);
ret = wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DEAUTHENTICATE,
- reason_code, 0, get_connect_handle(bss));
+ reason_code, 0, NULL);
/*
* For locally generated deauthenticate, supplicant already generates a
* DEAUTH event, so ignore the event from NL80211.
@@ -4473,8 +4432,7 @@
}
#endif /* CONFIG_IEEE80211AX */
- ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 1,
- NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
ret, strerror(-ret));
@@ -5327,10 +5285,7 @@
int res;
int qos = flags & WPA_STA_WMM;
- /* For now, disable EAPOL TX over control port in AP mode by default
- * since it does not provide TX status notifications. */
- if (drv->control_port_ap &&
- (drv->capa.flags & WPA_DRIVER_FLAGS_CONTROL_PORT))
+ if (drv->capa.flags & WPA_DRIVER_FLAGS_CONTROL_PORT)
return nl80211_tx_control_port(bss, addr, ETH_P_EAPOL,
data, data_len, !encrypt);
@@ -5497,9 +5452,7 @@
int ret;
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_LEAVE_IBSS);
- ret = send_and_recv_msgs_owner(drv, msg,
- get_connect_handle(drv->first_bss), 1,
- NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Leave IBSS failed: ret=%d "
"(%s)", ret, strerror(-ret));
@@ -5631,9 +5584,7 @@
if (ret < 0)
goto fail;
- ret = send_and_recv_msgs_owner(drv, msg,
- get_connect_handle(drv->first_bss), 1,
- NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Join IBSS failed: ret=%d (%s)",
@@ -6034,8 +5985,12 @@
if (ret)
goto fail;
- ret = send_and_recv_msgs_owner(drv, msg, nl_connect, 1, NULL,
- (void *) -1);
+ if (nl_connect)
+ ret = send_and_recv(drv->global, nl_connect, msg,
+ NULL, (void *) -1);
+ else
+ ret = send_and_recv_msgs(drv, msg, NULL, (void *) -1);
+
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: MLME connect failed: ret=%d "
@@ -6104,17 +6059,19 @@
if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) {
enum nl80211_iftype nlmode = params->p2p ?
NL80211_IFTYPE_P2P_CLIENT : NL80211_IFTYPE_STATION;
+ struct nl_sock *nl_connect = NULL;
if (wpa_driver_nl80211_set_mode(priv, nlmode) < 0)
return -1;
if (params->key_mgmt_suite == WPA_KEY_MGMT_SAE ||
- params->key_mgmt_suite == WPA_KEY_MGMT_FT_SAE)
+ params->key_mgmt_suite == WPA_KEY_MGMT_FT_SAE) {
+ nl_connect = bss->nl_connect;
bss->use_nl_connect = 1;
- else
+ } else {
bss->use_nl_connect = 0;
+ }
- return wpa_driver_nl80211_connect(drv, params,
- get_connect_handle(bss));
+ return wpa_driver_nl80211_connect(drv, params, nl_connect);
}
nl80211_mark_disconnected(drv);
@@ -6149,9 +6106,7 @@
goto fail;
}
- ret = send_and_recv_msgs_owner(drv, msg,
- get_connect_handle(drv->first_bss), 1,
- NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL);
msg = NULL;
if (ret) {
wpa_dbg(drv->ctx, MSG_DEBUG,
@@ -7287,12 +7242,6 @@
}
#endif /* CONFIG_LIBNL3_ROUTE */
- if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) {
- wpa_printf(MSG_DEBUG,
- "nl80211: Do not open EAPOL RX socket - using control port for RX");
- goto skip_eapol_sock;
- }
-
drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE));
if (drv->eapol_sock < 0) {
wpa_printf(MSG_ERROR, "nl80211: socket(PF_PACKET, SOCK_DGRAM, ETH_P_PAE) failed: %s",
@@ -7305,7 +7254,6 @@
wpa_printf(MSG_INFO, "nl80211: Could not register read socket for eapol");
goto failed;
}
-skip_eapol_sock:
if (linux_get_ifhwaddr(drv->global->ioctl_sock, bss->ifname,
params->own_addr))
@@ -8177,13 +8125,8 @@
drv->test_use_roc_tx = 1;
}
- if (os_strstr(param, "control_port=0")) {
+ if (os_strstr(param, "control_port=0"))
drv->capa.flags &= ~WPA_DRIVER_FLAGS_CONTROL_PORT;
- drv->capa.flags2 &= ~WPA_DRIVER_FLAGS2_CONTROL_PORT_RX;
- }
-
- if (os_strstr(param, "control_port_ap=1"))
- drv->control_port_ap = 1;
if (os_strstr(param, "full_ap_client_state=0"))
drv->capa.flags &= ~WPA_DRIVER_FLAGS_FULL_AP_CLIENT_STATE;
@@ -9557,12 +9500,7 @@
if (nlmsg_append(msg, (void *) data, data_len, NLMSG_ALIGNTO) <
0)
goto fail;
- /* This test vendor_cmd can be used with nl80211 commands that
- * need the connect nl_sock, so use the owner-setting variant
- * of send_and_recv_msgs(). */
- ret = send_and_recv_msgs_owner(drv, msg,
- get_connect_handle(bss), 0,
- cmd_reply_handler, buf);
+ ret = send_and_recv_msgs(drv, msg, cmd_reply_handler, buf);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: command failed err=%d",
ret);
@@ -10017,8 +9955,7 @@
if (nl80211_put_mesh_config(msg, ¶ms->conf) < 0)
goto fail;
- ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 1,
- NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: mesh join failed: ret=%d (%s)",
@@ -10075,8 +10012,7 @@
wpa_printf(MSG_DEBUG, "nl80211: mesh leave (ifindex=%d)", drv->ifindex);
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_LEAVE_MESH);
- ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 0,
- NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: mesh leave failed: ret=%d (%s)",
ret, strerror(-ret));
diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
index 19ac44a..6e6c872 100644
--- a/src/drivers/driver_nl80211.h
+++ b/src/drivers/driver_nl80211.h
@@ -171,7 +171,6 @@
unsigned int roam_vendor_cmd_avail:1;
unsigned int get_supported_akm_suites_avail:1;
unsigned int add_sta_node_vendor_cmd_avail:1;
- unsigned int control_port_ap:1;
u64 vendor_scan_cookie;
u64 remain_on_chan_cookie;
@@ -230,7 +229,6 @@
int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv, struct nl_msg *msg,
int (*valid_handler)(struct nl_msg *, void *),
void *valid_data);
-struct nl_sock * get_connect_handle(struct i802_bss *bss);
int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
const char *ifname, enum nl80211_iftype iftype,
const u8 *addr, int wds,
diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index f033591..b4fed9e 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -441,9 +441,6 @@
if (ext_feature_isset(ext_features, len,
NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
capa->flags |= WPA_DRIVER_FLAGS_CONTROL_PORT;
- if (ext_feature_isset(ext_features, len,
- NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH))
- capa->flags2 |= WPA_DRIVER_FLAGS2_CONTROL_PORT_RX;
if (ext_feature_isset(ext_features, len,
NL80211_EXT_FEATURE_VLAN_OFFLOAD))
diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 17a06d8..d4ca2eb 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -2505,34 +2505,12 @@
static void nl80211_control_port_frame(struct wpa_driver_nl80211_data *drv,
struct nlattr **tb)
{
- u8 *src_addr;
- u16 ethertype;
-
- if (!tb[NL80211_ATTR_MAC] ||
- !tb[NL80211_ATTR_FRAME] ||
- !tb[NL80211_ATTR_CONTROL_PORT_ETHERTYPE])
+ if (!tb[NL80211_ATTR_MAC] || !tb[NL80211_ATTR_FRAME])
return;
- src_addr = nla_data(tb[NL80211_ATTR_MAC]);
- ethertype = nla_get_u16(tb[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
-
- switch (ethertype) {
- case ETH_P_RSN_PREAUTH:
- wpa_printf(MSG_INFO, "nl80211: Got pre-auth frame from "
- MACSTR " over control port unexpectedly",
- MAC2STR(src_addr));
- break;
- case ETH_P_PAE:
- drv_event_eapol_rx(drv->ctx, src_addr,
- nla_data(tb[NL80211_ATTR_FRAME]),
- nla_len(tb[NL80211_ATTR_FRAME]));
- break;
- default:
- wpa_printf(MSG_INFO, "nl80211: Unxpected ethertype 0x%04x from "
- MACSTR " over control port",
- ethertype, MAC2STR(src_addr));
- break;
- }
+ drv_event_eapol_rx(drv->ctx, nla_data(tb[NL80211_ATTR_MAC]),
+ nla_data(tb[NL80211_ATTR_FRAME]),
+ nla_len(tb[NL80211_ATTR_FRAME]));
}
@@ -2751,6 +2729,9 @@
case NL80211_CMD_UPDATE_OWE_INFO:
mlme_event_dh_event(drv, bss, tb);
break;
+ case NL80211_CMD_CONTROL_PORT_FRAME:
+ nl80211_control_port_frame(drv, tb);
+ break;
default:
wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event "
"(cmd=%d)", cmd);
@@ -2840,9 +2821,6 @@
case NL80211_CMD_EXTERNAL_AUTH:
nl80211_external_auth(bss->drv, tb);
break;
- case NL80211_CMD_CONTROL_PORT_FRAME:
- nl80211_control_port_frame(bss->drv, tb);
- break;
default:
wpa_printf(MSG_DEBUG, "nl80211: Ignored unknown event "
"(cmd=%d)", gnlh->cmd);
diff --git a/src/drivers/driver_nl80211_scan.c b/src/drivers/driver_nl80211_scan.c
index 17e8b2c..04f6bb8 100644
--- a/src/drivers/driver_nl80211_scan.c
+++ b/src/drivers/driver_nl80211_scan.c
@@ -872,7 +872,7 @@
wpa_driver_nl80211_mlme(drv, addr,
NL80211_CMD_DEAUTHENTICATE,
WLAN_REASON_PREV_AUTH_NOT_VALID, 1,
- get_connect_handle(drv->first_bss));
+ NULL);
}
}