The branch main has been updated by adrian:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=e035e8661c37b9f0669d31e146ec4afb73f4f435

commit e035e8661c37b9f0669d31e146ec4afb73f4f435
Author:     Adrian Chadd <adr...@freebsd.org>
AuthorDate: 2025-04-25 18:27:29 +0000
Commit:     Adrian Chadd <adr...@freebsd.org>
CommitDate: 2025-05-25 15:23:02 +0000

    net80211: move references to IF_LLADDR() into ieee80211_freebsd.c
    
    * Move references to IF_LLADDR() into ieee80211_freebsd.c
    * Add a comment on one that I need to verify before I move it
    * Implement ieee80211_vap_sync_mac_address() which syncs the VAP
      mac address from the network interface MAC address.
      This uses FreeBSD-isms (network epoch, IF_LLADDR()) so it shouldn't
      be in net80211 itself.
    
    Differential Revision:  https://reviews.freebsd.org/D50023
---
 sys/net80211/ieee80211.c         |  3 ++-
 sys/net80211/ieee80211_freebsd.c | 44 ++++++++++++++++++++++++++++++++++++++++
 sys/net80211/ieee80211_freebsd.h |  3 +++
 sys/net80211/ieee80211_ioctl.c   | 18 +---------------
 sys/net80211/ieee80211_sta.c     |  4 ++--
 5 files changed, 52 insertions(+), 20 deletions(-)

diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
index dbc7023c7fee..e64568abb024 100644
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -722,7 +722,8 @@ ieee80211_vap_attach(struct ieee80211vap *vap, 
ifm_change_cb_t media_change,
                ifp->if_baudrate = IF_Mbps(maxrate);
 
        ether_ifattach(ifp, macaddr);
-       IEEE80211_ADDR_COPY(vap->iv_myaddr, IF_LLADDR(ifp));
+       /* Do initial MAC address sync */
+       ieee80211_vap_copy_mac_address(vap);
        /* hook output method setup by ether_ifattach */
        vap->iv_output = ifp->if_output;
        ifp->if_output = ieee80211_output;
diff --git a/sys/net80211/ieee80211_freebsd.c b/sys/net80211/ieee80211_freebsd.c
index 6979e601ce41..5098529beb47 100644
--- a/sys/net80211/ieee80211_freebsd.c
+++ b/sys/net80211/ieee80211_freebsd.c
@@ -1192,6 +1192,50 @@ ieee80211_debugnet_poll(struct ifnet *ifp, int count)
 }
 #endif
 
+/**
+ * @brief Check if the MAC address was changed by the upper layer.
+ *
+ * This is specifically to handle cases like the MAC address
+ * being changed via an ioctl (eg SIOCSIFLLADDR).
+ *
+ * @param vap  VAP to sync MAC address for
+ */
+void
+ieee80211_vap_sync_mac_address(struct ieee80211vap *vap)
+{
+       struct epoch_tracker et;
+       const struct ifnet *ifp = vap->iv_ifp;
+
+       /*
+        * Check if the MAC address was changed
+        * via SIOCSIFLLADDR ioctl.
+        *
+        * NB: device may be detached during initialization;
+        * use if_ioctl for existence check.
+        */
+       NET_EPOCH_ENTER(et);
+       if (ifp->if_ioctl == ieee80211_ioctl &&
+           (ifp->if_flags & IFF_UP) == 0 &&
+           !IEEE80211_ADDR_EQ(vap->iv_myaddr, IF_LLADDR(ifp)))
+               IEEE80211_ADDR_COPY(vap->iv_myaddr, IF_LLADDR(ifp));
+       NET_EPOCH_EXIT(et);
+}
+
+/**
+ * @brief Initial MAC address setup for a VAP.
+ *
+ * @param vap  VAP to sync MAC address for
+ */
+void
+ieee80211_vap_copy_mac_address(struct ieee80211vap *vap)
+{
+       struct epoch_tracker et;
+
+       NET_EPOCH_ENTER(et);
+       IEEE80211_ADDR_COPY(vap->iv_myaddr, IF_LLADDR(vap->iv_ifp));
+       NET_EPOCH_EXIT(et);
+}
+
 /*
  * Module glue.
  *
diff --git a/sys/net80211/ieee80211_freebsd.h b/sys/net80211/ieee80211_freebsd.h
index ed913f7b3661..bdc78fe99d36 100644
--- a/sys/net80211/ieee80211_freebsd.h
+++ b/sys/net80211/ieee80211_freebsd.h
@@ -540,6 +540,9 @@ struct debugnet80211_methods {
 #define DEBUGNET80211_SET(ic, driver)
 #endif /* DEBUGNET */
 
+void ieee80211_vap_sync_mac_address(struct ieee80211vap *);
+void ieee80211_vap_copy_mac_address(struct ieee80211vap *);
+
 #endif /* _KERNEL */
 
 /* XXX this stuff belongs elsewhere */
diff --git a/sys/net80211/ieee80211_ioctl.c b/sys/net80211/ieee80211_ioctl.c
index 6c30325e5e32..d70004c0fb7a 100644
--- a/sys/net80211/ieee80211_ioctl.c
+++ b/sys/net80211/ieee80211_ioctl.c
@@ -3631,24 +3631,8 @@ ieee80211_ioctl(struct ifnet *ifp, u_long cmd, caddr_t 
data)
                IEEE80211_UNLOCK(ic);
                /* Wait for parent ioctl handler if it was queued */
                if (wait) {
-                       struct epoch_tracker et;
-
                        ieee80211_waitfor_parent(ic);
-
-                       /*
-                        * Check if the MAC address was changed
-                        * via SIOCSIFLLADDR ioctl.
-                        *
-                        * NB: device may be detached during initialization;
-                        * use if_ioctl for existence check.
-                        */
-                       NET_EPOCH_ENTER(et);
-                       if (ifp->if_ioctl == ieee80211_ioctl &&
-                           (ifp->if_flags & IFF_UP) == 0 &&
-                           !IEEE80211_ADDR_EQ(vap->iv_myaddr, IF_LLADDR(ifp)))
-                               IEEE80211_ADDR_COPY(vap->iv_myaddr,
-                                   IF_LLADDR(ifp));
-                       NET_EPOCH_EXIT(et);
+                       ieee80211_vap_sync_mac_address(vap);
                }
                break;
        case SIOCADDMULTI:
diff --git a/sys/net80211/ieee80211_sta.c b/sys/net80211/ieee80211_sta.c
index 887eb81dd3c4..0dd007fef508 100644
--- a/sys/net80211/ieee80211_sta.c
+++ b/sys/net80211/ieee80211_sta.c
@@ -634,10 +634,10 @@ sta_input(struct ieee80211_node *ni, struct mbuf *m,
                 * XXX process data frames whilst scanning.
                 */
                if ((! IEEE80211_IS_MULTICAST(wh->i_addr1))
-                   && (! IEEE80211_ADDR_EQ(wh->i_addr1, IF_LLADDR(ifp)))) {
+                   && (! IEEE80211_ADDR_EQ(wh->i_addr1, vap->iv_myaddr))) {
                        IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
                            bssid, NULL, "not to cur sta: lladdr=%6D, 
addr1=%6D",
-                           IF_LLADDR(ifp), ":", wh->i_addr1, ":");
+                           vap->iv_myaddr, ":", wh->i_addr1, ":");
                        vap->iv_stats.is_rx_wrongbss++;
                        goto out;
                }

Reply via email to