[][MAC80211][hostapd][Fix hostapd patches for WiFi Certification MBO test plan]
[Description]
Fix previous hostapd patch for WiFi Certification MBO test plan. It includes some
duplicate patches which makes project build fail. This commit is used to delete
duplicated patches.
[Release-log]
N/A
Change-Id: Ida06a24f7a4c6ed142d6309b60b5bd9f58b2e3c4
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/5544982
diff --git a/openwrt_patches-21.02/414-master-hostapd-patches-for-WiFi-Certification-MBO-test.patch b/openwrt_patches-21.02/414-master-hostapd-patches-for-WiFi-Certification-MBO-test.patch
index 13c14c6..a4fb26b 100644
--- a/openwrt_patches-21.02/414-master-hostapd-patches-for-WiFi-Certification-MBO-test.patch
+++ b/openwrt_patches-21.02/414-master-hostapd-patches-for-WiFi-Certification-MBO-test.patch
@@ -1,26 +1,22 @@
-From 38040b75986d6efe3d6c846cd3850c21bff94f62 Mon Sep 17 00:00:00 2001
+From a2dcc0845430159d30e4a1f2054911e38ea09b60 Mon Sep 17 00:00:00 2001
From: "howard.hsu" <howard-yh.hsu@mediatek.com>
Date: Thu, 20 Jan 2022 16:39:04 +0800
Subject: [PATCH] Add hostapd patches for WiFi Certification MBO test plan
---
- ...hbor_count-and-hostapd_neighbor_inse.patch | 72 ++
- ...g-neighbor-report-elements-in-ANQP-r.patch | 95 ++
- ...ster-sync-include-uapi-linux-nl80211.patch | 57 ++
- ...g-neignbor-report-elements-in-BTM-re.patch | 68 ++
- .../patches/904-master-zero-wait_dfs.patch | 851 ++++++++++++++++++
- ...ing-BSS-Termination-TSF-by-using-hos.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 | 88 ++
- ...d_neighbor_set_pref_by_non_pref_chan.patch | 101 +++
- 11 files changed, 1539 insertions(+)
+ ...hbor_count-and-hostapd_neighbor_inse.patch | 72 +++++++++++++
+ ...g-neighbor-report-elements-in-ANQP-r.patch | 95 ++++++++++++++++
+ ...g-neignbor-report-elements-in-BTM-re.patch | 68 ++++++++++++
+ ...ing-BSS-Termination-TSF-by-using-hos.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 | 88 +++++++++++++++
+ ...d_neighbor_set_pref_by_non_pref_chan.patch | 101 ++++++++++++++++++
+ 9 files changed, 631 insertions(+)
create mode 100644 package/network/services/hostapd/patches/902-master-Add-hostapd_neighbor_count-and-hostapd_neighbor_inse.patch
create mode 100644 package/network/services/hostapd/patches/903-master-Support-including-neighbor-report-elements-in-ANQP-r.patch
- create mode 100644 package/network/services/hostapd/patches/903-master-sync-include-uapi-linux-nl80211.patch
create mode 100644 package/network/services/hostapd/patches/904-master-Support-including-neignbor-report-elements-in-BTM-re.patch
- create mode 100644 package/network/services/hostapd/patches/904-master-zero-wait_dfs.patch
create mode 100644 package/network/services/hostapd/patches/905-master-Support-configuring-BSS-Termination-TSF-by-using-hos.patch
create mode 100644 package/network/services/hostapd/patches/906-master-Disable-interface-if-BSS-Termination-TSF-is-set.patch
create mode 100644 package/network/services/hostapd/patches/907-master-Add-set_send_disassoc_frame_timer-to-send-disassocia.patch
@@ -207,69 +203,6 @@
+--
+2.18.0
+
-diff --git a/package/network/services/hostapd/patches/903-master-sync-include-uapi-linux-nl80211.patch b/package/network/services/hostapd/patches/903-master-sync-include-uapi-linux-nl80211.patch
-new file mode 100644
-index 0000000..fe47b57
---- /dev/null
-+++ b/package/network/services/hostapd/patches/903-master-sync-include-uapi-linux-nl80211.patch
-@@ -0,0 +1,57 @@
-+diff --git a/src/drivers/nl80211_copy.h b/src/drivers/nl80211_copy.h
-+index f962c06..f7be755 100644
-+--- a/src/drivers/nl80211_copy.h
-++++ b/src/drivers/nl80211_copy.h
-+@@ -2560,6 +2560,19 @@ enum nl80211_commands {
-+ * disassoc events to indicate that an immediate reconnect to the AP
-+ * is desired.
-+ *
-++ * @NL80211_ATTR_OBSS_COLOR_BITMAP: bitmap of the u64 BSS colors for the
-++ * %NL80211_CMD_OBSS_COLOR_COLLISION event.
-++ *
-++ * @NL80211_ATTR_COLOR_CHANGE_COUNT: u8 attribute specifying the number of TBTT's
-++ * until the color switch event.
-++ * @NL80211_ATTR_COLOR_CHANGE_COLOR: u8 attribute specifying the color that we are
-++ * switching to
-++ * @NL80211_ATTR_COLOR_CHANGE_ELEMS: Nested set of attributes containing the IE
-++ * information for the time while performing a color switch.
-++ *
-++ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
-++ * transmit power to stay within regulatory limits. u32, dBi.
-++ *
-+ * @NUM_NL80211_ATTR: total number of nl80211_attrs available
-+ * @NL80211_ATTR_MAX: highest attribute number currently defined
-+ * @__NL80211_ATTR_AFTER_LAST: internal use
-+@@ -3057,6 +3070,14 @@ enum nl80211_attrs {
-+
-+ NL80211_ATTR_DISABLE_HE,
-+
-++ NL80211_ATTR_OBSS_COLOR_BITMAP,
-++
-++ NL80211_ATTR_COLOR_CHANGE_COUNT,
-++ NL80211_ATTR_COLOR_CHANGE_COLOR,
-++ NL80211_ATTR_COLOR_CHANGE_ELEMS,
-++
-++ NL80211_ATTR_WIPHY_ANTENNA_GAIN,
-++
-+ /* add attributes here, update the policy in nl80211.c */
-+
-+ __NL80211_ATTR_AFTER_LAST,
-+@@ -5950,6 +5971,9 @@ enum nl80211_feature_flags {
-+ * frame protection for all management frames exchanged during the
-+ * negotiation and range measurement procedure.
-+ *
-++ * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision
-++ * detection and change announcemnts.
-++ *
-+ * @NUM_NL80211_EXT_FEATURES: number of extended features.
-+ * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
-+ */
-+@@ -6014,6 +6038,7 @@ enum nl80211_ext_feature_index {
-+ NL80211_EXT_FEATURE_SECURE_LTF,
-+ NL80211_EXT_FEATURE_SECURE_RTT,
-+ NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
-++ NL80211_EXT_FEATURE_BSS_COLOR,
-+
-+ /* add new features before the definition below */
-+ NUM_NL80211_EXT_FEATURES,
diff --git a/package/network/services/hostapd/patches/904-master-Support-including-neignbor-report-elements-in-BTM-re.patch b/package/network/services/hostapd/patches/904-master-Support-including-neignbor-report-elements-in-BTM-re.patch
new file mode 100644
index 0000000..504c738
@@ -344,863 +277,6 @@
+--
+2.18.0
+
-diff --git a/package/network/services/hostapd/patches/904-master-zero-wait_dfs.patch b/package/network/services/hostapd/patches/904-master-zero-wait_dfs.patch
-new file mode 100644
-index 0000000..cb11aee
---- /dev/null
-+++ b/package/network/services/hostapd/patches/904-master-zero-wait_dfs.patch
-@@ -0,0 +1,851 @@
-+diff --git a/hostapd/config_file.c b/hostapd/config_file.c
-+index 1e1b685..8f6281a 100644
-+--- a/hostapd/config_file.c
-++++ b/hostapd/config_file.c
-+@@ -2476,6 +2476,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
-+ conf->ieee80211d = atoi(pos);
-+ } else if (os_strcmp(buf, "ieee80211h") == 0) {
-+ conf->ieee80211h = atoi(pos);
-++ } else if (os_strcmp(buf, "radar_offchan") == 0) {
-++ conf->radar_offchan = atoi(pos);
-+ } else if (os_strcmp(buf, "ieee8021x") == 0) {
-+ bss->ieee802_1x = atoi(pos);
-+ } else if (os_strcmp(buf, "eapol_version") == 0) {
-+diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
-+index a89ce9b..0c951a9 100644
-+--- a/hostapd/hostapd.conf
-++++ b/hostapd/hostapd.conf
-+@@ -143,6 +143,13 @@ ssid=test
-+ # ieee80211d=1 and local_pwr_constraint configured.
-+ #spectrum_mgmt_required=1
-+
-++# Enable radar/CAC detection through a dedicated offchannel chain available on
-++# some hw. The chain can't be used to transmits or receives frames.
-++# This feature allows to avoid CAC downtime switching on a different channel
-++# during CAC detection on the selected radar channel.
-++# (default: 0 = disabled, 1 = enabled)
-++#radar_offchan=0
-++
-+ # Operation mode (a = IEEE 802.11a (5 GHz), b = IEEE 802.11b (2.4 GHz),
-+ # g = IEEE 802.11g (2.4 GHz), ad = IEEE 802.11ad (60 GHz); a/g options are used
-+ # with IEEE 802.11n (HT), too, to specify band). For IEEE 802.11ac (VHT), this
-+diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
-+index 28b7efe..ffc3c2c 100644
-+--- a/src/ap/ap_config.h
-++++ b/src/ap/ap_config.h
-+@@ -993,6 +993,7 @@ struct hostapd_config {
-+ int ieee80211d;
-+
-+ int ieee80211h; /* DFS */
-++ int radar_offchan;
-+
-+ /*
-+ * Local power constraint is an octet encoded as an unsigned integer in
-+diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
-+index bc49079..c97ee39 100644
-+--- a/src/ap/ap_drv_ops.c
-++++ b/src/ap/ap_drv_ops.c
-+@@ -810,7 +810,8 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface,
-+ int channel, int ht_enabled, int vht_enabled,
-+ int he_enabled,
-+ int sec_channel_offset, int oper_chwidth,
-+- int center_segment0, int center_segment1)
-++ int center_segment0, int center_segment1,
-++ int radar_offchan)
-+ {
-+ struct hostapd_data *hapd = iface->bss[0];
-+ struct hostapd_freq_params data;
-+@@ -836,10 +837,14 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface,
-+ wpa_printf(MSG_ERROR, "Can't set freq params");
-+ return -1;
-+ }
-++ data.radar_offchan = radar_offchan;
-+
-+ res = hapd->driver->start_dfs_cac(hapd->drv_priv, &data);
-+ if (!res) {
-+- iface->cac_started = 1;
-++ if (radar_offchan)
-++ iface->radar_offchan.cac_started = 1;
-++ else
-++ iface->cac_started = 1;
-+ os_get_reltime(&iface->dfs_cac_start);
-+ }
-+
-+diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
-+index 61c8f64..92842a1 100644
-+--- a/src/ap/ap_drv_ops.h
-++++ b/src/ap/ap_drv_ops.h
-+@@ -130,7 +130,8 @@ int hostapd_start_dfs_cac(struct hostapd_iface *iface,
-+ int channel, int ht_enabled, int vht_enabled,
-+ int he_enabled,
-+ int sec_channel_offset, int oper_chwidth,
-+- int center_segment0, int center_segment1);
-++ int center_segment0, int center_segment1,
-++ int radar_offchan);
-+ int hostapd_drv_do_acs(struct hostapd_data *hapd);
-+ int hostapd_drv_update_dh_ie(struct hostapd_data *hapd, const u8 *peer,
-+ u16 reason_code, const u8 *ie, size_t ielen);
-+diff --git a/src/ap/dfs.c b/src/ap/dfs.c
-+index eccda1a..3b1276f 100644
-+--- a/src/ap/dfs.c
-++++ b/src/ap/dfs.c
-+@@ -51,16 +51,31 @@ static int dfs_get_used_n_chans(struct hostapd_iface *iface, int *seg1)
-+ return n_chans;
-+ }
-+
-+-
-++/*
-++ * flags:
-++ * - 0: any channel
-++ * - 1: non-radar channel or radar available one
-++ * - 2: radar-only channel not yet available
-++ */
-+ static int dfs_channel_available(struct hostapd_channel_data *chan,
-+- int skip_radar)
-++ int flags)
-+ {
-++ if (flags == 2) {
-++ /* Select only radar channel where CAC has not been
-++ * performed yet
-++ */
-++ if ((chan->flag & HOSTAPD_CHAN_RADAR) &&
-++ (chan->flag & HOSTAPD_CHAN_DFS_MASK) ==
-++ HOSTAPD_CHAN_DFS_USABLE)
-++ return 1;
-++ return 0;
-++ }
-+ /*
-+ * When radar detection happens, CSA is performed. However, there's no
-+ * time for CAC, so radar channels must be skipped when finding a new
-+ * channel for CSA, unless they are available for immediate use.
-+ */
-+- if (skip_radar && (chan->flag & HOSTAPD_CHAN_RADAR) &&
-++ if (flags && (chan->flag & HOSTAPD_CHAN_RADAR) &&
-+ ((chan->flag & HOSTAPD_CHAN_DFS_MASK) !=
-+ HOSTAPD_CHAN_DFS_AVAILABLE))
-+ return 0;
-+@@ -136,10 +151,15 @@ dfs_get_chan_data(struct hostapd_hw_modes *mode, int freq, int first_chan_idx)
-+ return NULL;
-+ }
-+
-+-
-++/*
-++ * flags:
-++ * - 0: any channel
-++ * - 1: non-radar channel or radar available one
-++ * - 2: radar-only channel not yet available
-++ */
-+ static int dfs_chan_range_available(struct hostapd_hw_modes *mode,
-+ int first_chan_idx, int num_chans,
-+- int skip_radar)
-++ int flags)
-+ {
-+ struct hostapd_channel_data *first_chan, *chan;
-+ int i;
-+@@ -178,7 +198,7 @@ static int dfs_chan_range_available(struct hostapd_hw_modes *mode,
-+ return 0;
-+ }
-+
-+- if (!dfs_channel_available(chan, skip_radar)) {
-++ if (!dfs_channel_available(chan, flags)) {
-+ wpa_printf(MSG_DEBUG, "DFS: channel not available %d",
-+ first_chan->freq + i * 20);
-+ return 0;
-+@@ -205,10 +225,15 @@ static int is_in_chanlist(struct hostapd_iface *iface,
-+ * - hapd->secondary_channel
-+ * - hapd->vht/he_oper_centr_freq_seg0_idx
-+ * - hapd->vht/he_oper_centr_freq_seg1_idx
-++ *
-++ * flags:
-++ * - 0: any channel
-++ * - 1: non-radar channel or radar available one
-++ * - 2: radar-only channel not yet available
-+ */
-+ static int dfs_find_channel(struct hostapd_iface *iface,
-+ struct hostapd_channel_data **ret_chan,
-+- int idx, int skip_radar)
-++ int idx, int flags)
-+ {
-+ struct hostapd_hw_modes *mode;
-+ struct hostapd_channel_data *chan;
-+@@ -233,7 +258,7 @@ static int dfs_find_channel(struct hostapd_iface *iface,
-+ }
-+
-+ /* Skip incompatible chandefs */
-+- if (!dfs_chan_range_available(mode, i, n_chans, skip_radar)) {
-++ if (!dfs_chan_range_available(mode, i, n_chans, flags)) {
-+ wpa_printf(MSG_DEBUG,
-+ "DFS: range not available for %d (%d)",
-+ chan->freq, chan->chan);
-+@@ -467,13 +492,18 @@ static int dfs_check_chans_unavailable(struct hostapd_iface *iface,
-+ return res;
-+ }
-+
-+-
-++/*
-++ * flags:
-++ * - 0: any channel
-++ * - 1: non-radar channel or radar available one
-++ * - 2: radar-only channel not yet available
-++ */
-+ static struct hostapd_channel_data *
-+ dfs_get_valid_channel(struct hostapd_iface *iface,
-+ int *secondary_channel,
-+ u8 *oper_centr_freq_seg0_idx,
-+ u8 *oper_centr_freq_seg1_idx,
-+- int skip_radar)
-++ int flags)
-+ {
-+ struct hostapd_hw_modes *mode;
-+ struct hostapd_channel_data *chan = NULL;
-+@@ -502,7 +532,7 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
-+ return NULL;
-+
-+ /* Get the count first */
-+- num_available_chandefs = dfs_find_channel(iface, NULL, 0, skip_radar);
-++ num_available_chandefs = dfs_find_channel(iface, NULL, 0, flags);
-+ wpa_printf(MSG_DEBUG, "DFS: num_available_chandefs=%d",
-+ num_available_chandefs);
-+ if (num_available_chandefs == 0)
-+@@ -523,7 +553,7 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
-+ return NULL;
-+
-+ chan_idx = _rand % num_available_chandefs;
-+- dfs_find_channel(iface, &chan, chan_idx, skip_radar);
-++ dfs_find_channel(iface, &chan, chan_idx, flags);
-+ if (!chan) {
-+ wpa_printf(MSG_DEBUG, "DFS: no random channel found");
-+ return NULL;
-+@@ -552,7 +582,7 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
-+ for (i = 0; i < num_available_chandefs - 1; i++) {
-+ /* start from chan_idx + 1, end when chan_idx - 1 */
-+ chan_idx2 = (chan_idx + 1 + i) % num_available_chandefs;
-+- dfs_find_channel(iface, &chan2, chan_idx2, skip_radar);
-++ dfs_find_channel(iface, &chan2, chan_idx2, flags);
-+ if (chan2 && abs(chan2->chan - chan->chan) > 12) {
-+ /* two channels are not adjacent */
-+ sec_chan_idx_80p80 = chan2->chan;
-+@@ -582,6 +612,27 @@ dfs_get_valid_channel(struct hostapd_iface *iface,
-+ return chan;
-+ }
-+
-++static int dfs_set_valid_channel(struct hostapd_iface *iface, int skip_radar)
-++{
-++ struct hostapd_channel_data *channel;
-++ u8 cf1 = 0, cf2 = 0;
-++ int sec = 0;
-++
-++ channel = dfs_get_valid_channel(iface, &sec, &cf1, &cf2,
-++ skip_radar);
-++ if (!channel) {
-++ wpa_printf(MSG_ERROR, "could not get valid channel");
-++ return -1;
-++ }
-++
-++ iface->freq = channel->freq;
-++ iface->conf->channel = channel->chan;
-++ iface->conf->secondary_channel = sec;
-++ hostapd_set_oper_centr_freq_seg0_idx(iface->conf, cf1);
-++ hostapd_set_oper_centr_freq_seg1_idx(iface->conf, cf2);
-++
-++ return 0;
-++}
-+
-+ static int set_dfs_state_freq(struct hostapd_iface *iface, int freq, u32 state)
-+ {
-+@@ -761,6 +812,11 @@ static unsigned int dfs_get_cac_time(struct hostapd_iface *iface,
-+ return cac_time_ms;
-+ }
-+
-++static int hostapd_is_radar_offchan_enabled(struct hostapd_iface *iface)
-++{
-++ return (iface->drv_flags2 & WPA_DRIVER_RADAR_OFFCHAN) &&
-++ iface->conf->radar_offchan;
-++}
-+
-+ /*
-+ * Main DFS handler
-+@@ -770,9 +826,8 @@ static unsigned int dfs_get_cac_time(struct hostapd_iface *iface,
-+ */
-+ int hostapd_handle_dfs(struct hostapd_iface *iface)
-+ {
-+- struct hostapd_channel_data *channel;
-+ int res, n_chans, n_chans1, start_chan_idx, start_chan_idx1;
-+- int skip_radar = 0;
-++ int skip_radar = 0, radar_offchan;
-+
-+ if (is_6ghz_freq(iface->freq))
-+ return 1;
-+@@ -825,28 +880,18 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
-+ wpa_printf(MSG_DEBUG, "DFS %d chans unavailable - choose other channel: %s",
-+ res, res ? "yes": "no");
-+ if (res) {
-+- int sec = 0;
-+- u8 cf1 = 0, cf2 = 0;
-+-
-+- channel = dfs_get_valid_channel(iface, &sec, &cf1, &cf2,
-+- skip_radar);
-+- if (!channel) {
-+- wpa_printf(MSG_ERROR, "could not get valid channel");
-++ if (dfs_set_valid_channel(iface, skip_radar) < 0) {
-+ hostapd_set_state(iface, HAPD_IFACE_DFS);
-+ return 0;
-+ }
-+-
-+- iface->freq = channel->freq;
-+- iface->conf->channel = channel->chan;
-+- iface->conf->secondary_channel = sec;
-+- hostapd_set_oper_centr_freq_seg0_idx(iface->conf, cf1);
-+- hostapd_set_oper_centr_freq_seg1_idx(iface->conf, cf2);
-+ }
-+ } while (res);
-+
-+ /* Finally start CAC */
-+ hostapd_set_state(iface, HAPD_IFACE_DFS);
-+- wpa_printf(MSG_DEBUG, "DFS start CAC on %d MHz", iface->freq);
-++ radar_offchan = hostapd_is_radar_offchan_enabled(iface);
-++ wpa_printf(MSG_DEBUG, "DFS start CAC on %d MHz offchan %d",
-++ iface->freq, radar_offchan);
-+ wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_CAC_START
-+ "freq=%d chan=%d sec_chan=%d, width=%d, seg0=%d, seg1=%d, cac_time=%ds",
-+ iface->freq,
-+@@ -863,13 +908,37 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
-+ iface->conf->secondary_channel,
-+ hostapd_get_oper_chwidth(iface->conf),
-+ hostapd_get_oper_centr_freq_seg0_idx(iface->conf),
-+- hostapd_get_oper_centr_freq_seg1_idx(iface->conf));
-++ hostapd_get_oper_centr_freq_seg1_idx(iface->conf),
-++ radar_offchan);
-+
-+ if (res) {
-+ wpa_printf(MSG_ERROR, "DFS start_dfs_cac() failed, %d", res);
-+ return -1;
-+ }
-+
-++ if (radar_offchan) {
-++ /* Cache offchannel radar parameters */
-++ iface->radar_offchan.channel = iface->conf->channel;
-++ iface->radar_offchan.secondary_channel =
-++ iface->conf->secondary_channel;
-++ iface->radar_offchan.freq = iface->freq;
-++ iface->radar_offchan.centr_freq_seg0_idx =
-++ hostapd_get_oper_centr_freq_seg0_idx(iface->conf);
-++ iface->radar_offchan.centr_freq_seg1_idx =
-++ hostapd_get_oper_centr_freq_seg1_idx(iface->conf);
-++
-++ /*
-++ * Let's select a random channel for the moment
-++ * and perform CAC on dedicated radar chain
-++ */
-++ res = dfs_set_valid_channel(iface, 1);
-++ if (res < 0)
-++ return res;
-++
-++ iface->radar_offchan.temp_ch = 1;
-++ return 1;
-++ }
-++
-+ return 0;
-+ }
-+
-+@@ -890,6 +959,157 @@ int hostapd_is_dfs_chan_available(struct hostapd_iface *iface)
-+ return dfs_check_chans_available(iface, start_chan_idx, n_chans);
-+ }
-+
-++static int hostapd_dfs_request_channel_switch(struct hostapd_iface *iface,
-++ int channel, int freq,
-++ int secondary_channel,
-++ u8 oper_centr_freq_seg0_idx,
-++ u8 oper_centr_freq_seg1_idx)
-++{
-++ struct hostapd_hw_modes *cmode = iface->current_mode;
-++ int ieee80211_mode = IEEE80211_MODE_AP, err, i;
-++ struct csa_settings csa_settings;
-++ u8 new_vht_oper_chwidth;
-++
-++ wpa_printf(MSG_DEBUG, "DFS will switch to a new channel %d", channel);
-++ wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_NEW_CHANNEL
-++ "freq=%d chan=%d sec_chan=%d", freq, channel,
-++ secondary_channel);
-++
-++ new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
-++ hostapd_set_oper_chwidth(iface->conf,
-++ hostapd_get_oper_chwidth(iface->conf));
-++
-++ /* Setup CSA request */
-++ os_memset(&csa_settings, 0, sizeof(csa_settings));
-++ csa_settings.cs_count = 5;
-++ csa_settings.block_tx = 1;
-++#ifdef CONFIG_MESH
-++ if (iface->mconf)
-++ ieee80211_mode = IEEE80211_MODE_MESH;
-++#endif /* CONFIG_MESH */
-++ err = hostapd_set_freq_params(&csa_settings.freq_params,
-++ iface->conf->hw_mode,
-++ freq, channel,
-++ iface->conf->enable_edmg,
-++ iface->conf->edmg_channel,
-++ iface->conf->ieee80211n,
-++ iface->conf->ieee80211ac,
-++ iface->conf->ieee80211ax,
-++ secondary_channel,
-++ new_vht_oper_chwidth,
-++ oper_centr_freq_seg0_idx,
-++ oper_centr_freq_seg1_idx,
-++ cmode->vht_capab,
-++ &cmode->he_capab[ieee80211_mode]);
-++
-++ if (err) {
-++ wpa_printf(MSG_ERROR, "DFS failed to calculate CSA freq params");
-++ hostapd_disable_iface(iface);
-++ return err;
-++ }
-++
-++ for (i = 0; i < iface->num_bss; i++) {
-++ err = hostapd_switch_channel(iface->bss[i], &csa_settings);
-++ if (err)
-++ break;
-++ }
-++
-++ if (err) {
-++ wpa_printf(MSG_WARNING, "DFS failed to schedule CSA (%d) - trying fallback",
-++ err);
-++ iface->freq = freq;
-++ iface->conf->channel = channel;
-++ iface->conf->secondary_channel = secondary_channel;
-++ hostapd_set_oper_chwidth(iface->conf, new_vht_oper_chwidth);
-++ hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
-++ oper_centr_freq_seg0_idx);
-++ hostapd_set_oper_centr_freq_seg1_idx(iface->conf,
-++ oper_centr_freq_seg1_idx);
-++
-++ hostapd_disable_iface(iface);
-++ hostapd_enable_iface(iface);
-++
-++ return 0;
-++ }
-++
-++ /* Channel configuration will be updated once CSA completes and
-++ * ch_switch_notify event is received */
-++ wpa_printf(MSG_DEBUG, "DFS waiting channel switch event");
-++
-++ return 0;
-++}
-++
-++static struct hostapd_channel_data *
-++dfs_downgrade_bandwidth(struct hostapd_iface *iface, int *secondary_channel,
-++ u8 *oper_centr_freq_seg0_idx,
-++ u8 *oper_centr_freq_seg1_idx, int *skip_radar);
-++
-++static void
-++hostpad_dfs_update_offchannel_chain(struct hostapd_iface *iface)
-++{
-++ struct hostapd_channel_data *channel;
-++ int sec = 0, flags = 2;
-++ u8 cf1 = 0, cf2 = 0;
-++
-++ channel = dfs_get_valid_channel(iface, &sec, &cf1, &cf2, 2);
-++ if (!channel || channel->chan == iface->conf->channel)
-++ channel = dfs_downgrade_bandwidth(iface, &sec, &cf1, &cf2,
-++ &flags);
-++ if (!channel ||
-++ hostapd_start_dfs_cac(iface, iface->conf->hw_mode,
-++ channel->freq, channel->chan,
-++ iface->conf->ieee80211n,
-++ iface->conf->ieee80211ac,
-++ iface->conf->ieee80211ax,
-++ sec, hostapd_get_oper_chwidth(iface->conf),
-++ cf1, cf2, 1)) {
-++ /*
-++ * Toggle interface state to enter DFS state
-++ * until NOP is finished.
-++ */
-++ wpa_printf(MSG_ERROR, "DFS failed start CAC offchannel");
-++ return;
-++ }
-++
-++ wpa_printf(MSG_DEBUG, "%s: setting offchannel chain to chan %d (%d MHz)",
-++ __func__, channel->chan, channel->freq);
-++
-++ iface->radar_offchan.channel = channel->chan;
-++ iface->radar_offchan.freq = channel->freq;
-++ iface->radar_offchan.secondary_channel = sec;
-++ iface->radar_offchan.centr_freq_seg0_idx = cf1;
-++ iface->radar_offchan.centr_freq_seg1_idx = cf2;
-++}
-++
-++/* FIXME: check if all channel bandwith */
-++static int
-++hostapd_dfs_is_offchan_event(struct hostapd_iface *iface, int freq)
-++{
-++ if (iface->radar_offchan.freq != freq)
-++ return 0;
-++
-++ return 1;
-++}
-++
-++static int
-++hostapd_dfs_start_channel_switch_offchan(struct hostapd_iface *iface)
-++{
-++ iface->conf->channel = iface->radar_offchan.channel;
-++ iface->freq = iface->radar_offchan.freq;
-++ iface->conf->secondary_channel =
-++ iface->radar_offchan.secondary_channel;
-++ hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
-++ iface->radar_offchan.centr_freq_seg0_idx);
-++ hostapd_set_oper_centr_freq_seg1_idx(iface->conf,
-++ iface->radar_offchan.centr_freq_seg1_idx);
-++
-++ hostpad_dfs_update_offchannel_chain(iface);
-++
-++ return hostapd_dfs_request_channel_switch(iface, iface->conf->channel,
-++ iface->freq, iface->conf->secondary_channel,
-++ hostapd_get_oper_centr_freq_seg0_idx(iface->conf),
-++ hostapd_get_oper_centr_freq_seg1_idx(iface->conf));
-++}
-+
-+ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
-+ int ht_enabled, int chan_offset, int chan_width,
-+@@ -911,6 +1131,23 @@ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
-+ set_dfs_state(iface, freq, ht_enabled, chan_offset,
-+ chan_width, cf1, cf2,
-+ HOSTAPD_CHAN_DFS_AVAILABLE);
-++
-++ /*
-++ * radar event from offchannel chain for selected
-++ * channel. Perfrom CSA, move main chain to selected
-++ * channel and configure offchannel chain to a new DFS
-++ * channel
-++ */
-++ if (hostapd_is_radar_offchan_enabled(iface) &&
-++ hostapd_dfs_is_offchan_event(iface, freq)) {
-++ iface->radar_offchan.cac_started = 0;
-++ if (iface->radar_offchan.temp_ch) {
-++ iface->radar_offchan.temp_ch = 0;
-++ return hostapd_dfs_start_channel_switch_offchan(iface);
-++ }
-++ return 0;
-++ }
-++
-+ /*
-+ * Just mark the channel available when CAC completion
-+ * event is received in enabled state. CAC result could
-+@@ -927,6 +1164,10 @@ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq,
-+ iface->cac_started = 0;
-+ }
-+ }
-++ } else if (hostapd_is_radar_offchan_enabled(iface) &&
-++ hostapd_dfs_is_offchan_event(iface, freq)) {
-++ iface->radar_offchan.cac_started = 0;
-++ hostpad_dfs_update_offchannel_chain(iface);
-+ }
-+
-+ return 0;
-+@@ -1036,6 +1277,44 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface)
-+ return err;
-+ }
-+
-++static int
-++hostapd_dfs_offchan_start_channel_switch(struct hostapd_iface *iface, int freq)
-++{
-++ if (!hostapd_is_radar_offchan_enabled(iface))
-++ return -1; /* Offchannel chain not supported */
-++
-++ wpa_printf(MSG_DEBUG,
-++ "%s called (offchannel CAC active: %s, CSA active: %s)",
-++ __func__, iface->radar_offchan.cac_started ? "yes" : "no",
-++ hostapd_csa_in_progress(iface) ? "yes" : "no");
-++
-++ /* Check if CSA in progress */
-++ if (hostapd_csa_in_progress(iface))
-++ return 0;
-++
-++ /*
-++ * If offchannel radar detation is supported and radar channel
-++ * monitored by offchain is available switch to it without waiting
-++ * for the CAC otherwise let's keep a random channel.
-++ * If radar pattern is reported on offchannel chain, just switch to
-++ * monitor another radar channel.
-++ */
-++ if (hostapd_dfs_is_offchan_event(iface, freq)) {
-++ hostpad_dfs_update_offchannel_chain(iface);
-++ return 0;
-++ }
-++
-++ /* Offchannel not availanle yet. Perform CAC on main chain */
-++ if (iface->radar_offchan.cac_started) {
-++ /* We want to switch to monitored channel as soon as
-++ * CAC is completed.
-++ */
-++ iface->radar_offchan.temp_ch = 1;
-++ return -1;
-++ }
-++
-++ return hostapd_dfs_start_channel_switch_offchan(iface);
-++}
-+
-+ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
-+ {
-+@@ -1043,13 +1322,7 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
-+ int secondary_channel;
-+ u8 oper_centr_freq_seg0_idx;
-+ u8 oper_centr_freq_seg1_idx;
-+- u8 new_vht_oper_chwidth;
-+ int skip_radar = 1;
-+- struct csa_settings csa_settings;
-+- unsigned int i;
-+- int err = 1;
-+- struct hostapd_hw_modes *cmode = iface->current_mode;
-+- u8 current_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
-+ int ieee80211_mode = IEEE80211_MODE_AP;
-+
-+ wpa_printf(MSG_DEBUG, "%s called (CAC active: %s, CSA active: %s)",
-+@@ -1113,73 +1386,16 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
-+ }
-+ }
-+
-+- wpa_printf(MSG_DEBUG, "DFS will switch to a new channel %d",
-+- channel->chan);
-+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_NEW_CHANNEL
-+- "freq=%d chan=%d sec_chan=%d", channel->freq,
-+- channel->chan, secondary_channel);
-+-
-+- new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
-+- hostapd_set_oper_chwidth(iface->conf, current_vht_oper_chwidth);
-+-
-+- /* Setup CSA request */
-+- os_memset(&csa_settings, 0, sizeof(csa_settings));
-+- csa_settings.cs_count = 5;
-+- csa_settings.block_tx = 1;
-+ #ifdef CONFIG_MESH
-+ if (iface->mconf)
-+ ieee80211_mode = IEEE80211_MODE_MESH;
-+ #endif /* CONFIG_MESH */
-+- err = hostapd_set_freq_params(&csa_settings.freq_params,
-+- iface->conf->hw_mode,
-+- channel->freq,
-+- channel->chan,
-+- iface->conf->enable_edmg,
-+- iface->conf->edmg_channel,
-+- iface->conf->ieee80211n,
-+- iface->conf->ieee80211ac,
-+- iface->conf->ieee80211ax,
-+- secondary_channel,
-+- new_vht_oper_chwidth,
-+- oper_centr_freq_seg0_idx,
-+- oper_centr_freq_seg1_idx,
-+- cmode->vht_capab,
-+- &cmode->he_capab[ieee80211_mode]);
-+-
-+- if (err) {
-+- wpa_printf(MSG_ERROR, "DFS failed to calculate CSA freq params");
-+- hostapd_disable_iface(iface);
-+- return err;
-+- }
-+
-+- for (i = 0; i < iface->num_bss; i++) {
-+- err = hostapd_switch_channel(iface->bss[i], &csa_settings);
-+- if (err)
-+- break;
-+- }
-+-
-+- if (err) {
-+- wpa_printf(MSG_WARNING, "DFS failed to schedule CSA (%d) - trying fallback",
-+- err);
-+- iface->freq = channel->freq;
-+- iface->conf->channel = channel->chan;
-+- iface->conf->secondary_channel = secondary_channel;
-+- hostapd_set_oper_chwidth(iface->conf, new_vht_oper_chwidth);
-+- hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
-+- oper_centr_freq_seg0_idx);
-+- hostapd_set_oper_centr_freq_seg1_idx(iface->conf,
-+- oper_centr_freq_seg1_idx);
-+-
-+- hostapd_disable_iface(iface);
-+- hostapd_enable_iface(iface);
-+- return 0;
-+- }
-+-
-+- /* Channel configuration will be updated once CSA completes and
-+- * ch_switch_notify event is received */
-+-
-+- wpa_printf(MSG_DEBUG, "DFS waiting channel switch event");
-+- return 0;
-++ return hostapd_dfs_request_channel_switch(iface, channel->chan,
-++ channel->freq,
-++ secondary_channel,
-++ oper_centr_freq_seg0_idx,
-++ oper_centr_freq_seg1_idx);
-+ }
-+
-+
-+@@ -1208,15 +1424,19 @@ int hostapd_dfs_radar_detected(struct hostapd_iface *iface, int freq,
-+ if (!res)
-+ return 0;
-+
-+- /* Skip if reported radar event not overlapped our channels */
-+- res = dfs_are_channels_overlapped(iface, freq, chan_width, cf1, cf2);
-+- if (!res)
-+- return 0;
-++ if (!hostapd_dfs_is_offchan_event(iface, freq)) {
-++ /* Skip if reported radar event not overlapped our channels */
-++ res = dfs_are_channels_overlapped(iface, freq, chan_width,
-++ cf1, cf2);
-++ if (!res)
-++ return 0;
-++ }
-+
-+- /* radar detected while operating, switch the channel. */
-+- res = hostapd_dfs_start_channel_switch(iface);
-++ if (hostapd_dfs_offchan_start_channel_switch(iface, freq))
-++ /* radar detected while operating, switch the channel. */
-++ return hostapd_dfs_start_channel_switch(iface);
-+
-+- return res;
-++ return 0;
-+ }
-+
-+
-+@@ -1284,7 +1504,11 @@ int hostapd_dfs_start_cac(struct hostapd_iface *iface, int freq,
-+ "seg1=%d cac_time=%ds",
-+ freq, (freq - 5000) / 5, chan_offset, chan_width, cf1, cf2,
-+ iface->dfs_cac_ms / 1000);
-+- iface->cac_started = 1;
-++
-++ if (hostapd_dfs_is_offchan_event(iface, freq))
-++ iface->radar_offchan.cac_started = 1;
-++ else
-++ iface->cac_started = 1;
-+ os_get_reltime(&iface->dfs_cac_start);
-+ return 0;
-+ }
-+diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
-+index 27b985d..1c6c94e 100644
-+--- a/src/ap/hostapd.h
-++++ b/src/ap/hostapd.h
-+@@ -521,6 +521,21 @@ struct hostapd_iface {
-+ int *basic_rates;
-+ int freq;
-+
-++ /* Offchanel chain configuration */
-++ struct {
-++ int channel;
-++ int secondary_channel;
-++ int freq;
-++ int centr_freq_seg0_idx;
-++ int centr_freq_seg1_idx;
-++ /* Main chain is on temporary channel during
-++ * CAC detection on radar offchain
-++ */
-++ unsigned int temp_ch:1;
-++ /* CAC started on radar offchain */
-++ unsigned int cac_started:1;
-++ } radar_offchan;
-++
-+ u16 hw_flags;
-+
-+ /* Number of associated Non-ERP stations (i.e., stations using 802.11b
-+diff --git a/src/drivers/driver.h b/src/drivers/driver.h
-+index 6d9194f..7ed47c0 100644
-+--- a/src/drivers/driver.h
-++++ b/src/drivers/driver.h
-+@@ -777,6 +777,11 @@ struct hostapd_freq_params {
-+ * for IEEE 802.11ay EDMG configuration.
-+ */
-+ struct ieee80211_edmg_config edmg;
-++
-++ /**
-++ * radar_offchan - Whether radar/CAC offchannel is requested
-++ */
-++ int radar_offchan;
-+ };
-+
-+ /**
-+@@ -2026,6 +2031,8 @@ struct wpa_driver_capa {
-+ #define WPA_DRIVER_FLAGS2_OCV 0x0000000000000080ULL
-+ /** Driver expects user space implementation of SME in AP mode */
-+ #define WPA_DRIVER_FLAGS2_AP_SME 0x0000000000000100ULL
-++/** Driver supports offchannel radar/CAC detection */
-++#define WPA_DRIVER_RADAR_OFFCHAN 0x0000000000000200ULL
-+ u64 flags2;
-+
-+ #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
-+diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
-+index 4db8cce..62c3cd8 100644
-+--- a/src/drivers/driver_nl80211.c
-++++ b/src/drivers/driver_nl80211.c
-+@@ -4885,6 +4885,7 @@ static int nl80211_put_freq_params(struct nl_msg *msg,
-+ wpa_printf(MSG_DEBUG, " * he_enabled=%d", freq->he_enabled);
-+ wpa_printf(MSG_DEBUG, " * vht_enabled=%d", freq->vht_enabled);
-+ wpa_printf(MSG_DEBUG, " * ht_enabled=%d", freq->ht_enabled);
-++ wpa_printf(MSG_DEBUG, " * radar_offchan=%d", freq->radar_offchan);
-+
-+ hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
-+ is_24ghz = hw_mode == HOSTAPD_MODE_IEEE80211G ||
-+@@ -4962,6 +4963,9 @@ static int nl80211_put_freq_params(struct nl_msg *msg,
-+ NL80211_CHAN_NO_HT))
-+ return -ENOBUFS;
-+ }
-++ if (freq->radar_offchan)
-++ nla_put_flag(msg, NL80211_ATTR_RADAR_OFFCHAN);
-++
-+ return 0;
-+ }
-+
-+diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
-+index cd596e3..e370ef3 100644
-+--- a/src/drivers/driver_nl80211_capa.c
-++++ b/src/drivers/driver_nl80211_capa.c
-+@@ -665,6 +665,10 @@ static void wiphy_info_ext_feature_flags(struct wiphy_info_data *info,
-+ if (ext_feature_isset(ext_features, len,
-+ NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION))
-+ capa->flags2 |= WPA_DRIVER_FLAGS2_OCV;
-++
-++ if (ext_feature_isset(ext_features, len,
-++ NL80211_EXT_FEATURE_RADAR_OFFCHAN))
-++ capa->flags2 |= WPA_DRIVER_RADAR_OFFCHAN;
-+ }
-+
-+
-+diff --git a/src/drivers/nl80211_copy.h b/src/drivers/nl80211_copy.h
-+index f7be755..736b483 100644
-+--- a/src/drivers/nl80211_copy.h
-++++ b/src/drivers/nl80211_copy.h
-+@@ -2573,6 +2573,10 @@ enum nl80211_commands {
-+ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
-+ * transmit power to stay within regulatory limits. u32, dBi.
-+ *
-++ * @NL80211_ATTR_RADAR_OFFCHAN: Configure dedicated chain available for radar
-++ * detection on some hw. The chain can't be used to transmits or receives
-++ * frames. The driver is supposed to implement CAC management in sw or fw.
-++ *
-+ * @NUM_NL80211_ATTR: total number of nl80211_attrs available
-+ * @NL80211_ATTR_MAX: highest attribute number currently defined
-+ * @__NL80211_ATTR_AFTER_LAST: internal use
-+@@ -3078,6 +3082,8 @@ enum nl80211_attrs {
-+
-+ NL80211_ATTR_WIPHY_ANTENNA_GAIN,
-+
-++ NL80211_ATTR_RADAR_OFFCHAN,
-++
-+ /* add attributes here, update the policy in nl80211.c */
-+
-+ __NL80211_ATTR_AFTER_LAST,
-+@@ -5974,6 +5980,9 @@ enum nl80211_feature_flags {
-+ * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision
-+ * detection and change announcemnts.
-+ *
-++ * @NL80211_EXT_FEATURE_RADAR_OFFCHAN: Device supports offchannel radar/CAC
-++ * detection.
-++ *
-+ * @NUM_NL80211_EXT_FEATURES: number of extended features.
-+ * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
-+ */
-+@@ -6039,6 +6048,7 @@ enum nl80211_ext_feature_index {
-+ NL80211_EXT_FEATURE_SECURE_RTT,
-+ NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
-+ NL80211_EXT_FEATURE_BSS_COLOR,
-++ NL80211_EXT_FEATURE_RADAR_OFFCHAN,
-+
-+ /* add new features before the definition below */
-+ NUM_NL80211_EXT_FEATURES,
diff --git a/package/network/services/hostapd/patches/905-master-Support-configuring-BSS-Termination-TSF-by-using-hos.patch b/package/network/services/hostapd/patches/905-master-Support-configuring-BSS-Termination-TSF-by-using-hos.patch
new file mode 100644
index 0000000..2f9b174