@@ -47,6 +47,10 @@ DEFINE_FFF_GLOBALS;
47
47
#include "helper_pdu.h"
48
48
#include "helper_util.h"
49
49
50
+ #include <zephyr/bluetooth/iso.h>
51
+
52
+ #define SUB_INTERVAL_MIN 400
53
+
50
54
static struct ll_conn conn ;
51
55
52
56
static struct ll_conn_iso_group cig_mock = { 0 };
@@ -84,11 +88,11 @@ static struct pdu_data_llctrl_cis_req remote_cis_req = {
84
88
.p_ft = 1 ,
85
89
.iso_interval = 6 ,
86
90
.conn_event_count = 12 ,
87
- .c_sdu_interval = { 0 , 0 , 0 },
88
- .p_sdu_interval = { 0 , 0 , 0 },
89
- .sub_interval = { 0 , 0 , 0 },
90
- .cis_offset_min = { 0 , 0 , 0 },
91
- .cis_offset_max = { 0 , 0 , 0 }
91
+ .c_sdu_interval = { 0 , 0x02 , 0 }, /* 512 us */
92
+ .p_sdu_interval = { 0 , 0x02 , 0 }, /* 512 us */
93
+ .sub_interval = { 0x90 , 0x01 , 0x00 }, /* 400 us */
94
+ .cis_offset_min = { 0 , 0x02 , 0 }, /* 512 us */
95
+ .cis_offset_max = { 0 , 0x02 , 0 } /* 512 us */
92
96
};
93
97
94
98
static struct pdu_data_llctrl_cis_ind remote_cis_ind = {
@@ -169,8 +173,8 @@ ZTEST(cis_create, test_cc_create_periph_rem_host_accept)
169
173
.cis_id = 0x02
170
174
};
171
175
struct pdu_data_llctrl_cis_rsp local_cis_rsp = {
172
- .cis_offset_max = { 0 , 0 , 0 },
173
- .cis_offset_min = { 0 , 0 , 0 },
176
+ .cis_offset_max = { 0 , 0x02 , 0 },
177
+ .cis_offset_min = { 0 , 0x02 , 0 },
174
178
.conn_event_count = 12
175
179
};
176
180
struct node_rx_conn_iso_estab cis_estab = {
@@ -525,6 +529,196 @@ ZTEST(cis_create, test_cc_create_periph_rem_invalid_phy)
525
529
"Free CTX buffers %d" , llcp_ctx_buffers_free ());
526
530
}
527
531
532
+ static void rx_remote_cis_req_invalid_param (struct pdu_data_llctrl_cis_req * req )
533
+ {
534
+ struct node_tx * tx ;
535
+ struct pdu_data_llctrl_reject_ext_ind local_reject = {
536
+ .error_code = BT_HCI_ERR_INVALID_LL_PARAM ,
537
+ .reject_opcode = PDU_DATA_LLCTRL_TYPE_CIS_REQ
538
+ };
539
+
540
+ test_setup (& conn );
541
+
542
+ /* Role */
543
+ test_set_role (& conn , BT_HCI_ROLE_PERIPHERAL );
544
+
545
+ /* Connect */
546
+ ull_cp_state_set (& conn , ULL_CP_CONNECTED );
547
+
548
+ /* Prepare */
549
+ event_prepare (& conn );
550
+
551
+ /* Rx */
552
+ lt_tx (LL_CIS_REQ , & conn , req );
553
+
554
+ /* Done */
555
+ event_done (& conn );
556
+
557
+ /* Prepare */
558
+ event_prepare (& conn );
559
+
560
+ /* Tx Queue should have one LL Control PDU */
561
+ lt_rx (LL_REJECT_EXT_IND , & conn , & tx , & local_reject );
562
+ lt_rx_q_is_empty (& conn );
563
+
564
+ /* Done */
565
+ event_done (& conn );
566
+
567
+ zassert_equal (llcp_ctx_buffers_free (), test_ctx_buffers_cnt (),
568
+ "Free CTX buffers %d" , llcp_ctx_buffers_free ());
569
+ }
570
+
571
+ /*
572
+ * Central-initiated CIS Create procedure.
573
+ * Central requests CIS w. invalid param, peripheral Host rejects.
574
+ *
575
+ * +-----+ +-------+ +-----+
576
+ * | UT | | LL_S | | LT |
577
+ * +-----+ +-------+ +-----+
578
+ * | | |
579
+ * | | LL_CIS_REQ (invalid param) |
580
+ * | |<------------------------------|
581
+ * | | |
582
+ * | | |
583
+ * | | |
584
+ * | | |
585
+ * | | |
586
+ * | | |
587
+ * | | LL_REJECT_EXT_IND |
588
+ * | |------------------------------>|
589
+ * | | |
590
+ */
591
+ ZTEST (cis_create , test_cc_create_periph_rem_invalid_param )
592
+ {
593
+ struct pdu_data_llctrl_cis_req remote_cis_req_invalid_param = remote_cis_req ;
594
+
595
+ /* Rx with c_sdu_interval < 255 */
596
+ sys_put_le24 (BT_HCI_ISO_SDU_INTERVAL_MIN - 1 , remote_cis_req_invalid_param .c_sdu_interval );
597
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
598
+
599
+ /* Restore to valid params */
600
+ remote_cis_req_invalid_param = remote_cis_req ;
601
+
602
+ /* Rx with p_sdu_interval < 255 */
603
+ sys_put_le24 (BT_HCI_ISO_SDU_INTERVAL_MIN - 1 , remote_cis_req_invalid_param .p_sdu_interval );
604
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
605
+
606
+ /* Restore to valid params */
607
+ remote_cis_req_invalid_param = remote_cis_req ;
608
+
609
+ /* Rx with c_max_pdu > 251 */
610
+ remote_cis_req_invalid_param .c_max_pdu = sys_cpu_to_le16 (BT_ISO_PDU_MAX + 1 );
611
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
612
+
613
+ /* Restore to valid params */
614
+ remote_cis_req_invalid_param = remote_cis_req ;
615
+
616
+ /* Rx with p_max_pdu > 251 */
617
+ remote_cis_req_invalid_param .p_max_pdu = sys_cpu_to_le16 (BT_ISO_PDU_MAX + 1 );
618
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
619
+
620
+ /* Restore to valid params */
621
+ remote_cis_req_invalid_param = remote_cis_req ;
622
+
623
+ /* Rx with nse == 0 */
624
+ remote_cis_req_invalid_param .nse = 0 ;
625
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
626
+
627
+ /* Restore to valid params */
628
+ remote_cis_req_invalid_param = remote_cis_req ;
629
+
630
+ /* Rx with nse > 31 */
631
+ remote_cis_req_invalid_param .nse = BT_ISO_NSE_MAX + 1 ;
632
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
633
+
634
+ /* Restore to valid params */
635
+ remote_cis_req_invalid_param = remote_cis_req ;
636
+
637
+ /* Rx with sub_interval > 0 && nse == 1 */
638
+ remote_cis_req_invalid_param .nse = 1 ;
639
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
640
+
641
+ /* Restore to valid params */
642
+ remote_cis_req_invalid_param = remote_cis_req ;
643
+
644
+ /* Rx with sub_interval < 400 && nse > 1 */
645
+ sys_put_le24 (SUB_INTERVAL_MIN - 1 , remote_cis_req_invalid_param .sub_interval );
646
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
647
+
648
+ /* Restore to valid params */
649
+ remote_cis_req_invalid_param = remote_cis_req ;
650
+
651
+ /* Rx with sub_interval >= iso_interval */
652
+ sys_put_le24 (sys_le16_to_cpu (remote_cis_req_invalid_param .iso_interval ) * CONN_INT_UNIT_US ,
653
+ remote_cis_req_invalid_param .sub_interval );
654
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
655
+
656
+ /* Restore to valid params */
657
+ remote_cis_req_invalid_param = remote_cis_req ;
658
+
659
+
660
+ /* Rx with c_bn == 0 && c_max_pdu > 0 */
661
+ remote_cis_req_invalid_param .c_bn = 0 ;
662
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
663
+
664
+ /* Restore to valid params */
665
+ remote_cis_req_invalid_param = remote_cis_req ;
666
+
667
+ /* Rx with p_bn == 0 && p_max_pdu > 0 */
668
+ remote_cis_req_invalid_param .p_bn = 0 ;
669
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
670
+
671
+ /* Restore to valid params */
672
+ remote_cis_req_invalid_param = remote_cis_req ;
673
+
674
+ /* Rx with c_ft == 0 */
675
+ remote_cis_req_invalid_param .c_ft = 0 ;
676
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
677
+
678
+ /* Restore to valid params */
679
+ remote_cis_req_invalid_param = remote_cis_req ;
680
+
681
+ /* Rx with p_ft == 0 */
682
+ remote_cis_req_invalid_param .p_ft = 0 ;
683
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
684
+
685
+ /* Restore to valid params */
686
+ remote_cis_req_invalid_param = remote_cis_req ;
687
+
688
+ /* Rx with iso_interval < 4 */
689
+ remote_cis_req_invalid_param .iso_interval = sys_cpu_to_le16 (BT_HCI_ISO_INTERVAL_MIN - 1 );
690
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
691
+
692
+ /* Restore to valid params */
693
+ remote_cis_req_invalid_param = remote_cis_req ;
694
+
695
+ /* Rx with iso_interval > 3200 */
696
+ remote_cis_req_invalid_param .iso_interval = sys_cpu_to_le16 (BT_HCI_ISO_INTERVAL_MAX + 1 );
697
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
698
+
699
+ /* Restore to valid params */
700
+ remote_cis_req_invalid_param = remote_cis_req ;
701
+
702
+ /* Rx with cis_offset_min < 500 */
703
+ sys_put_le24 (PDU_CIS_OFFSET_MIN_US - 1 , remote_cis_req_invalid_param .cis_offset_min );
704
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
705
+
706
+ /* Restore to valid params */
707
+ remote_cis_req_invalid_param = remote_cis_req ;
708
+
709
+ /* Rx with cis_offset_max < cis_offset_min */
710
+ sys_put_le24 (0x01FF , remote_cis_req_invalid_param .cis_offset_max );
711
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
712
+
713
+ /* Restore to valid params */
714
+ remote_cis_req_invalid_param = remote_cis_req ;
715
+
716
+ /* Rx with cis_offset_max >= conn_interval */
717
+ sys_put_le24 (conn .lll .interval * CONN_INT_UNIT_US ,
718
+ remote_cis_req_invalid_param .cis_offset_max );
719
+ rx_remote_cis_req_invalid_param (& remote_cis_req_invalid_param );
720
+ }
721
+
528
722
/*
529
723
* Central-initiated CIS Create procedure.
530
724
* Host requests CIS, LL replies with 'remote feature unsupported'
0 commit comments