net80211: post RTM_IFINFO notification after toggling IFF_DRV_RUNNING

This is useful when a wireless driver is stopped or started in response
to events like an RF Kill button press.  Applications like
wpa_supplicant depend on such events to have a correct view of interface
state.

Reviewed by:	adrian, cy, melifaro
MFC after:	1 week
Differential Revision: https://reviews.freebsd.org/D24925
This commit is contained in:
Andriy Gapon 2020-05-22 11:25:45 +00:00
parent 8a719b0cee
commit 2c13efdf1c
3 changed files with 17 additions and 0 deletions

View File

@ -962,6 +962,19 @@ ieee80211_notify_radio(struct ieee80211com *ic, int state)
} }
} }
void
ieee80211_notify_ifnet_change(struct ieee80211vap *vap)
{
struct ifnet *ifp = vap->iv_ifp;
IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG, "%s\n",
"interface state change");
CURVNET_SET(ifp->if_vnet);
rt_ifmsg(ifp);
CURVNET_RESTORE();
}
void void
ieee80211_load_module(const char *modname) ieee80211_load_module(const char *modname)
{ {

View File

@ -1511,6 +1511,8 @@ ieee80211_start_locked(struct ieee80211vap *vap)
* back in here and complete the work. * back in here and complete the work.
*/ */
ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags |= IFF_DRV_RUNNING;
ieee80211_notify_ifnet_change(vap);
/* /*
* We are not running; if this we are the first vap * We are not running; if this we are the first vap
* to be brought up auto-up the parent if necessary. * to be brought up auto-up the parent if necessary.
@ -1624,6 +1626,7 @@ ieee80211_stop_locked(struct ieee80211vap *vap)
ieee80211_new_state_locked(vap, IEEE80211_S_INIT, -1); ieee80211_new_state_locked(vap, IEEE80211_S_INIT, -1);
if (ifp->if_drv_flags & IFF_DRV_RUNNING) { if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
ifp->if_drv_flags &= ~IFF_DRV_RUNNING; /* mark us stopped */ ifp->if_drv_flags &= ~IFF_DRV_RUNNING; /* mark us stopped */
ieee80211_notify_ifnet_change(vap);
if (--ic->ic_nrunning == 0) { if (--ic->ic_nrunning == 0) {
IEEE80211_DPRINTF(vap, IEEE80211_DPRINTF(vap,
IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG, IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG,

View File

@ -455,4 +455,5 @@ void ieee80211_notify_node_auth(struct ieee80211_node *);
void ieee80211_notify_country(struct ieee80211vap *, const uint8_t [], void ieee80211_notify_country(struct ieee80211vap *, const uint8_t [],
const uint8_t cc[2]); const uint8_t cc[2]);
void ieee80211_notify_radio(struct ieee80211com *, int); void ieee80211_notify_radio(struct ieee80211com *, int);
void ieee80211_notify_ifnet_change(struct ieee80211vap *);
#endif /* _NET80211_IEEE80211_PROTO_H_ */ #endif /* _NET80211_IEEE80211_PROTO_H_ */