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:
parent
8a719b0cee
commit
2c13efdf1c
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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,
|
||||||
|
@ -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_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user