@@ -407,6 +407,7 @@ static struct inform_bss_ml_sta_case {
407
407
int mld_id ;
408
408
bool sta_prof_vendor_elems ;
409
409
bool include_oper_class ;
410
+ bool nstr ;
410
411
} inform_bss_ml_sta_cases [] = {
411
412
{
412
413
.desc = "zero_mld_id" ,
@@ -426,6 +427,10 @@ static struct inform_bss_ml_sta_case {
426
427
.mld_id = 1 ,
427
428
.sta_prof_vendor_elems = true,
428
429
.include_oper_class = true,
430
+ }, {
431
+ .desc = "nstr" ,
432
+ .mld_id = 0 ,
433
+ .nstr = true,
429
434
},
430
435
};
431
436
KUNIT_ARRAY_PARAM_DESC (inform_bss_ml_sta , inform_bss_ml_sta_cases , desc )
@@ -458,7 +463,7 @@ static void test_inform_bss_ml_sta(struct kunit *test)
458
463
struct {
459
464
struct ieee80211_neighbor_ap_info info ;
460
465
struct ieee80211_tbtt_info_ge_11 ap ;
461
- } __packed rnr = {
466
+ } __packed rnr_normal = {
462
467
.info = {
463
468
.tbtt_info_hdr = u8_encode_bits (0 , IEEE80211_AP_INFO_TBTT_HDR_COUNT ),
464
469
.tbtt_info_len = sizeof (struct ieee80211_tbtt_info_ge_11 ),
@@ -477,6 +482,28 @@ static void test_inform_bss_ml_sta(struct kunit *test)
477
482
IEEE80211_RNR_MLD_PARAMS_LINK_ID ),
478
483
}
479
484
};
485
+ struct {
486
+ struct ieee80211_neighbor_ap_info info ;
487
+ struct ieee80211_rnr_mld_params mld_params ;
488
+ } __packed rnr_nstr = {
489
+ .info = {
490
+ .tbtt_info_hdr =
491
+ u8_encode_bits (0 , IEEE80211_AP_INFO_TBTT_HDR_COUNT ) |
492
+ u8_encode_bits (IEEE80211_TBTT_INFO_TYPE_MLD ,
493
+ IEEE80211_AP_INFO_TBTT_HDR_TYPE ),
494
+ .tbtt_info_len = sizeof (struct ieee80211_rnr_mld_params ),
495
+ .op_class = 81 ,
496
+ .channel = 11 ,
497
+ },
498
+ .mld_params = {
499
+ .mld_id = params -> mld_id ,
500
+ .params =
501
+ le16_encode_bits (link_id ,
502
+ IEEE80211_RNR_MLD_PARAMS_LINK_ID ),
503
+ }
504
+ };
505
+ size_t rnr_len = params -> nstr ? sizeof (rnr_nstr ) : sizeof (rnr_normal );
506
+ void * rnr = params -> nstr ? (void * )& rnr_nstr : (void * )& rnr_normal ;
480
507
struct {
481
508
__le16 control ;
482
509
u8 var_len ;
@@ -516,7 +543,7 @@ static void test_inform_bss_ml_sta(struct kunit *test)
516
543
u16_encode_bits (link_id ,
517
544
IEEE80211_MLE_STA_CONTROL_LINK_ID )),
518
545
.var_len = sizeof (sta_prof ) - 2 - 2 ,
519
- .bssid = { * rnr .ap .bssid },
546
+ .bssid = { * rnr_normal .ap .bssid },
520
547
.beacon_int = cpu_to_le16 (101 ),
521
548
.tsf_offset = cpu_to_le64 (-123ll ),
522
549
.capabilities = cpu_to_le16 (0xdead ),
@@ -540,8 +567,8 @@ static void test_inform_bss_ml_sta(struct kunit *test)
540
567
}
541
568
542
569
skb_put_u8 (input , WLAN_EID_REDUCED_NEIGHBOR_REPORT );
543
- skb_put_u8 (input , sizeof ( rnr ) );
544
- skb_put_data (input , & rnr , sizeof ( rnr ) );
570
+ skb_put_u8 (input , rnr_len );
571
+ skb_put_data (input , rnr , rnr_len );
545
572
546
573
/* build a multi-link element */
547
574
skb_put_u8 (input , WLAN_EID_EXTENSION );
@@ -587,9 +614,10 @@ static void test_inform_bss_ml_sta(struct kunit *test)
587
614
KUNIT_EXPECT_EQ (test , ctx .inform_bss_count , 2 );
588
615
589
616
/* Check link_bss *****************************************************/
590
- link_bss = cfg80211_get_bss (wiphy , NULL , sta_prof .bssid , NULL , 0 ,
591
- IEEE80211_BSS_TYPE_ANY ,
592
- IEEE80211_PRIVACY_ANY );
617
+ link_bss = __cfg80211_get_bss (wiphy , NULL , sta_prof .bssid , NULL , 0 ,
618
+ IEEE80211_BSS_TYPE_ANY ,
619
+ IEEE80211_PRIVACY_ANY ,
620
+ 0 );
593
621
KUNIT_ASSERT_NOT_NULL (test , link_bss );
594
622
KUNIT_EXPECT_EQ (test , link_bss -> signal , 0 );
595
623
KUNIT_EXPECT_EQ (test , link_bss -> beacon_interval ,
@@ -600,27 +628,43 @@ static void test_inform_bss_ml_sta(struct kunit *test)
600
628
KUNIT_EXPECT_PTR_EQ (test , link_bss -> channel ,
601
629
ieee80211_get_channel_khz (wiphy , MHZ_TO_KHZ (2462 )));
602
630
631
+ /* Test wiphy does not set WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY */
632
+ if (params -> nstr ) {
633
+ KUNIT_EXPECT_EQ (test , link_bss -> use_for , 0 );
634
+ KUNIT_EXPECT_EQ (test , link_bss -> cannot_use_reasons ,
635
+ NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY );
636
+ KUNIT_EXPECT_NULL (test ,
637
+ cfg80211_get_bss (wiphy , NULL , sta_prof .bssid ,
638
+ NULL , 0 ,
639
+ IEEE80211_BSS_TYPE_ANY ,
640
+ IEEE80211_PRIVACY_ANY ));
641
+ } else {
642
+ KUNIT_EXPECT_EQ (test , link_bss -> use_for ,
643
+ NL80211_BSS_USE_FOR_ALL );
644
+ KUNIT_EXPECT_EQ (test , link_bss -> cannot_use_reasons , 0 );
645
+ }
646
+
603
647
rcu_read_lock ();
604
648
ies = rcu_dereference (link_bss -> ies );
605
649
KUNIT_EXPECT_NOT_NULL (test , ies );
606
650
KUNIT_EXPECT_EQ (test , ies -> tsf , tsf + le64_to_cpu (sta_prof .tsf_offset ));
607
651
/* Resulting length should be:
608
652
* SSID (inherited) + RNR (inherited) + vendor element(s) +
609
653
* operating class (if requested) +
610
- * generated RNR (if MLD ID == 0) +
654
+ * generated RNR (if MLD ID == 0 and not NSTR ) +
611
655
* MLE common info + MLE header and control
612
656
*/
613
657
if (params -> sta_prof_vendor_elems )
614
658
KUNIT_EXPECT_EQ (test , ies -> len ,
615
- 6 + 2 + sizeof ( rnr ) + 2 + 160 + 2 + 165 +
659
+ 6 + 2 + rnr_len + 2 + 160 + 2 + 165 +
616
660
(params -> include_oper_class ? 3 : 0 ) +
617
- (!params -> mld_id ? 22 : 0 ) +
661
+ (!params -> mld_id && ! params -> nstr ? 22 : 0 ) +
618
662
mle_basic_common_info .var_len + 5 );
619
663
else
620
664
KUNIT_EXPECT_EQ (test , ies -> len ,
621
- 6 + 2 + sizeof ( rnr ) + 2 + 155 +
665
+ 6 + 2 + rnr_len + 2 + 155 +
622
666
(params -> include_oper_class ? 3 : 0 ) +
623
- (!params -> mld_id ? 22 : 0 ) +
667
+ (!params -> mld_id && ! params -> nstr ? 22 : 0 ) +
624
668
mle_basic_common_info .var_len + 5 );
625
669
rcu_read_unlock ();
626
670
0 commit comments