@@ -1873,6 +1873,30 @@ static void pa_sync_synced_cb(struct bt_le_per_adv_sync *sync,
1873
1873
{
1874
1874
LOG_DBG ("" );
1875
1875
1876
+ /* sync transfer received */
1877
+ if (IS_ENABLED (CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER ) && info -> conn != NULL ) {
1878
+ struct btp_gap_ev_periodic_transfer_received_ev ev ;
1879
+ struct bt_conn_info conn_info ;
1880
+
1881
+ if (pa_sync != NULL ) {
1882
+ return ;
1883
+ }
1884
+
1885
+ pa_sync = sync ;
1886
+
1887
+ bt_conn_get_info (info -> conn , & conn_info );
1888
+
1889
+ bt_addr_le_copy (& ev .adv_address , & sync -> addr );
1890
+ ev .sync_handle = sys_cpu_to_le16 (sync -> handle );
1891
+ ev .status = 0 ;
1892
+ bt_addr_le_copy (& ev .peer_address , conn_info .le .dst );
1893
+
1894
+ tester_event (BTP_SERVICE_ID_GAP , BTP_GAP_EV_PERIODIC_TRANSFER_RECEIVED ,
1895
+ & ev , sizeof (ev ));
1896
+ return ;
1897
+ }
1898
+
1899
+ /* locally initiated */
1876
1900
if (sync == pa_sync ) {
1877
1901
struct btp_gap_ev_periodic_sync_established_ev ev ;
1878
1902
@@ -1904,9 +1928,43 @@ static void pa_sync_terminated_cb(struct bt_le_per_adv_sync *sync,
1904
1928
}
1905
1929
}
1906
1930
1931
+ static struct net_buf_simple * periodic_adv_buf =
1932
+ NET_BUF_SIMPLE (sizeof (struct btp_gap_ev_periodic_report_ev ) + UINT8_MAX );
1933
+
1934
+ static void pa_sync_recv_cb (struct bt_le_per_adv_sync * sync ,
1935
+ const struct bt_le_per_adv_sync_recv_info * info ,
1936
+ struct net_buf_simple * buf )
1937
+ {
1938
+ struct btp_gap_ev_periodic_report_ev * ev ;
1939
+
1940
+ LOG_DBG ("" );
1941
+
1942
+ /* cleanup */
1943
+ net_buf_simple_init (periodic_adv_buf , 0 );
1944
+
1945
+ ev = net_buf_simple_add (periodic_adv_buf , sizeof (* ev ));
1946
+
1947
+ ev -> sync_handle = sys_cpu_to_le16 (sync -> handle );
1948
+ ev -> rssi = info -> rssi ;
1949
+ ev -> cte_type = info -> cte_type ;
1950
+
1951
+ /* TODO BTP has fragmented data (as in HCI) */
1952
+ if (buf -> len > UINT8_MAX ) {
1953
+ ev -> data_len = UINT8_MAX ;
1954
+ } else {
1955
+ ev -> data_len = buf -> len ;
1956
+ }
1957
+
1958
+ memcpy (net_buf_simple_add (periodic_adv_buf , ev -> data_len ), buf -> data , ev -> data_len );
1959
+
1960
+ tester_event (BTP_SERVICE_ID_GAP , BTP_GAP_EV_PERIODIC_REPORT ,
1961
+ ev , sizeof (* ev ) + ev -> data_len );
1962
+ }
1963
+
1907
1964
static struct bt_le_per_adv_sync_cb pa_sync_cb = {
1908
1965
.synced = pa_sync_synced_cb ,
1909
1966
.term = pa_sync_terminated_cb ,
1967
+ .recv = pa_sync_recv_cb ,
1910
1968
};
1911
1969
1912
1970
#if defined(CONFIG_BT_PER_ADV )
@@ -2164,6 +2222,114 @@ static uint8_t padv_create_sync(const void *cmd, uint16_t cmd_len,
2164
2222
2165
2223
return BTP_STATUS_VAL (err );
2166
2224
}
2225
+
2226
+ #if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER )
2227
+ static uint8_t padv_sync_transfer_set_info (const void * cmd , uint16_t cmd_len ,
2228
+ void * rsp , uint16_t * rsp_len )
2229
+ {
2230
+ const struct btp_gap_padv_sync_transfer_set_info_cmd * cp = cmd ;
2231
+ struct bt_le_ext_adv * ext_adv = tester_gap_ext_adv_get (0 );
2232
+ struct bt_conn * conn ;
2233
+ int err ;
2234
+
2235
+ if (ext_adv == NULL ) {
2236
+ return BTP_STATUS_FAILED ;
2237
+ }
2238
+
2239
+ if (cp -> address .type == BTP_BR_ADDRESS_TYPE ) {
2240
+ return BTP_STATUS_FAILED ;
2241
+ }
2242
+
2243
+ conn = bt_conn_lookup_addr_le (BT_ID_DEFAULT , & cp -> address );
2244
+ if (conn == NULL ) {
2245
+ return BTP_STATUS_FAILED ;
2246
+ }
2247
+
2248
+ err = bt_le_per_adv_set_info_transfer (ext_adv , conn ,
2249
+ sys_le16_to_cpu (cp -> service_data ));
2250
+
2251
+ bt_conn_unref (conn );
2252
+
2253
+ if (err < 0 ) {
2254
+ return BTP_STATUS_FAILED ;
2255
+ }
2256
+
2257
+ return BTP_STATUS_SUCCESS ;
2258
+ }
2259
+
2260
+ static uint8_t padv_padv_sync_transfer_start (const void * cmd , uint16_t cmd_len ,
2261
+ void * rsp , uint16_t * rsp_len )
2262
+ {
2263
+ const struct btp_gap_padv_sync_transfer_start_cmd * cp = cmd ;
2264
+ struct bt_conn * conn ;
2265
+ int err ;
2266
+
2267
+ if (pa_sync == NULL ) {
2268
+ return BTP_STATUS_FAILED ;
2269
+ }
2270
+
2271
+ if (cp -> address .type == BTP_BR_ADDRESS_TYPE ) {
2272
+ return BTP_STATUS_FAILED ;
2273
+ }
2274
+
2275
+ conn = bt_conn_lookup_addr_le (BT_ID_DEFAULT , & cp -> address );
2276
+ if (conn == NULL ) {
2277
+ return BTP_STATUS_FAILED ;
2278
+ }
2279
+
2280
+ err = bt_le_per_adv_sync_transfer (pa_sync , conn ,
2281
+ sys_le16_to_cpu (cp -> service_data ));
2282
+
2283
+ bt_conn_unref (conn );
2284
+
2285
+ if (err < 0 ) {
2286
+ return BTP_STATUS_FAILED ;
2287
+ }
2288
+
2289
+ return BTP_STATUS_SUCCESS ;
2290
+ }
2291
+ #endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER) */
2292
+
2293
+ #if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER )
2294
+ static uint8_t padv_padv_sync_transfer_recv (const void * cmd , uint16_t cmd_len ,
2295
+ void * rsp , uint16_t * rsp_len )
2296
+ {
2297
+ const struct btp_gap_padv_sync_transfer_recv_cmd * cp = cmd ;
2298
+ struct bt_le_per_adv_sync_transfer_param param = {0 };
2299
+ struct bt_conn * conn ;
2300
+ int err ;
2301
+
2302
+ if (pa_sync != NULL ) {
2303
+ return BTP_STATUS_FAILED ;
2304
+ }
2305
+
2306
+ if (cp -> address .type == BTP_BR_ADDRESS_TYPE ) {
2307
+ return BTP_STATUS_FAILED ;
2308
+ }
2309
+
2310
+ conn = bt_conn_lookup_addr_le (BT_ID_DEFAULT , & cp -> address );
2311
+ if (conn == NULL ) {
2312
+ return BTP_STATUS_FAILED ;
2313
+ }
2314
+
2315
+ param .skip = sys_le16_to_cpu (cp -> skip );
2316
+ param .timeout = sys_le16_to_cpu (cp -> sync_timeout );
2317
+
2318
+ if ((cp -> flags & BTP_GAP_PADV_SYNC_TRANSFER_RECV_FLAG_REPORTS_DISABLED ) != 0 ) {
2319
+ param .options |= BT_LE_PER_ADV_SYNC_TRANSFER_OPT_REPORTING_INITIALLY_DISABLED ;
2320
+ }
2321
+
2322
+ err = bt_le_per_adv_sync_transfer_subscribe (conn , & param );
2323
+
2324
+ bt_conn_unref (conn );
2325
+
2326
+ if (err < 0 ) {
2327
+ return BTP_STATUS_FAILED ;
2328
+ }
2329
+
2330
+ return BTP_STATUS_SUCCESS ;
2331
+ }
2332
+ #endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER) */
2167
2333
#endif /* defined(CONFIG_BT_PER_ADV) */
2168
2334
2169
2335
#if defined(CONFIG_BT_RPA_TIMEOUT_DYNAMIC )
@@ -2350,6 +2516,25 @@ static const struct btp_handler handlers[] = {
2350
2516
.expect_len = sizeof (struct btp_gap_padv_create_sync_cmd ),
2351
2517
.func = padv_create_sync ,
2352
2518
},
2519
+ #if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER )
2520
+ {
2521
+ .opcode = BTP_GAP_PADV_SYNC_TRANSFER_SET_INFO ,
2522
+ .expect_len = sizeof (struct btp_gap_padv_sync_transfer_set_info_cmd ),
2523
+ .func = padv_sync_transfer_set_info ,
2524
+ },
2525
+ {
2526
+ .opcode = BTP_GAP_PADV_SYNC_TRANSFER_START ,
2527
+ .expect_len = sizeof (struct btp_gap_padv_sync_transfer_start_cmd ),
2528
+ .func = padv_padv_sync_transfer_start ,
2529
+ },
2530
+ #endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER) */
2531
+ #if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER )
2532
+ {
2533
+ .opcode = BTP_GAP_PADV_SYNC_TRANSFER_RECV ,
2534
+ .expect_len = sizeof (struct btp_gap_padv_sync_transfer_recv_cmd ),
2535
+ .func = padv_padv_sync_transfer_recv ,
2536
+ },
2537
+ #endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER) */
2353
2538
#endif /* defined(CONFIG_BT_PER_ADV) */
2354
2539
#endif /* defined(CONFIG_BT_EXT_ADV) */
2355
2540
#if defined(CONFIG_BT_RPA_TIMEOUT_DYNAMIC )
0 commit comments