[PATCH 1/6] nl80211: Add support for NL80211_ATTR_FRAME_CMD_NO_STA attribute

Ramasamy Kaliappan ramasamy.kaliappan at oss.qualcomm.com
Thu Aug 6 09:31:42 PDT 2026


Add support for the new NL80211_ATTR_FRAME_CMD_NO_STA attribute in
nl80211 driver handling. This attribute indicates that the kernel
did not have a station entry for a received management frame or that
frame transmission should avoid using an existing station entry.

Expose this information to upper layers using the new
rx_mgmt.no_sta flag, allowing hostapd to determine whether
MLD address translation was applied or whether it should
be disabled when transmitting a frame.

Signed-off-by: Ramasamy Kaliappan <ramasamy.kaliappan at oss.qualcomm.com>
---
 src/ap/drv_callbacks.c             |  1 +
 src/ap/hostapd.h                   |  1 +
 src/drivers/driver.h               |  5 +++++
 src/drivers/driver_nl80211_event.c | 27 ++++++++++++++++++---------
 4 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
index 116a055033a0..2c59a662d908 100644
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -2025,6 +2025,7 @@ static int hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt)
 	fi.freq = rx_mgmt->freq;
 	fi.datarate = rx_mgmt->datarate;
 	fi.ssi_signal = rx_mgmt->ssi_signal;
+	fi.no_sta = rx_mgmt->no_sta;
 
 	if (hapd == HAPD_BROADCAST) {
 		size_t i;
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index 974964d341e9..a0f569e8417e 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -132,6 +132,7 @@ struct hostapd_frame_info {
 	u32 channel;
 	u32 datarate;
 	int ssi_signal; /* dBm */
+	bool no_sta;
 };
 
 enum wps_status {
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index e790120467be..7284d863d2e4 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -7272,6 +7272,11 @@ union wpa_event_data {
 		 * non MLD.
 		 */
 		int link_id;
+		/**
+		 * no_sta - set when the kernel has no corresponding station entry
+		 * for the received frame.
+		 */
+		bool no_sta;
 	} rx_mgmt;
 
 	/**
diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index 0b111bf66bda..9204756f9251 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -1428,7 +1428,8 @@ static void mlme_timeout_event(struct wpa_driver_nl80211_data *drv,
 static void mlme_event_mgmt(struct i802_bss *bss,
 			    struct nlattr *freq, struct nlattr *sig,
 			    const u8 *frame, size_t len,
-			    int link_id)
+			    int link_id,
+			    bool no_sta)
 {
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	const struct ieee80211_mgmt *mgmt;
@@ -1457,17 +1458,19 @@ static void mlme_event_mgmt(struct i802_bss *bss,
 	}
 	wpa_printf(MSG_DEBUG,
 		   "nl80211: RX frame da=" MACSTR " sa=" MACSTR " bssid=" MACSTR
-		   " freq=%d ssi_signal=%d fc=0x%x seq_ctrl=0x%x stype=%u (%s) len=%u",
+		   " freq=%d ssi_signal=%d fc=0x%x seq_ctrl=0x%x stype=%u (%s) len=%u"
+		   " no_sta=%d",
 		   MAC2STR(mgmt->da), MAC2STR(mgmt->sa), MAC2STR(mgmt->bssid),
 		   rx_freq, ssi_signal, fc,
 		   le_to_host16(mgmt->seq_ctrl), stype, fc2str(fc),
-		   (unsigned int) len);
+		   (unsigned int) len, no_sta);
 	event.rx_mgmt.frame = frame;
 	event.rx_mgmt.frame_len = len;
 	event.rx_mgmt.ssi_signal = ssi_signal;
 	event.rx_mgmt.drv_priv = bss;
 	event.rx_mgmt.ctx = bss->ctx;
 	event.rx_mgmt.link_id = link_id;
+	event.rx_mgmt.no_sta = no_sta;
 
 	wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
 }
@@ -1847,7 +1850,8 @@ static void mlme_event(struct i802_bss *bss,
 		       struct nlattr *freq, struct nlattr *ack,
 		       struct nlattr *cookie, struct nlattr *sig,
 		       struct nlattr *wmm, struct nlattr *req_ie,
-		       struct nlattr *link)
+		       struct nlattr *link,
+		       struct nlattr *drv_no_sta)
 {
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	u16 stype = 0, auth_type = 0;
@@ -1856,6 +1860,7 @@ static void mlme_event(struct i802_bss *bss,
 	int link_id = -1;
 	struct i802_link *mld_link = NULL;
 	const struct ieee80211_mgmt *mgmt = NULL;
+	bool no_sta;
 
 	if (timed_out && addr) {
 		mlme_timeout_event(drv, cmd, addr);
@@ -1879,6 +1884,8 @@ static void mlme_event(struct i802_bss *bss,
 	if (nl80211_link_valid(bss->valid_links, link_id))
 		mld_link = nl80211_get_link(bss, link_id);
 
+	no_sta = nla_get_flag(drv_no_sta);
+
 	data = nla_data(frame);
 	len = nla_len(frame);
 	if (len < 4 + 2 * ETH_ALEN) {
@@ -1889,10 +1896,10 @@ static void mlme_event(struct i802_bss *bss,
 		return;
 	}
 	wpa_printf(MSG_MSGDUMP, "nl80211: MLME event %d (%s) on %s(" MACSTR
-		   ") A1=" MACSTR " A2=" MACSTR " on link_id=%d", cmd,
+		   ") A1=" MACSTR " A2=" MACSTR " on link_id=%d no_sta=%d", cmd,
 		   nl80211_command_to_string(cmd), bss->ifname,
 		   MAC2STR(bss->addr), MAC2STR(data + 4),
-		   MAC2STR(data + 4 + ETH_ALEN), link_id);
+		   MAC2STR(data + 4 + ETH_ALEN), link_id, no_sta);
 
 	/* PASN Authentication frame can be received with a different source MAC
 	 * address. Allow NL80211_CMD_FRAME event with foreign addresses also.
@@ -1962,7 +1969,7 @@ static void mlme_event(struct i802_bss *bss,
 		break;
 	case NL80211_CMD_FRAME:
 		mlme_event_mgmt(bss, freq, sig, nla_data(frame),
-				nla_len(frame), link_id);
+				nla_len(frame), link_id, no_sta);
 		break;
 	case NL80211_CMD_FRAME_TX_STATUS:
 		mlme_event_mgmt_tx_status(bss, cookie, nla_data(frame),
@@ -4940,7 +4947,8 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd,
 			   tb[NL80211_ATTR_RX_SIGNAL_DBM],
 			   tb[NL80211_ATTR_STA_WME],
 			   tb[NL80211_ATTR_REQ_IE],
-			   tb[NL80211_ATTR_MLO_LINK_ID]);
+			   tb[NL80211_ATTR_MLO_LINK_ID],
+			   tb[NL80211_ATTR_FRAME_CMD_NO_STA]);
 		break;
 	case NL80211_CMD_CONNECT:
 	case NL80211_CMD_ROAM:
@@ -5332,7 +5340,8 @@ int process_bss_event(struct nl_msg *msg, void *arg)
 			   tb[NL80211_ATTR_COOKIE],
 			   tb[NL80211_ATTR_RX_SIGNAL_DBM],
 			   tb[NL80211_ATTR_STA_WME], NULL,
-			   tb[NL80211_ATTR_MLO_LINK_ID]);
+			   tb[NL80211_ATTR_MLO_LINK_ID],
+			   tb[NL80211_ATTR_FRAME_CMD_NO_STA]);
 		break;
 	case NL80211_CMD_UNEXPECTED_FRAME:
 		nl80211_spurious_frame(bss, tb, 0);
-- 
2.34.1




More information about the Hostap mailing list