@@ -110,6 +110,12 @@ static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
110
110
pub );
111
111
bss -> refcount ++ ;
112
112
}
113
+ if (bss -> transmitted_bss ) {
114
+ bss = container_of (bss -> transmitted_bss ,
115
+ struct cfg80211_internal_bss ,
116
+ pub );
117
+ bss -> refcount ++ ;
118
+ }
113
119
}
114
120
115
121
static 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,
126
132
if (hbss -> refcount == 0 )
127
133
bss_free (hbss );
128
134
}
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
+
129
147
bss -> refcount -- ;
130
148
if (bss -> refcount == 0 )
131
149
bss_free (bss );
@@ -1024,6 +1042,7 @@ static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
1024
1042
static struct cfg80211_internal_bss *
1025
1043
cfg80211_bss_update (struct cfg80211_registered_device * rdev ,
1026
1044
struct cfg80211_internal_bss * tmp ,
1045
+ struct cfg80211_bss * trans_bss ,
1027
1046
bool signal_valid )
1028
1047
{
1029
1048
struct cfg80211_internal_bss * found = NULL ;
@@ -1181,6 +1200,17 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
1181
1200
goto drop ;
1182
1201
}
1183
1202
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
+
1184
1214
list_add_tail (& new -> list , & rdev -> bss_list );
1185
1215
rdev -> bss_entries ++ ;
1186
1216
rb_insert_bss (rdev , new );
@@ -1336,7 +1366,8 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy,
1336
1366
1337
1367
signal_valid = abs (data -> chan -> center_freq - channel -> center_freq ) <=
1338
1368
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 );
1340
1371
if (!res )
1341
1372
return NULL ;
1342
1373
@@ -1639,7 +1670,8 @@ cfg80211_inform_single_bss_frame_data(struct wiphy *wiphy,
1639
1670
1640
1671
signal_valid = abs (data -> chan -> center_freq - channel -> center_freq ) <=
1641
1672
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 );
1643
1675
if (!res )
1644
1676
return NULL ;
1645
1677
0 commit comments