@@ -3223,11 +3223,11 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
3223
3223
3224
3224
/* main receive path */
3225
3225
3226
- static bool prepare_for_handlers (struct ieee80211_rx_data * rx ,
3227
- struct ieee80211_hdr * hdr )
3226
+ static bool ieee80211_accept_frame (struct ieee80211_rx_data * rx )
3228
3227
{
3229
3228
struct ieee80211_sub_if_data * sdata = rx -> sdata ;
3230
3229
struct sk_buff * skb = rx -> skb ;
3230
+ struct ieee80211_hdr * hdr = (void * )skb -> data ;
3231
3231
struct ieee80211_rx_status * status = IEEE80211_SKB_RXCB (skb );
3232
3232
u8 * bssid = ieee80211_get_bssid (hdr , skb -> len , sdata -> vif .type );
3233
3233
int multicast = is_multicast_ether_addr (hdr -> addr1 );
@@ -3236,24 +3236,23 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3236
3236
case NL80211_IFTYPE_STATION :
3237
3237
if (!bssid && !sdata -> u .mgd .use_4addr )
3238
3238
return false;
3239
- if (!multicast &&
3240
- !ether_addr_equal (sdata -> vif .addr , hdr -> addr1 ))
3241
- return false;
3242
- break ;
3239
+ if (multicast )
3240
+ return true;
3241
+ return ether_addr_equal (sdata -> vif .addr , hdr -> addr1 );
3243
3242
case NL80211_IFTYPE_ADHOC :
3244
3243
if (!bssid )
3245
3244
return false;
3246
3245
if (ether_addr_equal (sdata -> vif .addr , hdr -> addr2 ) ||
3247
3246
ether_addr_equal (sdata -> u .ibss .bssid , hdr -> addr2 ))
3248
3247
return false;
3249
- if (ieee80211_is_beacon (hdr -> frame_control )) {
3248
+ if (ieee80211_is_beacon (hdr -> frame_control ))
3250
3249
return true;
3251
- } else if (!ieee80211_bssid_match (bssid , sdata -> u .ibss .bssid )) {
3250
+ if (!ieee80211_bssid_match (bssid , sdata -> u .ibss .bssid ))
3252
3251
return false;
3253
- } else if (!multicast &&
3254
- !ether_addr_equal (sdata -> vif .addr , hdr -> addr1 )) {
3252
+ if (!multicast &&
3253
+ !ether_addr_equal (sdata -> vif .addr , hdr -> addr1 ))
3255
3254
return false;
3256
- } else if (!rx -> sta ) {
3255
+ if (!rx -> sta ) {
3257
3256
int rate_idx ;
3258
3257
if (status -> flag & (RX_FLAG_HT | RX_FLAG_VHT ))
3259
3258
rate_idx = 0 ; /* TODO: HT/VHT rates */
@@ -3262,20 +3261,18 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3262
3261
ieee80211_ibss_rx_no_sta (sdata , bssid , hdr -> addr2 ,
3263
3262
BIT (rate_idx ));
3264
3263
}
3265
- break ;
3264
+ return true ;
3266
3265
case NL80211_IFTYPE_OCB :
3267
3266
if (!bssid )
3268
3267
return false;
3269
- if (ieee80211_is_beacon (hdr -> frame_control )) {
3268
+ if (ieee80211_is_beacon (hdr -> frame_control ))
3270
3269
return false;
3271
- } else if (!is_broadcast_ether_addr (bssid )) {
3272
- ocb_dbg (sdata , "BSSID mismatch in OCB mode!\n" );
3270
+ if (!is_broadcast_ether_addr (bssid ))
3273
3271
return false;
3274
- } else if (!multicast &&
3275
- !ether_addr_equal (sdata -> dev -> dev_addr ,
3276
- hdr -> addr1 )) {
3272
+ if (!multicast &&
3273
+ !ether_addr_equal (sdata -> dev -> dev_addr , hdr -> addr1 ))
3277
3274
return false;
3278
- } else if (!rx -> sta ) {
3275
+ if (!rx -> sta ) {
3279
3276
int rate_idx ;
3280
3277
if (status -> flag & RX_FLAG_HT )
3281
3278
rate_idx = 0 ; /* TODO: HT rates */
@@ -3284,18 +3281,17 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3284
3281
ieee80211_ocb_rx_no_sta (sdata , bssid , hdr -> addr2 ,
3285
3282
BIT (rate_idx ));
3286
3283
}
3287
- break ;
3284
+ return true ;
3288
3285
case NL80211_IFTYPE_MESH_POINT :
3289
- if (!multicast &&
3290
- !ether_addr_equal (sdata -> vif .addr , hdr -> addr1 ))
3291
- return false;
3292
- break ;
3286
+ if (multicast )
3287
+ return true;
3288
+ return ether_addr_equal (sdata -> vif .addr , hdr -> addr1 );
3293
3289
case NL80211_IFTYPE_AP_VLAN :
3294
3290
case NL80211_IFTYPE_AP :
3295
- if (!bssid ) {
3296
- if (! ether_addr_equal (sdata -> vif .addr , hdr -> addr1 ))
3297
- return false;
3298
- } else if (!ieee80211_bssid_match (bssid , sdata -> vif .addr )) {
3291
+ if (!bssid )
3292
+ return ether_addr_equal (sdata -> vif .addr , hdr -> addr1 );
3293
+
3294
+ if (!ieee80211_bssid_match (bssid , sdata -> vif .addr )) {
3299
3295
/*
3300
3296
* Accept public action frames even when the
3301
3297
* BSSID doesn't match, this is used for P2P
@@ -3308,7 +3304,9 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3308
3304
if (ieee80211_is_public_action (hdr , skb -> len ))
3309
3305
return true;
3310
3306
return ieee80211_is_beacon (hdr -> frame_control );
3311
- } else if (!ieee80211_has_tods (hdr -> frame_control )) {
3307
+ }
3308
+
3309
+ if (!ieee80211_has_tods (hdr -> frame_control )) {
3312
3310
/* ignore data frames to TDLS-peers */
3313
3311
if (ieee80211_is_data (hdr -> frame_control ))
3314
3312
return false;
@@ -3317,27 +3315,22 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3317
3315
!ether_addr_equal (bssid , hdr -> addr1 ))
3318
3316
return false;
3319
3317
}
3320
- break ;
3318
+ return true ;
3321
3319
case NL80211_IFTYPE_WDS :
3322
3320
if (bssid || !ieee80211_is_data (hdr -> frame_control ))
3323
3321
return false;
3324
- if (!ether_addr_equal (sdata -> u .wds .remote_addr , hdr -> addr2 ))
3325
- return false;
3326
- break ;
3322
+ return ether_addr_equal (sdata -> u .wds .remote_addr , hdr -> addr2 );
3327
3323
case NL80211_IFTYPE_P2P_DEVICE :
3328
- if (!ieee80211_is_public_action (hdr , skb -> len ) &&
3329
- !ieee80211_is_probe_req (hdr -> frame_control ) &&
3330
- !ieee80211_is_probe_resp (hdr -> frame_control ) &&
3331
- !ieee80211_is_beacon (hdr -> frame_control ))
3332
- return false;
3333
- break ;
3324
+ return ieee80211_is_public_action (hdr , skb -> len ) ||
3325
+ ieee80211_is_probe_req (hdr -> frame_control ) ||
3326
+ ieee80211_is_probe_resp (hdr -> frame_control ) ||
3327
+ ieee80211_is_beacon (hdr -> frame_control );
3334
3328
default :
3335
- /* should never get here */
3336
- WARN_ON_ONCE (1 );
3337
3329
break ;
3338
3330
}
3339
3331
3340
- return true;
3332
+ WARN_ON_ONCE (1 );
3333
+ return false;
3341
3334
}
3342
3335
3343
3336
/*
@@ -3351,11 +3344,10 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx,
3351
3344
{
3352
3345
struct ieee80211_local * local = rx -> local ;
3353
3346
struct ieee80211_sub_if_data * sdata = rx -> sdata ;
3354
- struct ieee80211_hdr * hdr = (void * )skb -> data ;
3355
3347
3356
3348
rx -> skb = skb ;
3357
3349
3358
- if (!prepare_for_handlers (rx , hdr ))
3350
+ if (!ieee80211_accept_frame (rx ))
3359
3351
return false;
3360
3352
3361
3353
if (!consume ) {
0 commit comments