[][MAC80211][hostapd][Add hostapd patches for WiFi Certification MBO test plan]

[Description]
Add hostapd patches for WiFi Certification MBO test plan

[Release-log]
N/A


Change-Id: I35f91d61b2818475711f2cc97dac81eedb56665a
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/5342706
diff --git a/openwrt_patches-21.02/408-2102-hostapd-Add-hostapd-patches-for-WiFi-certification-MBO-test.patch b/openwrt_patches-21.02/408-2102-hostapd-Add-hostapd-patches-for-WiFi-certification-MBO-test.patch
new file mode 100644
index 0000000..d27bbb5
--- /dev/null
+++ b/openwrt_patches-21.02/408-2102-hostapd-Add-hostapd-patches-for-WiFi-certification-MBO-test.patch
@@ -0,0 +1,610 @@
+From 44c75ac86f456f7c10367a11303426903fa27e58 Mon Sep 17 00:00:00 2001
+From: "howard.hsu" <howard-yh.hsu@mediatek.com>
+Date: Thu, 9 Dec 2021 14:45:19 +0800
+Subject: [PATCH] Add hostapd patches for WiFi certification MBO test plan
+
+---
+ ...hbor_count-and-hostapd_neighbor_inse.patch | 77 +++++++++++++++
+ ...g-neighbor-report-elements-in-ANQP-r.patch | 94 +++++++++++++++++++
+ ...g-neignbor-report-elements-in-BTM-re.patch | 68 ++++++++++++++
+ ...onfigure-BSS-Termination-TSF-by-usin.patch | 66 +++++++++++++
+ ...erface-if-BSS-Termination-TSF-is-set.patch | 47 ++++++++++
+ ...assoc_frame_timer-to-send-disassocia.patch | 63 +++++++++++++
+ ...g-neighbor-report-elements-in-BTM-re.patch | 31 ++++++
+ ...hostapd_neighbor_set_own_report_pref.patch | 89 ++++++++++++++++++
+ 8 files changed, 535 insertions(+)
+ create mode 100644 package/network/services/hostapd/patches/902-2102-Add-hostapd_neighbor_count-and-hostapd_neighbor_inse.patch
+ create mode 100644 package/network/services/hostapd/patches/903-2102-Support-including-neighbor-report-elements-in-ANQP-r.patch
+ create mode 100644 package/network/services/hostapd/patches/904-2102-Support-including-neignbor-report-elements-in-BTM-re.patch
+ create mode 100644 package/network/services/hostapd/patches/905-2102-Add-support-to-configure-BSS-Termination-TSF-by-usin.patch
+ create mode 100644 package/network/services/hostapd/patches/906-2102-Disable-interface-if-BSS-Termination-TSF-is-set.patch
+ create mode 100644 package/network/services/hostapd/patches/907-2102-Add-set_send_disassoc_frame_timer-to-send-disassocia.patch
+ create mode 100644 package/network/services/hostapd/patches/908-2102-Support-including-neighbor-report-elements-in-BTM-re.patch
+ create mode 100644 package/network/services/hostapd/patches/909-2102-Add-hostapd_neighbor_set_own_report_pref.patch
+
+diff --git a/package/network/services/hostapd/patches/902-2102-Add-hostapd_neighbor_count-and-hostapd_neighbor_inse.patch b/package/network/services/hostapd/patches/902-2102-Add-hostapd_neighbor_count-and-hostapd_neighbor_inse.patch
+new file mode 100644
+index 0000000..038d71d
+--- /dev/null
++++ b/package/network/services/hostapd/patches/902-2102-Add-hostapd_neighbor_count-and-hostapd_neighbor_inse.patch
+@@ -0,0 +1,77 @@
++From e42eb49238eec538262e465599bf417a1a8f228f Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 10:54:35 +0800
++Subject: [PATCH] Add hostapd_neighbor_count() and
++ hostapd_neighbor_insert_buffer ()
++
++The first function can count the number of neighbor report in neighbore report
++database. The second can iterate neighbor report database to build up neighbor
++report data.
++---
++ src/ap/neighbor_db.c | 37 +++++++++++++++++++++++++++++++++++++
++ src/ap/neighbor_db.h |  3 +++
++ 2 files changed, 40 insertions(+)
++
++diff --git a/src/ap/neighbor_db.c b/src/ap/neighbor_db.c
++index 2bbe318..10143a0 100644
++--- a/src/ap/neighbor_db.c
+++++ b/src/ap/neighbor_db.c
++@@ -88,6 +88,43 @@ int hostapd_neighbor_show(struct hostapd_data *hapd, char *buf, size_t buflen)
++ }
++ 
++ 
+++int hostapd_neighbor_count(struct hostapd_data *hapd)
+++{
+++	struct hostapd_neighbor_entry *nr;
+++	int count = 0;
+++
+++	dl_list_for_each(nr, &hapd->nr_db, struct hostapd_neighbor_entry,
+++			 list) {
+++		count++;
+++	}
+++	return count;
+++}
+++
+++
+++int hostapd_neighbor_insert_buffer(struct hostapd_data *hapd, char *buf,
+++        size_t buflen)
+++{
+++	struct hostapd_neighbor_entry *nr;
+++	char *pos, *end;
+++
+++	pos = buf;
+++	end = buf + buflen;
+++
+++	dl_list_for_each(nr, &hapd->nr_db, struct hostapd_neighbor_entry,
+++			 list) {
+++		/* For neighbor report IE, we only need bssid and nr*/
+++		int ret;
+++		char nrie[2 * 255 + 1];
+++		*pos++ = WLAN_EID_NEIGHBOR_REPORT;
+++		*pos++ = wpabuf_len(nr->nr);
+++ 		os_memcpy (pos, wpabuf_head(nr->nr), wpabuf_len(nr->nr));
+++		pos += wpabuf_len(nr->nr);
+++	}
+++
+++	return pos - buf;
+++}
+++
+++
++ static void hostapd_neighbor_clear_entry(struct hostapd_neighbor_entry *nr)
++ {
++ 	wpabuf_free(nr->nr);
++diff --git a/src/ap/neighbor_db.h b/src/ap/neighbor_db.h
++index bed0a2f..e93d1d5 100644
++--- a/src/ap/neighbor_db.h
+++++ b/src/ap/neighbor_db.h
++@@ -23,4 +23,7 @@ int hostapd_neighbor_remove(struct hostapd_data *hapd, const u8 *bssid,
++ 			    const struct wpa_ssid_value *ssid);
++ void hostapd_free_neighbor_db(struct hostapd_data *hapd);
++ 
+++int hostapd_neighbor_count(struct hostapd_data *hapd);
+++int hostapd_neighbor_insert_buffer(struct hostapd_data *hapd, char *buf,
+++        size_t buflen);
++ #endif /* NEIGHBOR_DB_H */
++-- 
++2.18.0
++
+diff --git a/package/network/services/hostapd/patches/903-2102-Support-including-neighbor-report-elements-in-ANQP-r.patch b/package/network/services/hostapd/patches/903-2102-Support-including-neighbor-report-elements-in-ANQP-r.patch
+new file mode 100644
+index 0000000..e3f07a5
+--- /dev/null
++++ b/package/network/services/hostapd/patches/903-2102-Support-including-neighbor-report-elements-in-ANQP-r.patch
+@@ -0,0 +1,94 @@
++From 38d9a0b2008ec6555d8b776d64040a0166633c6e Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 11:03:15 +0800
++Subject: [PATCH] Support including neighbor report elements in ANQP response
++
++---
++ src/ap/gas_serv.c | 29 +++++++++++++++++++++++++++++
++ src/ap/gas_serv.h |  2 ++
++ 2 files changed, 31 insertions(+)
++
++diff --git a/src/ap/gas_serv.c b/src/ap/gas_serv.c
++index 9567e20..43bd658 100644
++--- a/src/ap/gas_serv.c
+++++ b/src/ap/gas_serv.c
++@@ -19,6 +19,7 @@
++ #include "dpp_hostapd.h"
++ #include "sta_info.h"
++ #include "gas_serv.h"
+++#include "neighbor_db.h"
++ 
++ 
++ #ifdef CONFIG_DPP
++@@ -369,6 +370,24 @@ static void anqp_add_network_auth_type(struct hostapd_data *hapd,
++ 	}
++ }
++ 
+++static void anqp_add_neighbor_report(struct hostapd_data *hapd,
+++				       struct wpabuf *buf)
+++{
+++	struct hostapd_neighbor_entry *nr;
+++	u8 *len_pos = gas_anqp_add_element(buf, ANQP_NEIGHBOR_REPORT);
+++	if (dl_list_empty(&hapd->nr_db)) {
+++		wpabuf_put_le16(buf, 0);
+++	}
+++	else {
+++		dl_list_for_each(nr, &hapd->nr_db, struct hostapd_neighbor_entry, list ) {
+++			wpabuf_put_u8(buf, WLAN_EID_NEIGHBOR_REPORT);
+++			wpabuf_put_u8(buf, wpabuf_len(nr->nr));
+++			wpabuf_put_buf(buf, nr->nr);
+++		}
+++	}
+++	gas_anqp_set_element_len(buf, len_pos);
+++}
+++
++ 
++ static void anqp_add_roaming_consortium(struct hostapd_data *hapd,
++ 					struct wpabuf *buf)
++@@ -986,6 +1005,9 @@ gas_serv_build_gas_resp_payload(struct hostapd_data *hapd,
++ 		len += 1000;
++ 	if (request & ANQP_REQ_ICON_REQUEST)
++ 		len += 65536;
+++    if (request & ANQP_REQ_NEIGHBOR_REPORT) {
+++        len += (40 * hostapd_neighbor_count(hapd));
+++    }
++ #ifdef CONFIG_FILS
++ 	if (request & ANQP_FILS_REALM_INFO)
++ 		len += 2 * dl_list_len(&hapd->conf->fils_realms);
++@@ -1028,6 +1050,8 @@ gas_serv_build_gas_resp_payload(struct hostapd_data *hapd,
++ 		anqp_add_elem(hapd, buf, ANQP_TDLS_CAPABILITY);
++ 	if (request & ANQP_REQ_EMERGENCY_NAI)
++ 		anqp_add_elem(hapd, buf, ANQP_EMERGENCY_NAI);
+++	if (request & ANQP_REQ_NEIGHBOR_REPORT)
+++		anqp_add_neighbor_report(hapd, buf);
++ 
++ 	for (i = 0; i < num_extra_req; i++) {
++ #ifdef CONFIG_FILS
++@@ -1172,6 +1196,11 @@ static void rx_anqp_query_list_id(struct hostapd_data *hapd, u16 info_id,
++ 			     "Emergency NAI",
++ 			     get_anqp_elem(hapd, info_id) != NULL, qi);
++ 		break;
+++	case ANQP_NEIGHBOR_REPORT:
+++		set_anqp_req(ANQP_REQ_NEIGHBOR_REPORT,
+++			     "Neighbor Report",
+++			     get_anqp_elem(hapd, info_id) != NULL, qi);
+++		break;
++ 	default:
++ #ifdef CONFIG_FILS
++ 		if (info_id == ANQP_FILS_REALM_INFO &&
++diff --git a/src/ap/gas_serv.h b/src/ap/gas_serv.h
++index 1528af4..d0241f2 100644
++--- a/src/ap/gas_serv.h
+++++ b/src/ap/gas_serv.h
++@@ -40,6 +40,8 @@
++ 	(1 << (ANQP_TDLS_CAPABILITY - ANQP_QUERY_LIST))
++ #define ANQP_REQ_EMERGENCY_NAI \
++ 	(1 << (ANQP_EMERGENCY_NAI - ANQP_QUERY_LIST))
+++#define ANQP_REQ_NEIGHBOR_REPORT \
+++	(1 << (ANQP_NEIGHBOR_REPORT - ANQP_QUERY_LIST))
++ /*
++  * First 15 Hotspot 2.0 vendor specific ANQP-elements can be included in the
++  * optimized bitmap.
++-- 
++2.18.0
++
+diff --git a/package/network/services/hostapd/patches/904-2102-Support-including-neignbor-report-elements-in-BTM-re.patch b/package/network/services/hostapd/patches/904-2102-Support-including-neignbor-report-elements-in-BTM-re.patch
+new file mode 100644
+index 0000000..3a6c82e
+--- /dev/null
++++ b/package/network/services/hostapd/patches/904-2102-Support-including-neignbor-report-elements-in-BTM-re.patch
+@@ -0,0 +1,68 @@
++From 2b36d2c5f227a0f2aeb7bb443e79a5282309614b Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 12:17:24 +0800
++Subject: [PATCH] Support including neignbor report elements in BTM response
++
++---
++ src/ap/wnm_ap.c | 26 ++++++++++++++++++++++++--
++ 1 file changed, 24 insertions(+), 2 deletions(-)
++
++diff --git a/src/ap/wnm_ap.c b/src/ap/wnm_ap.c
++index 248f5a1..f3a7c92 100644
++--- a/src/ap/wnm_ap.c
+++++ b/src/ap/wnm_ap.c
++@@ -20,6 +20,7 @@
++ #include "ap/wpa_auth.h"
++ #include "mbo_ap.h"
++ #include "wnm_ap.h"
+++#include "ap/neighbor_db.h"
++ 
++ #define MAX_TFS_IE_LEN  1024
++ 
++@@ -368,9 +369,21 @@ static int ieee802_11_send_bss_trans_mgmt_request(struct hostapd_data *hapd,
++ 	u8 *pos;
++ 	int res;
++ 
++-	mgmt = os_zalloc(sizeof(*mgmt));
++-	if (mgmt == NULL)
+++  	int nr_num = hostapd_neighbor_count(hapd);
+++	int nr_size = ETH_ALEN + 4 + 1 + 1 + 1 + 5;
+++	int total_nr_size = nr_num * nr_size;
+++	u8 *nr_data = os_malloc(total_nr_size);
+++	int nr_data_len = 0;
+++	if (nr_data == NULL) {
+++		wpa_printf (MSG_ERROR, "Failed to allocate memory");
+++	} else {
+++	    nr_data_len = hostapd_neighbor_insert_buffer(hapd, nr_data, total_nr_size);
+++	}
+++	mgmt = os_zalloc(sizeof(*mgmt) + nr_data_len);
+++	if (mgmt == NULL) {
+++		wpa_printf (MSG_ERROR, "Failed to allocate memory for mgmt frame");
++ 		return -1;
+++	}
++ 	os_memcpy(mgmt->da, addr, ETH_ALEN);
++ 	os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN);
++ 	os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN);
++@@ -380,10 +393,19 @@ static int ieee802_11_send_bss_trans_mgmt_request(struct hostapd_data *hapd,
++ 	mgmt->u.action.u.bss_tm_req.action = WNM_BSS_TRANS_MGMT_REQ;
++ 	mgmt->u.action.u.bss_tm_req.dialog_token = dialog_token;
++ 	mgmt->u.action.u.bss_tm_req.req_mode = 0;
+++	if (nr_num) {
+++		mgmt->u.action.u.bss_tm_req.req_mode |= WNM_BSS_TM_REQ_PREF_CAND_LIST_INCLUDED;
+++	}
++ 	mgmt->u.action.u.bss_tm_req.disassoc_timer = host_to_le16(0);
++ 	mgmt->u.action.u.bss_tm_req.validity_interval = 1;
++ 	pos = mgmt->u.action.u.bss_tm_req.variable;
++ 
+++
+++	if (nr_num) {
+++		os_memcpy(pos, nr_data, nr_data_len);
+++		pos += nr_data_len;
+++	}
+++
++ 	wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request to "
++ 		   MACSTR " dialog_token=%u req_mode=0x%x disassoc_timer=%u "
++ 		   "validity_interval=%u",
++-- 
++2.18.0
++
+diff --git a/package/network/services/hostapd/patches/905-2102-Add-support-to-configure-BSS-Termination-TSF-by-usin.patch b/package/network/services/hostapd/patches/905-2102-Add-support-to-configure-BSS-Termination-TSF-by-usin.patch
+new file mode 100644
+index 0000000..ec90f9e
+--- /dev/null
++++ b/package/network/services/hostapd/patches/905-2102-Add-support-to-configure-BSS-Termination-TSF-by-usin.patch
+@@ -0,0 +1,66 @@
++From c4f5049289bf5ce13ca0f10fedb6c0255c95d183 Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 11:27:23 +0800
++Subject: [PATCH] Add support to configure BSS Termination TSF by using
++ hostapd_cli cmd
++
++---
++ hostapd/ctrl_iface.c | 9 +++++++++
++ src/ap/ap_config.c   | 1 +
++ src/ap/ap_config.h   | 1 +
++ 3 files changed, 11 insertions(+)
++
++diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
++index 5b7f075..87f219d 100644
++--- a/hostapd/ctrl_iface.c
+++++ b/hostapd/ctrl_iface.c
++@@ -946,6 +946,10 @@ static int hostapd_ctrl_iface_bss_tm_req(struct hostapd_data *hapd,
++ 			wpa_printf(MSG_DEBUG, "Invalid bss_term data");
++ 			return -1;
++ 		}
+++		if (hapd->conf->bss_termination_tsf) {
+++			WPA_PUT_LE64(&bss_term_dur[2], hapd->conf->bss_termination_tsf);
+++		}
+++
++ 		end++;
++ 		WPA_PUT_LE16(&bss_term_dur[10], atoi(end));
++ 	}
++@@ -1515,6 +1519,11 @@ static int hostapd_ctrl_iface_set(struct hostapd_data *hapd, char *cmd)
++ #endif /* CONFIG_DPP */
++ 	} else if (os_strcasecmp(cmd, "setband") == 0) {
++ 		ret = hostapd_ctrl_iface_set_band(hapd, value);
+++	} else if (os_strcasecmp(cmd, "bss_termination_tsf") == 0) {
+++		int termination_sec = atoi(value);
+++		hapd->conf->bss_termination_tsf = termination_sec;
+++		wpa_printf(MSG_DEBUG, "BSS Termination TSF: value = %d",
+++                termination_sec);
++ 	} else {
++ 		ret = hostapd_set_iface(hapd->iconf, hapd->conf, cmd, value);
++ 		if (ret)
++diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c
++index 91ceb9c..262f8e7 100644
++--- a/src/ap/ap_config.c
+++++ b/src/ap/ap_config.c
++@@ -164,6 +164,7 @@ void hostapd_config_defaults_bss(struct hostapd_bss_config *bss)
++ #ifdef CONFIG_TESTING_OPTIONS
++ 	bss->sae_commit_status = -1;
++ #endif /* CONFIG_TESTING_OPTIONS */
+++	bss->bss_termination_tsf = 0;
++ }
++ 
++ 
++diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
++index 09823bf..f0825f2 100644
++--- a/src/ap/ap_config.h
+++++ b/src/ap/ap_config.h
++@@ -551,6 +551,7 @@ struct hostapd_bss_config {
++ 	int wnm_sleep_mode;
++ 	int wnm_sleep_mode_no_keys;
++ 	int bss_transition;
+++	unsigned int bss_termination_tsf;
++ 
++ 	/* IEEE 802.11u - Interworking */
++ 	int interworking;
++-- 
++2.18.0
++
+diff --git a/package/network/services/hostapd/patches/906-2102-Disable-interface-if-BSS-Termination-TSF-is-set.patch b/package/network/services/hostapd/patches/906-2102-Disable-interface-if-BSS-Termination-TSF-is-set.patch
+new file mode 100644
+index 0000000..b3d296b
+--- /dev/null
++++ b/package/network/services/hostapd/patches/906-2102-Disable-interface-if-BSS-Termination-TSF-is-set.patch
+@@ -0,0 +1,47 @@
++From d9388fc13d85f057caf06b55c3ac1ba2e807b3d9 Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 12:22:57 +0800
++Subject: [PATCH] Disable interface if BSS Termination TSF is set
++
++---
++ src/ap/wnm_ap.c | 17 +++++++++++++++++
++ 1 file changed, 17 insertions(+)
++
++diff --git a/src/ap/wnm_ap.c b/src/ap/wnm_ap.c
++index f3a7c92..9772835 100644
++--- a/src/ap/wnm_ap.c
+++++ b/src/ap/wnm_ap.c
++@@ -755,6 +755,22 @@ static void set_disassoc_timer(struct hostapd_data *hapd, struct sta_info *sta,
++ }
++ 
++ 
+++void bss_termination_disable_iface(void *eloop_ctx, void *timeout_ctx)
+++{
+++	struct hostapd_data *hapd = eloop_ctx;
+++	hostapd_disable_iface(hapd->iface);
+++}
+++
+++
+++static void set_disable_iface_timer(struct hostapd_data *hapd, struct sta_info *sta,
+++			       int disable_iface_timer)
+++{
+++	wpa_printf(MSG_DEBUG, "Disable interface timer set to %d secs", disable_iface_timer);
+++	eloop_register_timeout(disable_iface_timer, 0,
+++			       bss_termination_disable_iface, hapd, NULL);
+++}
+++
+++
++ int wnm_send_ess_disassoc_imminent(struct hostapd_data *hapd,
++ 				   struct sta_info *sta, const char *url,
++ 				   int disassoc_timer)
++@@ -841,6 +857,7 @@ int wnm_send_bss_tm_req(struct hostapd_data *hapd, struct sta_info *sta,
++ 	    bss_term_dur) {
++ 		os_memcpy(pos, bss_term_dur, 12);
++ 		pos += 12;
+++		set_disable_iface_timer(hapd, sta, hapd->conf->bss_termination_tsf);
++ 	}
++ 
++ 	if (url) {
++-- 
++2.18.0
++
+diff --git a/package/network/services/hostapd/patches/907-2102-Add-set_send_disassoc_frame_timer-to-send-disassocia.patch b/package/network/services/hostapd/patches/907-2102-Add-set_send_disassoc_frame_timer-to-send-disassocia.patch
+new file mode 100644
+index 0000000..814658d
+--- /dev/null
++++ b/package/network/services/hostapd/patches/907-2102-Add-set_send_disassoc_frame_timer-to-send-disassocia.patch
+@@ -0,0 +1,63 @@
++From cdba633ed9955ecf99f9d9833b10083b6e780314 Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 12:46:01 +0800
++Subject: [PATCH] Add set_send_disassoc_frame_timer() to send disassociate
++ frame
++
++Function set_disassoc_timer() may fail if key was deleted first. This new
++function will not ask to delete key as set_disassoc_timer() did.
++---
++ src/ap/wnm_ap.c | 30 +++++++++++++++++++++++++++++-
++ 1 file changed, 29 insertions(+), 1 deletion(-)
++
++diff --git a/src/ap/wnm_ap.c b/src/ap/wnm_ap.c
++index 9772835..4edfecf 100644
++--- a/src/ap/wnm_ap.c
+++++ b/src/ap/wnm_ap.c
++@@ -755,6 +755,34 @@ static void set_disassoc_timer(struct hostapd_data *hapd, struct sta_info *sta,
++ }
++ 
++ 
+++static void set_send_disassoc_frame_timer(struct hostapd_data *hapd, struct sta_info *sta,
+++			       int disassoc_timer)
+++{
+++	int timeout, beacon_int;
+++
+++	/*
+++	 * Prevent STA from reconnecting using cached PMKSA to force
+++	 * full authentication with the authentication server (which may
+++	 * decide to reject the connection),
+++	 */
+++	wpa_auth_pmksa_remove(hapd->wpa_auth, sta->addr);
+++
+++	beacon_int = hapd->iconf->beacon_int;
+++	if (beacon_int < 1)
+++		beacon_int = 100; /* best guess */
+++	/* Calculate timeout in ms based on beacon_int in TU */
+++	timeout = disassoc_timer * beacon_int * 128 / 125;
+++	wpa_printf(MSG_DEBUG, "Disassociation timer for " MACSTR
+++		   " set to %d ms", MAC2STR(sta->addr), timeout);
+++
+++	u16 reason = WLAN_REASON_PREV_AUTH_NOT_VALID;
+++
+++	hostapd_drv_sta_disassoc(hapd, sta->addr, reason);
+++	if (sta)
+++		ap_sta_disassociate(hapd, sta, reason);
+++}
+++
+++
++ void bss_termination_disable_iface(void *eloop_ctx, void *timeout_ctx)
++ {
++ 	struct hostapd_data *hapd = eloop_ctx;
++@@ -893,7 +921,7 @@ int wnm_send_bss_tm_req(struct hostapd_data *hapd, struct sta_info *sta,
++ 
++ 	if (disassoc_timer) {
++ 		/* send disassociation frame after time-out */
++-		set_disassoc_timer(hapd, sta, disassoc_timer);
+++		set_send_disassoc_frame_timer(hapd, sta, disassoc_timer);
++ 	}
++ 
++ 	return 0;
++-- 
++2.18.0
++
+diff --git a/package/network/services/hostapd/patches/908-2102-Support-including-neighbor-report-elements-in-BTM-re.patch b/package/network/services/hostapd/patches/908-2102-Support-including-neighbor-report-elements-in-BTM-re.patch
+new file mode 100644
+index 0000000..4389af5
+--- /dev/null
++++ b/package/network/services/hostapd/patches/908-2102-Support-including-neighbor-report-elements-in-BTM-re.patch
+@@ -0,0 +1,31 @@
++From f0403572a26f0e2acb6eb91a71516ddc65b3683f Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 13:51:28 +0800
++Subject: [PATCH] Support including neighbor report elements in BTM request
++
++---
++ hostapd/ctrl_iface.c | 7 ++++++-
++ 1 file changed, 6 insertions(+), 1 deletion(-)
++
++diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
++index 87f219d..a5c2ae4 100644
++--- a/hostapd/ctrl_iface.c
+++++ b/hostapd/ctrl_iface.c
++@@ -976,8 +976,13 @@ static int hostapd_ctrl_iface_bss_tm_req(struct hostapd_data *hapd,
++ 		req_mode |= WNM_BSS_TM_REQ_ESS_DISASSOC_IMMINENT;
++ 	}
++ 
++-	if (os_strstr(cmd, " pref=1"))
+++	if (os_strstr(cmd, " pref=1")) {
++ 		req_mode |= WNM_BSS_TM_REQ_PREF_CAND_LIST_INCLUDED;
+++		if (nei_len == 0) {
+++			// Add neigibor report from neighbor report db to nei_rep buffer
+++			nei_len = hostapd_neighbor_insert_buffer (hapd, nei_rep, 1000);
+++		}
+++	}
++ 	if (os_strstr(cmd, " abridged=1"))
++ 		req_mode |= WNM_BSS_TM_REQ_ABRIDGED;
++ 	if (os_strstr(cmd, " disassoc_imminent=1"))
++-- 
++2.18.0
++
+diff --git a/package/network/services/hostapd/patches/909-2102-Add-hostapd_neighbor_set_own_report_pref.patch b/package/network/services/hostapd/patches/909-2102-Add-hostapd_neighbor_set_own_report_pref.patch
+new file mode 100644
+index 0000000..7aaeea8
+--- /dev/null
++++ b/package/network/services/hostapd/patches/909-2102-Add-hostapd_neighbor_set_own_report_pref.patch
+@@ -0,0 +1,89 @@
++From 65aeee466fac6ef75fb7fc1ebb72c494275b900b Mon Sep 17 00:00:00 2001
++From: "howard.hsu" <howard-yh.hsu@mediatek.com>
++Date: Mon, 25 Oct 2021 14:53:40 +0800
++Subject: [PATCH] Add hostapd_neighbor_set_own_report_pref()
++
++If my own BSS is going to terminate itself, the preference value of neighbor
++report must be set to 0.
++---
++ hostapd/ctrl_iface.c |  5 ++++-
++ src/ap/neighbor_db.c | 37 +++++++++++++++++++++++++++++++++++++
++ src/ap/neighbor_db.h |  2 ++
++ 3 files changed, 43 insertions(+), 1 deletion(-)
++
++diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
++index a5c2ae4..d653ec8 100644
++--- a/hostapd/ctrl_iface.c
+++++ b/hostapd/ctrl_iface.c
++@@ -985,8 +985,11 @@ static int hostapd_ctrl_iface_bss_tm_req(struct hostapd_data *hapd,
++ 	}
++ 	if (os_strstr(cmd, " abridged=1"))
++ 		req_mode |= WNM_BSS_TM_REQ_ABRIDGED;
++-	if (os_strstr(cmd, " disassoc_imminent=1"))
+++	if (os_strstr(cmd, " disassoc_imminent=1")) {
++ 		req_mode |= WNM_BSS_TM_REQ_DISASSOC_IMMINENT;
+++		/* Set own BSS neighbor report preference value as 0 */
+++		hostapd_neighbor_set_own_report_pref(hapd, nei_rep, nei_len, 0);
+++	}
++ 
++ #ifdef CONFIG_MBO
++ 	pos = os_strstr(cmd, "mbo=");
++diff --git a/src/ap/neighbor_db.c b/src/ap/neighbor_db.c
++index 10143a0..1efd984 100644
++--- a/src/ap/neighbor_db.c
+++++ b/src/ap/neighbor_db.c
++@@ -353,3 +353,40 @@ void hostapd_neighbor_set_own_report(struct hostapd_data *hapd)
++ 	wpabuf_free(nr);
++ #endif /* NEED_AP_MLME */
++ }
+++
+++
+++void hostapd_neighbor_set_own_report_pref(struct hostapd_data *hapd, char *nei_buf,
+++			 size_t buflen, const int pref)
+++{
+++	struct hostapd_neighbor_entry *nr;
+++	char *pos, *end, *next_nr;
+++
+++	pos = nei_buf;
+++	end = nei_buf + buflen;
+++	next_nr = nei_buf;
+++
+++	dl_list_for_each(nr, &hapd->nr_db, struct hostapd_neighbor_entry,
+++			 list) {
+++		pos = next_nr;
+++		next_nr = pos + 2 + wpabuf_len(nr->nr);
+++		/* Shift 2 bytes for Element ID and Neighbor report length */
+++		pos = pos + 2;
+++		if(os_memcmp(pos, hapd->own_addr, ETH_ALEN) == 0) {
+++			/* Shift for BSSID + BSSID info + Op_class + channel num + PHY type */
+++			pos = pos + 6 + 4 + 1 + 1 + 1;
+++
+++			/* Iterate Subelement */
+++			while (next_nr - pos > 0) {
+++				if (*pos == 3) {
+++					pos = pos + 2;
+++					*pos = pref;
+++					return;
+++				} else {
+++					pos++;
+++					int shift_len = *pos++;
+++					pos = pos + shift_len;
+++				}
+++			}
+++		}
+++	}
+++}
++diff --git a/src/ap/neighbor_db.h b/src/ap/neighbor_db.h
++index e93d1d5..dc6807b 100644
++--- a/src/ap/neighbor_db.h
+++++ b/src/ap/neighbor_db.h
++@@ -26,4 +26,6 @@ void hostapd_free_neighbor_db(struct hostapd_data *hapd);
++ int hostapd_neighbor_count(struct hostapd_data *hapd);
++ int hostapd_neighbor_insert_buffer(struct hostapd_data *hapd, char *buf,
++         size_t buflen);
+++void hostapd_neighbor_set_own_report_pref(struct hostapd_data *hapd, char *nei_buf,
+++			 size_t buflen, const int pref);
++ #endif /* NEIGHBOR_DB_H */
++-- 
++2.18.0
++
+-- 
+2.18.0
+