@@ -110,6 +110,12 @@ static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
110110 pub );
111111 bss -> refcount ++ ;
112112 }
113+ if (bss -> transmitted_bss ) {
114+ bss = container_of (bss -> transmitted_bss ,
115+ struct cfg80211_internal_bss ,
116+ pub );
117+ bss -> refcount ++ ;
118+ }
113119}
114120
115121static inline void bss_ref_put (struct cfg80211_registered_device * rdev ,
@@ -126,6 +132,18 @@ static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
126132 if (hbss -> refcount == 0 )
127133 bss_free (hbss );
128134 }
135+
136+ if (bss -> transmitted_bss ) {
137+ struct cfg80211_internal_bss * tbss ;
138+
139+ tbss = container_of (bss -> transmitted_bss ,
140+ struct cfg80211_internal_bss ,
141+ pub );
142+ tbss -> refcount -- ;
143+ if (tbss -> refcount == 0 )
144+ bss_free (tbss );
145+ }
146+
129147 bss -> refcount -- ;
130148 if (bss -> refcount == 0 )
131149 bss_free (bss );
@@ -1024,6 +1042,7 @@ static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
10241042static struct cfg80211_internal_bss *
10251043cfg80211_bss_update (struct cfg80211_registered_device * rdev ,
10261044 struct cfg80211_internal_bss * tmp ,
1045+ struct cfg80211_bss * trans_bss ,
10271046 bool signal_valid )
10281047{
10291048 struct cfg80211_internal_bss * found = NULL ;
@@ -1181,6 +1200,17 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
11811200 goto drop ;
11821201 }
11831202
1203+ /* This must be before the call to bss_ref_get */
1204+ if (trans_bss ) {
1205+ struct cfg80211_internal_bss * pbss =
1206+ container_of (trans_bss ,
1207+ struct cfg80211_internal_bss ,
1208+ pub );
1209+
1210+ new -> transmitted_bss = trans_bss ;
1211+ bss_ref_get (rdev , pbss );
1212+ }
1213+
11841214 list_add_tail (& new -> list , & rdev -> bss_list );
11851215 rdev -> bss_entries ++ ;
11861216 rb_insert_bss (rdev , new );
@@ -1336,7 +1366,8 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy,
13361366
13371367 signal_valid = abs (data -> chan -> center_freq - channel -> center_freq ) <=
13381368 wiphy -> max_adj_channel_rssi_comp ;
1339- res = cfg80211_bss_update (wiphy_to_rdev (wiphy ), & tmp , signal_valid );
1369+ res = cfg80211_bss_update (wiphy_to_rdev (wiphy ), & tmp , trans_bss ,
1370+ signal_valid );
13401371 if (!res )
13411372 return NULL ;
13421373
@@ -1639,7 +1670,8 @@ cfg80211_inform_single_bss_frame_data(struct wiphy *wiphy,
16391670
16401671 signal_valid = abs (data -> chan -> center_freq - channel -> center_freq ) <=
16411672 wiphy -> max_adj_channel_rssi_comp ;
1642- res = cfg80211_bss_update (wiphy_to_rdev (wiphy ), & tmp , signal_valid );
1673+ res = cfg80211_bss_update (wiphy_to_rdev (wiphy ), & tmp , trans_bss ,
1674+ signal_valid );
16431675 if (!res )
16441676 return NULL ;
16451677
0 commit comments