64
64
#define T_PM_CAP_ID_20US 1
65
65
#define T_PM_CAP_ID_40US 2
66
66
67
- static struct ble_ll_cs_supp_cap g_ble_ll_cs_local_cap ;
68
- static struct ble_ll_cs_sm g_ble_ll_cs_sm [MYNEWT_VAL (BLE_MAX_CONNECTIONS )];
67
+ struct ble_ll_cs_supp_cap g_ble_ll_cs_local_cap ;
68
+ struct ble_ll_cs_sm g_ble_ll_cs_sm [MYNEWT_VAL (BLE_MAX_CONNECTIONS )];
69
69
static const uint8_t t_ip1 [] = {10 , 20 , 30 , 40 , 50 , 60 , 80 , 145 };
70
70
static const uint8_t t_ip2 [] = {10 , 20 , 30 , 40 , 50 , 60 , 80 , 145 };
71
71
static const uint8_t t_fcs [] = {15 , 20 , 30 , 40 , 50 , 60 , 80 , 100 , 120 , 150 };
@@ -74,8 +74,8 @@ static const uint8_t default_channel_classification[10] = {
74
74
0xFC , 0xFF , 0x7F , 0xFC , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x1F
75
75
};
76
76
static uint8_t g_ble_ll_cs_chan_class [10 ];
77
- static uint8_t g_ble_ll_cs_chan_count = 0 ;
78
- static uint8_t g_ble_ll_cs_chan_indices [72 ];
77
+ uint8_t g_ble_ll_cs_chan_count = 0 ;
78
+ uint8_t g_ble_ll_cs_chan_indices [72 ];
79
79
80
80
#define MIN_CONN_EVENT_COUNT_BEFORE_START 10
81
81
#define OFFSET_FROM_CONN_EVENT_TICKS 10
@@ -410,6 +410,8 @@ ble_ll_cs_rx_security_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr,
410
410
411
411
ble_ll_cs_drbg_init (& connsm -> cssm -> drbg_ctx );
412
412
413
+ connsm -> cssm -> start_procedure_count = 0 ;
414
+
413
415
return BLE_LL_CTRL_CS_SEC_RSP ;
414
416
}
415
417
@@ -454,6 +456,8 @@ ble_ll_cs_rx_security_rsp(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
454
456
455
457
rc = ble_ll_cs_drbg_init (drbg_ctx );
456
458
459
+ connsm -> cssm -> start_procedure_count = 0 ;
460
+
457
461
/* Stop the control procedure and send an event to the host */
458
462
ble_ll_ctrl_proc_stop (connsm , BLE_LL_CTRL_PROC_CS_SEC_START );
459
463
ble_ll_cs_ev_sec_enable_complete (connsm , rc ? BLE_ERR_INV_LMP_LL_PARM :
@@ -1289,7 +1293,16 @@ ble_ll_cs_hci_proc_enable(const uint8_t *cmdbuf, uint8_t cmdlen)
1289
1293
/* Start scheduling CS procedures */
1290
1294
ble_ll_ctrl_proc_start (connsm , BLE_LL_CTRL_PROC_CS_START , NULL );
1291
1295
} else {
1292
- /* TODO: Terminate the CS measurement early */
1296
+ if (!connsm -> cssm -> measurement_enabled ) {
1297
+ return BLE_ERR_CMD_DISALLOWED ;
1298
+ }
1299
+
1300
+ connsm -> cssm -> terminate_measurement = 1 ;
1301
+ connsm -> cssm -> terminate_config_id = cmd -> config_id ;
1302
+ connsm -> cssm -> terminate_error_code = BLE_ERR_SUCCESS ;
1303
+
1304
+ /* Terminate the CS measurement early */
1305
+ ble_ll_ctrl_proc_start (connsm , BLE_LL_CTRL_PROC_CS_TERMINATE , NULL );
1293
1306
}
1294
1307
1295
1308
return BLE_ERR_SUCCESS ;
@@ -1740,6 +1753,89 @@ ble_ll_cs_rx_cs_start_rejected(struct ble_ll_conn_sm *connsm, uint8_t ble_error)
1740
1753
ble_ll_cs_ev_cs_proc_enable_complete (connsm , connsm -> cssm -> config_req_id , ble_error );
1741
1754
}
1742
1755
1756
+ void
1757
+ ble_ll_cs_terminate_req_make (struct ble_ll_conn_sm * connsm , uint8_t * dptr )
1758
+ {
1759
+ struct ble_ll_cs_sm * cssm = connsm -> cssm ;
1760
+ uint8_t config_id = cssm -> terminate_config_id ;
1761
+
1762
+ assert (config_id < ARRAY_SIZE (cssm -> config ));
1763
+
1764
+ * dptr = config_id ;
1765
+ put_le16 (dptr + 1 , cssm -> start_procedure_count + cssm -> procedure_count );
1766
+ dptr [3 ] = cssm -> terminate_error_code ;
1767
+ }
1768
+
1769
+ int
1770
+ ble_ll_cs_rx_cs_terminate_req (struct ble_ll_conn_sm * connsm , uint8_t * dptr ,
1771
+ uint8_t * rspbuf )
1772
+ {
1773
+ struct ble_ll_cs_sm * cssm = connsm -> cssm ;
1774
+ uint8_t config_id = * dptr & 0b00111111 ;
1775
+ uint16_t procedure_count = get_le16 (dptr + 1 );
1776
+ struct ble_ll_cs_proc_params * params ;
1777
+
1778
+ if (config_id >= ARRAY_SIZE (cssm -> config )) {
1779
+ ble_ll_ctrl_rej_ext_ind_make (BLE_LL_CTRL_CS_TERMINATE_REQ ,
1780
+ BLE_ERR_INV_LMP_LL_PARM , rspbuf );
1781
+ return BLE_LL_CTRL_REJECT_IND_EXT ;
1782
+ }
1783
+
1784
+ params = & cssm -> config [config_id ].proc_params ;
1785
+
1786
+ if (procedure_count > cssm -> start_procedure_count + params -> max_procedure_count ||
1787
+ procedure_count < cssm -> start_procedure_count ) {
1788
+ ble_ll_ctrl_rej_ext_ind_make (BLE_LL_CTRL_CS_TERMINATE_REQ ,
1789
+ BLE_ERR_CMD_DISALLOWED , rspbuf );
1790
+ return BLE_LL_CTRL_REJECT_IND_EXT ;
1791
+ }
1792
+
1793
+ cssm -> terminate_measurement = 1 ;
1794
+
1795
+ * rspbuf = config_id ;
1796
+ put_le16 (rspbuf + 1 , cssm -> start_procedure_count + cssm -> procedure_count );
1797
+ rspbuf [3 ] = BLE_ERR_SUCCESS ;
1798
+
1799
+ return BLE_LL_CTRL_CS_TERMINATE_RSP ;
1800
+ }
1801
+
1802
+ void
1803
+ ble_ll_cs_rx_cs_terminate_rsp (struct ble_ll_conn_sm * connsm , uint8_t * dptr )
1804
+ {
1805
+ struct ble_ll_cs_sm * cssm = connsm -> cssm ;
1806
+ uint8_t config_id = * dptr & 0b00111111 ;
1807
+ uint8_t error_code = dptr [3 ];
1808
+ uint16_t procedure_count = get_le16 (dptr + 1 );
1809
+ uint16_t total_procedure_count ;
1810
+
1811
+ if (config_id != cssm -> config_req_id ||
1812
+ !IS_PENDING_CTRL_PROC (connsm , BLE_LL_CTRL_PROC_CS_TERMINATE )) {
1813
+ return ;
1814
+ }
1815
+
1816
+ total_procedure_count = cssm -> start_procedure_count + cssm -> procedure_count ;
1817
+ if (total_procedure_count < procedure_count ) {
1818
+ cssm -> start_procedure_count = procedure_count ;
1819
+ } else {
1820
+ cssm -> start_procedure_count = total_procedure_count ;
1821
+ }
1822
+
1823
+ ble_ll_ctrl_proc_stop (connsm , BLE_LL_CTRL_PROC_CS_TERMINATE );
1824
+
1825
+ /* TODO: In d1.0r06 the LL_CS_TERMINATE_IND was replaced with
1826
+ * LL_CS_TERMINATE_REQ/RSP, but not all descriptions and diagrams
1827
+ * have been updated yet.
1828
+ */
1829
+ ble_ll_cs_ev_cs_proc_enable_complete (connsm , config_id , error_code );
1830
+ }
1831
+
1832
+ void
1833
+ ble_ll_cs_rx_cs_terminate_req_rejected (struct ble_ll_conn_sm * connsm , uint8_t ble_error )
1834
+ {
1835
+ ble_ll_ctrl_proc_stop (connsm , BLE_LL_CTRL_PROC_CS_TERMINATE );
1836
+ ble_ll_cs_ev_cs_proc_enable_complete (connsm , connsm -> cssm -> config_req_id , ble_error );
1837
+ }
1838
+
1743
1839
int
1744
1840
ble_ll_cs_hci_test (const uint8_t * cmdbuf , uint8_t cmdlen ,
1745
1841
uint8_t * rspbuf , uint8_t * rsplen )
0 commit comments