Peter Memishian wrote:
> While tying up some loose ends in softmac, we stumbled on a case that
> seemed worthy of some discussion.  Specifically, usually MAC address
> changes will be done via DL_SET_PHYS_ADDR_REQ messages on the /dev/net
> (aka GLDv3) node.  Since those updates are done via the framework,
> softmac doesn't need to do anything special.
> 
> However, there is also a chance that an application will directly open the
> legacy /dev node and issue a DL_SET_PHYS_ADDR_REQ.  Assuming the legacy
> /dev node supports DL_NOTE_PHYS_ADDR (and most do), softmac will then
> receive a DLPI notification, and then needs to do a mac_unicst_update() to
> notify the GLDv3 framework of the new hardware address.  Our concern here
> is that there is no clean way for softmac to tell the two cases apart;
> both the GLDv3 framework and the underlying driver generate a DLPI
> notification and in both cases softmac will find that its MAC address has
> changed.  Further, in the common (GLDv3) case, if softmac just blindly
> calls mac_unicst_update(), it will lead to the framework generating
> *another* DL_NOTE_PHYS_ADDR -- even though the framework already had that
> address.  (This won't lead to an infinite loop since softmac tracks the
> MAC address -- but the extra notification still seems sloppy.)

So if I understand what you're describing correctly, you're worried about 
the DL_NOTE_PHYS_ADDR that will be generated by the underlying driver 
when softmac itself does a DL_PHYS_ADDR_REQ in softmac_m_unicst(), right?

> 
> One possible solution would be to tweak mac_unicst_update() to compare the
> "new" address and against the address stored in the framework, and return
> immediately if they match.  With that change, softmac could also be
> simplified to just always call mac_unicst_update() and not bother tracking
> the current MAC address, which would be nice.
> 
> Is this viable?  If so, it seems like it would make sense to do this for
> other "update" routines where the requested state matches the current
> state known to the framework.

Yes, I think that's a viable solution.

> 
> On a related note, it seems like some locking is missing from the update
> routines.  For instance, mac_unicst_update() currently does a bcopy() of
> the new address into mi_addr without holding any locks.  This issue
> becomes magnified if we add the proposed checks.  (Maybe Thiru has some
> thoughts on this?)

It looks like mi_addr should be protected by mi_data_lock (from looking 
at mac_unicst_{get,set}()).  mac_header() would also need to be changed 
to hold that lock.

-Seb

Reply via email to