Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2227729/?format=api
{ "id": 2227729, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2227729/?format=api", "web_url": "http://patchwork.ozlabs.org/project/hostap/patch/20260424091257.5d22c0376ef7.I68b7cff43ed6117c948ac7d7e75a5d68e60c7e27@changeid/", "project": { "id": 22, "url": "http://patchwork.ozlabs.org/api/1.1/projects/22/?format=api", "name": "HostAP Development", "link_name": "hostap", "list_id": "hostap.lists.infradead.org", "list_email": "hostap@lists.infradead.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20260424091257.5d22c0376ef7.I68b7cff43ed6117c948ac7d7e75a5d68e60c7e27@changeid>", "date": "2026-04-24T07:11:59", "name": "[v3,7/8] ap: allow configuring UHR DBE", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "6083e77e80e297f636ed18bb4caa65caba7e1a80", "submitter": { "id": 265, "url": "http://patchwork.ozlabs.org/api/1.1/people/265/?format=api", "name": "Johannes Berg", "email": "johannes@sipsolutions.net" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/hostap/patch/20260424091257.5d22c0376ef7.I68b7cff43ed6117c948ac7d7e75a5d68e60c7e27@changeid/mbox/", "series": [ { "id": 501311, "url": "http://patchwork.ozlabs.org/api/1.1/series/501311/?format=api", "web_url": "http://patchwork.ozlabs.org/project/hostap/list/?series=501311", "date": "2026-04-24T07:11:54", "name": null, "version": 3, "mbox": "http://patchwork.ozlabs.org/series/501311/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2227729/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2227729/checks/", "tags": {}, "headers": { "Return-Path": "\n <hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=fj0vWAUB;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n secure) header.d=sipsolutions.net header.i=@sipsolutions.net\n header.a=rsa-sha256 header.s=mail header.b=e9uOSM6F;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g242C1Vzrz1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 17:13:55 +1000 (AEST)", "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wGAj0-0000000CmRx-0WNS;\n\tFri, 24 Apr 2026 07:13:18 +0000", "from s3.sipsolutions.net ([2a01:4f8:242:246e::2]\n helo=sipsolutions.net)\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wGAiq-0000000CmNJ-0pVN\n\tfor hostap@lists.infradead.org;\n\tFri, 24 Apr 2026 07:13:14 +0000", "by sipsolutions.net with esmtpsa\n (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256)\n\t(Exim 4.98.2)\n\t(envelope-from <johannes@sipsolutions.net>)\n\tid 1wGAim-00000008vqe-3dCS;\n\tFri, 24 Apr 2026 09:13:05 +0200" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=XphFCLZyWkM3Paq0RuiDvf/bsIJzcZuzexb/RuLLgGs=; b=fj0vWAUBbHsyBS\n\tdsmgurStZN4tQ1UjS/EOH9VM1rgzANKC26HpsA+sxv6OSc5to8YcyGMN5qc21YmIHmCxWqrlPiQZF\n\tPHcPJR0bPiphYrJBgSDj0emnZh9J1Kl1HajI9Htx58wdIXsiXmeXvCTrMKjbCi5EDrzSumKW41BlN\n\tnQKWSPyBzLAA7BxLy/Ht+F5tFtyRQDrb86O/E9kxIJhtK15huAskt1yqhMmQy5eX5pQGUzA7MJBXN\n\tcHdZlGLU6L2i24/IesJnK4LNX6CPWCNlwrmCU8UzXQmBeFREq1tQAk71ZOX5XANcKEcWQ/4EzawCK\n\toK1Cj5+5dfzYJI3ixiNA==;", "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=sipsolutions.net; s=mail; h=Content-Transfer-Encoding:MIME-Version:\n\tReferences:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Content-Type:Sender\n\t:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-To:\n\tResent-Cc:Resent-Message-ID; bh=U/Tnjkem4PxR5C6Rx2idFruLyrGQi3i/R+CzUGHbsls=;\n\tt=1777014788; x=1778224388; b=e9uOSM6FtNDL3kROrqrn78bp8wOWTPvjy+LxwraazGopAS8\n\tZDimnlEiuMey1l7D0bBIxL9CaRXcnPGpo1Ir3E5PMOwhKCRh2etBuV/KO2N0z4g5qawRFpapRYl3Y\n\toz24E6qYOEa0ILUmtl8/soLMyo5oGF6DHN4pyOCLDrHCbU+tOcwtzdmZe8QEdbsm0GJ2T0hico22T\n\t4aSJxFbe3GOuHJDDG5YP0/8Y9jBVLyBEJL5+7mniR0/TppEmFgeyywKPr5b3Pr227lMSPVZMZ4tYw\n\tMQvkf+XPv0GNg7S8Z3l3e9ohXaElixh6eSTSPbfbMU5OS0jZn/UHUQrCS7nAcVMQ==;" ], "From": "Johannes Berg <johannes@sipsolutions.net>", "To": "hostap@lists.infradead.org", "Cc": "Johannes Berg <johannes.berg@intel.com>", "Subject": "[PATCH v3 7/8] ap: allow configuring UHR DBE", "Date": "Fri, 24 Apr 2026 09:11:59 +0200", "Message-ID": "\n <20260424091257.5d22c0376ef7.I68b7cff43ed6117c948ac7d7e75a5d68e60c7e27@changeid>", "X-Mailer": "git-send-email 2.53.0", "In-Reply-To": "<20260424071256.71834-10-johannes@sipsolutions.net>", "References": "<20260424071256.71834-10-johannes@sipsolutions.net>", "MIME-Version": "1.0", "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ", "X-CRM114-CacheID": "sfid-20260424_001308_418856_35F7FC68 ", "X-CRM114-Status": "GOOD ( 22.61 )", "X-Spam-Score": "-2.1 (--)", "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam. The original\n message has been attached to this so you can view it or label\n similar future email. If you have any questions, see\n the administrator of that system for details.\n Content preview: From: Johannes Berg <johannes.berg@intel.com> Allow\n configuring,\n and push down to the driver's frequency configuration,\n UHR DBE (dynamic bandwidth\n extension). Make up the UHR DBE capabilities on the fly assuming that the\n EHT capabilities cover the MCS set etc. already. The position of the DBE\n capabilities is after PHY, as per 802.11bn D1.4.\n Content analysis details: (-2.1 points, 5.0 required)\n pts rule name description\n ---- ----------------------\n --------------------------------------------------\n -0.0 SPF_PASS SPF: sender matches SPF record\n -0.0 SPF_HELO_PASS SPF: HELO matches SPF record\n -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from\n author's\n domain\n -0.1 DKIM_VALID Message has at least one valid DKIM or DK\n signature\n -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from\n envelope-from domain\n 0.1 DKIM_SIGNED Message has a DKIM or DK signature,\n not necessarily valid\n -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1%\n [score: 0.0000]", "X-BeenThere": "hostap@lists.infradead.org", "X-Mailman-Version": "2.1.34", "Precedence": "list", "List-Id": "<hostap.lists.infradead.org>", "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=unsubscribe>", "List-Archive": "<http://lists.infradead.org/pipermail/hostap/>", "List-Post": "<mailto:hostap@lists.infradead.org>", "List-Help": "<mailto:hostap-request@lists.infradead.org?subject=help>", "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=subscribe>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Sender": "\"Hostap\" <hostap-bounces@lists.infradead.org>", "Errors-To": "hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org" }, "content": "From: Johannes Berg <johannes.berg@intel.com>\n\nAllow configuring, and push down to the driver's frequency\nconfiguration, UHR DBE (dynamic bandwidth extension).\n\nMake up the UHR DBE capabilities on the fly assuming that\nthe EHT capabilities cover the MCS set etc. already. The\nposition of the DBE capabilities is after PHY, as per\n802.11bn D1.4.\n\nSigned-off-by: Johannes Berg <johannes.berg@intel.com>\n---\n hostapd/config_file.c | 5 ++\n hostapd/hostapd.conf | 11 ++++\n src/ap/ap_config.c | 5 ++\n src/ap/ap_config.h | 2 +\n src/ap/beacon.c | 4 ++\n src/ap/ieee802_11_uhr.c | 30 +++++++++--\n src/common/hw_features_common.c | 93 ++++++++++++++++++++++++++++++++-\n src/common/hw_features_common.h | 7 +++\n src/common/ieee802_11_defs.h | 10 +++-\n 9 files changed, 162 insertions(+), 5 deletions(-)", "diff": "diff --git a/hostapd/config_file.c b/hostapd/config_file.c\nindex 3cb200ea358b..da943e3191ee 100644\n--- a/hostapd/config_file.c\n+++ b/hostapd/config_file.c\n@@ -4997,6 +4997,11 @@ static int hostapd_config_fill(struct hostapd_config *conf,\n \t\tconf->ieee80211bn = atoi(pos);\n \t} else if (os_strcmp(buf, \"require_uhr\") == 0) {\n \t\tconf->require_uhr = atoi(pos);\n+\t} else if (os_strcmp(buf, \"dbe_bandwidth\") == 0) {\n+\t\tconf->dbe_bandwidth = atoi(pos);\n+\t} else if (os_strcmp(buf, \"dbe_punct_bitmap\") == 0) {\n+\t\tif (get_u16(pos, line, &conf->dbe_punct_bitmap))\n+\t\t\treturn 1;\n #endif /* CONFIG_IEEE80211BN */\n \t} else if (os_strcmp(buf, \"i2r_lmr_policy\") == 0) {\n \t\tconf->i2r_lmr_policy = atoi(pos);\ndiff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf\nindex 9eca437ec565..d9c6268dfdb9 100644\n--- a/hostapd/hostapd.conf\n+++ b/hostapd/hostapd.conf\n@@ -1145,6 +1145,17 @@ wmm_ac_vo_acm=0\n # Require stations to support UHR PHY (reject association if they do not)\n #require_uhr=0\n \n+# UHR DBE (dynamic bandwidth extension) bandwidth\n+# Indicates the bandwidth (as encoded in the spec, 802.11bn D1.4 Table 9-bb2\n+# \"Encoding of the DBE Bandwidth field\") for UHR DBE, 0 is reserved in the\n+# spec and here means DBE is not used.\n+# Must be wider than the EHT bandwidth (from eht_oper_chwidth or operating\n+# class).\n+#dbe_bandwidth=0\n+\n+# UHR DBE puncturing bitmap\n+#dbe_punct_bitmap=0\n+\n ##### IEEE 802.1X-2004 related configuration ##################################\n \n # Require IEEE 802.1X authorization\ndiff --git a/src/ap/ap_config.c b/src/ap/ap_config.c\nindex 36a4dad65626..6dbf30bbb7b2 100644\n--- a/src/ap/ap_config.c\n+++ b/src/ap/ap_config.c\n@@ -316,6 +316,11 @@ struct hostapd_config * hostapd_config_defaults(void)\n \n \tconf->disable_mcs15_rx = true;\n \n+#ifdef CONFIG_IEEE80211BN\n+\tconf->dbe_bandwidth = 0;\n+\tconf->dbe_punct_bitmap = 0;\n+#endif\n+\n \treturn conf;\n }\n \ndiff --git a/src/ap/ap_config.h b/src/ap/ap_config.h\nindex 57ee0917bbef..7709f3ae82cb 100644\n--- a/src/ap/ap_config.h\n+++ b/src/ap/ap_config.h\n@@ -1249,6 +1249,8 @@ struct hostapd_config {\n \tint ieee80211bn;\n #ifdef CONFIG_IEEE80211BN\n \tbool require_uhr;\n+\tu8 dbe_bandwidth;\n+\tu16 dbe_punct_bitmap;\n #endif\n \n \t/* EHT enable/disable config from CHAN_SWITCH */\ndiff --git a/src/ap/beacon.c b/src/ap/beacon.c\nindex cedb4bd9d537..9ee7de6c118f 100644\n--- a/src/ap/beacon.c\n+++ b/src/ap/beacon.c\n@@ -2859,6 +2859,10 @@ static int __ieee802_11_set_beacon(struct hostapd_data *hapd)\n \t\t.he.cap = cmode ? &cmode->he_capab[IEEE80211_MODE_AP] : NULL,\n \t\t.eht.cap = cmode ? &cmode->eht_capab[IEEE80211_MODE_AP] : NULL,\n \t\t.eht.punct_bitmap = hostapd_get_punct_bitmap(hapd),\n+\t\t.uhr.enabled = iconf->ieee80211bn,\n+\t\t.uhr.dbe_bandwidth = iconf->dbe_bandwidth,\n+\t\t.uhr.cap = cmode ? &cmode->uhr_capab[IEEE80211_MODE_AP] : NULL,\n+\t\t.uhr.dbe_punct_bitmap = iconf->dbe_punct_bitmap,\n \t};\n \n \tif (cmode && hostapd_set_freq_params(&freq, &info) == 0) {\ndiff --git a/src/ap/ieee802_11_uhr.c b/src/ap/ieee802_11_uhr.c\nindex 2476b3412b75..9e3dcdc6da25 100644\n--- a/src/ap/ieee802_11_uhr.c\n+++ b/src/ap/ieee802_11_uhr.c\n@@ -109,25 +109,49 @@ u8 * hostapd_eid_uhr_capab(struct hostapd_data *hapd, u8 *eid,\n u8 * hostapd_eid_uhr_operation(struct hostapd_data *hapd, u8 *eid, bool beacon)\n {\n \tstruct ieee80211_uhr_operation *oper;\n-\tu8 *pos = eid;\n+\tu8 *pos = eid, *len, *start = eid;\n \n \tif (!hapd->iface->current_mode)\n \t\treturn eid;\n \n \t*pos++ = WLAN_EID_EXTENSION;\n-\t*pos++ = 1 + sizeof(*oper);\n+\tlen = pos++;\n \t*pos++ = WLAN_EID_EXT_UHR_OPERATION;\n \n \toper = (void *) pos;\n \toper->oper_params = 0;\n \n+\tif (hapd->iconf->dbe_bandwidth) {\n+\t\tu8 dbe_bw = hapd->iconf->dbe_bandwidth <<\n+\t\t\t\tUHR_OPER_PARAMS_DBE_BW_SHIFT;\n+\n+\t\toper->oper_params |= host_to_le16(UHR_OPER_PARAMS_DBE_ENA);\n+\t\toper->oper_params |= host_to_le16(dbe_bw);\n+\t}\n+\n \t/* TODO: Fill in appropriate UHR-MCS max Nss information */\n \toper->basic_uhr_mcs_nss_set[0] = 0x11;\n \toper->basic_uhr_mcs_nss_set[1] = 0x00;\n \toper->basic_uhr_mcs_nss_set[2] = 0x00;\n \toper->basic_uhr_mcs_nss_set[3] = 0x00;\n \n-\treturn pos + sizeof(*oper);\n+\tpos += sizeof(*oper);\n+\n+\tif (!beacon && hapd->iconf->dbe_bandwidth) {\n+\t\t*pos = hapd->iconf->dbe_bandwidth;\n+\n+\t\tif (hapd->iconf->dbe_punct_bitmap)\n+\t\t\t*pos |= IEEE80211_UHR_OPER_DBE_DIS_SUBCH_BMAP_PRES;\n+\n+\t\tpos++;\n+\t\tif (hapd->iconf->dbe_punct_bitmap) {\n+\t\t\tWPA_PUT_LE16(pos, hapd->iconf->dbe_punct_bitmap);\n+\t\t\tpos += sizeof(u16);\n+\t\t}\n+\t}\n+\n+\t*len = pos - start - 2;\n+\treturn pos;\n }\n \n \ndiff --git a/src/common/hw_features_common.c b/src/common/hw_features_common.c\nindex ea5d24300048..1a3b8dcd7757 100644\n--- a/src/common/hw_features_common.c\n+++ b/src/common/hw_features_common.c\n@@ -475,6 +475,79 @@ void punct_update_legacy_bw(u16 bitmap, u8 pri, enum oper_chan_width *width,\n }\n \n \n+static int hostapd_set_freq_dbe(struct hostapd_freq_params *data, u8 dbe_bw)\n+{\n+\tint starting_freq, offset, index, bw_mhz, start_new, start_old;\n+\tbool is_5ghz = is_5ghz_freq(data->freq);\n+\tbool is_6ghz = is_6ghz_freq(data->freq);\n+\tunsigned int punct_shift;\n+\n+\tif (is_6ghz)\n+\t\tstarting_freq = 5955;\n+\telse if (data->freq < 5745)\n+\t\tstarting_freq = 5180;\n+\telse\n+\t\tstarting_freq = 5745;\n+\n+\tswitch (dbe_bw) {\n+\tcase IEEE80211_UHR_OPER_DBE_BW_40_MHZ:\n+\tcase IEEE80211_UHR_OPER_DBE_BW_80_MHZ:\n+\tcase IEEE80211_UHR_OPER_DBE_BW_160_MHZ:\n+\t\tif (is_5ghz)\n+\t\t\tbreak;\n+\t\t/* fallthrough */\n+\tcase IEEE80211_UHR_OPER_DBE_BW_320_2_MHZ:\n+\tcase IEEE80211_UHR_OPER_DBE_BW_320_1_MHZ:\n+\t\tif (is_6ghz)\n+\t\t\tbreak;\n+\t\t/* fallthrough */\n+\tdefault:\n+\t\treturn -1;\n+\t}\n+\n+\tswitch (dbe_bw) {\n+\tcase IEEE80211_UHR_OPER_DBE_BW_40_MHZ:\n+\t\tbw_mhz = 40;\n+\t\tbreak;\n+\tcase IEEE80211_UHR_OPER_DBE_BW_80_MHZ:\n+\t\tbw_mhz = 80;\n+\t\tbreak;\n+\tcase IEEE80211_UHR_OPER_DBE_BW_160_MHZ:\n+\t\tbw_mhz = 160;\n+\t\tbreak;\n+\tcase IEEE80211_UHR_OPER_DBE_BW_320_2_MHZ:\n+\t\tstarting_freq += 160;\n+\t\t/* fallthrough */\n+\tcase IEEE80211_UHR_OPER_DBE_BW_320_1_MHZ:\n+\t\tbw_mhz = 320;\n+\t\tbreak;\n+\tdefault:\n+\t\t/* already handled above - shut up stupid compilers */\n+\t\treturn -1;\n+\t}\n+\n+\tif (data->freq < starting_freq)\n+\t\treturn -1;\n+\n+\tstart_old = data->center_freq1 - data->bandwidth / 2;\n+\n+\toffset = data->freq - starting_freq;\n+\tindex = offset / bw_mhz;\n+\tstart_new = starting_freq - 10 + index * bw_mhz;\n+\tdata->center_freq1 = start_new + bw_mhz / 2;\n+\tdata->bandwidth = bw_mhz;\n+\n+\tif (start_new < start_old)\n+\t\tpunct_shift = (start_old - start_new) / 20;\n+\telse\n+\t\tpunct_shift = 0;\n+\n+\tdata->punct_bitmap <<= punct_shift;\n+\n+\treturn 0;\n+}\n+\n+\n int hostapd_set_freq_params(struct hostapd_freq_params *data,\n \t\t\t const struct hostapd_channel_info *info)\n {\n@@ -495,6 +568,7 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,\n \tconst struct he_capabilities *he_cap = info->he.cap;\n \tconst struct eht_capabilities *eht_cap = info->eht.cap;\n \tu16 punct_bitmap = info->eht.punct_bitmap;\n+\tint uhr_enabled = info->uhr.enabled;\n \tenum oper_chan_width oper_chwidth_legacy;\n \tu8 seg0_legacy, seg1_legacy;\n \n@@ -502,6 +576,9 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,\n \t\the_enabled = 0;\n \tif (!eht_cap || !eht_cap->eht_supported)\n \t\teht_enabled = 0;\n+\tif (!info->uhr.cap || !info->uhr.cap->uhr_supported)\n+\t\tuhr_enabled = 0;\n+\n \tos_memset(data, 0, sizeof(*data));\n \tdata->mode = mode;\n \tdata->freq = freq;\n@@ -597,7 +674,7 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,\n \t\tdata->ht_enabled = 0;\n \t\tdata->vht_enabled = 0;\n \n-\t\treturn 0;\n+\t\tgoto handle_uhr;\n \t}\n \n \tif (data->eht_enabled) switch (oper_chwidth) {\n@@ -840,6 +917,20 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,\n \t\tbreak;\n \t}\n \n+handle_uhr:\n+\tif (uhr_enabled && info->uhr.dbe_bandwidth) {\n+\t\t/* check DBE against UHR capabilities? */\n+\n+\t\tif (hostapd_set_freq_dbe(data, info->uhr.dbe_bandwidth)) {\n+\t\t\twpa_printf(MSG_ERROR,\n+\t\t\t\t \"invalid DBE bandwidth %d\\n\",\n+\t\t\t\t info->uhr.dbe_bandwidth);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tdata->punct_bitmap = info->uhr.dbe_punct_bitmap;\n+\t}\n+\n \treturn 0;\n }\n \ndiff --git a/src/common/hw_features_common.h b/src/common/hw_features_common.h\nindex 224cb4d52fb3..48b0bc3c1d5c 100644\n--- a/src/common/hw_features_common.h\n+++ b/src/common/hw_features_common.h\n@@ -77,6 +77,13 @@ struct hostapd_channel_info {\n \t\tconst struct eht_capabilities *cap;\n \t\tu16 punct_bitmap;\n \t} eht;\n+\n+\tstruct {\n+\t\tint enabled;\n+\t\tconst struct uhr_capabilities *cap;\n+\t\tu8 dbe_bandwidth;\n+\t\tu16 dbe_punct_bitmap;\n+\t} uhr;\n };\n \n int hostapd_set_freq_params(struct hostapd_freq_params *data,\ndiff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h\nindex 8b32e95e227d..a1121f991b45 100644\n--- a/src/common/ieee802_11_defs.h\n+++ b/src/common/ieee802_11_defs.h\n@@ -3318,14 +3318,22 @@ struct ieee80211_uhr_capabilities {\n #define UHR_OPER_PARAMS_NPCA_ENA 0x0002\n #define UHR_OPER_PARAMS_PEDCA_ENA 0x0004\n #define UHR_OPER_PARAMS_DBE_ENA 0x0008\n+#define UHR_OPER_PARAMS_DBE_BW_SHIFT\t\t4\n \n /* UHR Operation element format */\n struct ieee80211_uhr_operation {\n \tle16 oper_params; /* UHR Operation Parameters: UHR_OPER_* bits */\n \tu8 basic_uhr_mcs_nss_set[4];\n-\t/* FIXME: DPS, P-EDCA, DBE */\n+\t/* FIXME: DPS, P-EDCA */\n } STRUCT_PACKED;\n \n+#define IEEE80211_UHR_OPER_DBE_BW_40_MHZ\t\t1\n+#define IEEE80211_UHR_OPER_DBE_BW_80_MHZ\t\t2\n+#define IEEE80211_UHR_OPER_DBE_BW_160_MHZ\t\t3\n+#define IEEE80211_UHR_OPER_DBE_BW_320_1_MHZ\t\t4\n+#define IEEE80211_UHR_OPER_DBE_BW_320_2_MHZ\t\t5\n+#define IEEE80211_UHR_OPER_DBE_DIS_SUBCH_BMAP_PRES\t0x8\n+\n /* Max size in Draft P802.11bn D1.3 with DPS, NPCA, P-EDCA, DBE */\n #define IEEE80211_UHR_OPER_MAX_SIZE\t\\\n \t(sizeof(struct ieee80211_uhr_operation) + 4 + 6 + 3 + 3)\n", "prefixes": [ "v3", "7/8" ] }