It seems to me that the recent iwm(4)/if_setlladdr() fix applies to
more (if not all) wireless drivers since the stack keeps its own
copy of the lladdr. Does the diff below make sense?
I'd also suggest to stop abusing "ac_enaddr" or "ic_myaddr" and use
if_sadl instead. Having 3 copies of the same address is error prone.
Plus I'd appreciate if we could keep per-driver ioctl routines as small
as possible ;)
Index: dev/pci/if_iwm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
retrieving revision 1.51
diff -u -p -r1.51 if_iwm.c
--- dev/pci/if_iwm.c 27 Sep 2015 16:53:38 -0000 1.51
+++ dev/pci/if_iwm.c 28 Sep 2015 10:33:19 -0000
@@ -5759,11 +5759,6 @@ iwm_ioctl(struct ifnet *ifp, u_long cmd,
error = 0;
break;
- case SIOCSIFLLADDR:
- IEEE80211_ADDR_COPY(sc->sc_ic.ic_myaddr,
- ((struct arpcom *)ifp)->ac_enaddr);
- break;
-
default:
error = ieee80211_ioctl(ifp, cmd, data);
}
Index: net80211/ieee80211_ioctl.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.c,v
retrieving revision 1.39
diff -u -p -r1.39 ieee80211_ioctl.c
--- net80211/ieee80211_ioctl.c 14 Mar 2015 03:38:51 -0000 1.39
+++ net80211/ieee80211_ioctl.c 28 Sep 2015 10:43:36 -0000
@@ -42,6 +42,7 @@
#include <sys/tree.h>
#include <net/if.h>
+#include <net/if_dl.h>
#include <net/if_media.h>
#include <netinet/in.h>
@@ -357,6 +358,9 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
case SIOCSIFMEDIA:
case SIOCGIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
+ break;
+ case SIOCSIFLLADDR:
+ IEEE80211_ADDR_COPY(ic->ic_myaddr, LLADDR(ifp->if_sadl));
break;
case SIOCS80211NWID:
if ((error = suser(curproc, 0)) != 0)