@@ -31,6 +31,7 @@ struct bt_tbs_instance *tbs_inst;
3131static uint8_t call_index ;
3232static uint8_t inst_ccid ;
3333static bool send_ev ;
34+ static uint8_t tbs_register_bearer (const void * cmd , uint16_t cmd_len , void * rsp , uint16_t * rsp_len );
3435
3536static uint8_t ccp_supported_commands (const void * cmd , uint16_t cmd_len ,
3637 void * rsp , uint16_t * rsp_len )
@@ -1092,6 +1093,11 @@ static struct bt_tbs_cb tbs_cbs = {
10921093};
10931094
10941095static const struct btp_handler tbs_handlers [] = {
1096+ {
1097+ .opcode = BTP_TBS_REGISTER_BEARER ,
1098+ .expect_len = BTP_HANDLER_LENGTH_VARIABLE ,
1099+ .func = tbs_register_bearer ,
1100+ },
10951101 {
10961102 .opcode = BTP_TBS_READ_SUPPORTED_COMMANDS ,
10971103 .index = BTP_INDEX_NONE ,
@@ -1152,50 +1158,89 @@ static const struct btp_handler tbs_handlers[] = {
11521158
11531159uint8_t tester_init_tbs (void )
11541160{
1155- const struct bt_tbs_register_param gtbs_param = {
1156- .provider_name = "Generic TBS" ,
1157- .uci = "un000" ,
1158- .uri_schemes_supported = "tel,skype" ,
1159- .gtbs = true,
1160- .authorization_required = false,
1161- .technology = BT_TBS_TECHNOLOGY_3G ,
1162- .supported_features = CONFIG_BT_TBS_SUPPORTED_FEATURES ,
1163- };
1164- const struct bt_tbs_register_param tbs_param = {
1165- .provider_name = "TBS" ,
1166- .uci = "un000" ,
1167- .uri_schemes_supported = "tel,skype" ,
1168- .gtbs = false,
1169- .authorization_required = false,
1170- /* Set different technologies per bearer */
1171- .technology = BT_TBS_TECHNOLOGY_4G ,
1172- .supported_features = CONFIG_BT_TBS_SUPPORTED_FEATURES ,
1173- };
1174- int err ;
1175-
11761161 bt_tbs_register_cb (& tbs_cbs );
11771162
11781163 tester_register_command_handlers (BTP_SERVICE_ID_TBS , tbs_handlers ,
11791164 ARRAY_SIZE (tbs_handlers ));
11801165
1181- err = bt_tbs_register_bearer (& gtbs_param );
1182- if (err < 0 ) {
1183- LOG_DBG ("Failed to register GTBS: %d" , err );
1166+ return BTP_STATUS_SUCCESS ;
1167+ }
11841168
1169+ uint8_t tester_unregister_tbs (void )
1170+ {
1171+ return BTP_STATUS_SUCCESS ;
1172+ }
1173+
1174+ static uint8_t tbs_register_bearer (const void * cmd , uint16_t cmd_len , void * rsp , uint16_t * rsp_len )
1175+ {
1176+ const struct btp_tbs_register_bearer_cmd * cp = cmd ;
1177+ const uint8_t * strings = cp -> strings ;
1178+ struct btp_tbs_register_bearer_rp * rp = rsp ;
1179+ char provider_name [CONFIG_BT_TBS_MAX_PROVIDER_NAME_LENGTH + 1 ];
1180+ char uci [BT_TBS_MAX_UCI_SIZE ];
1181+ char uri_scheme_list [CONFIG_BT_TBS_MAX_URI_LENGTH + 1 ];
1182+
1183+ if (cmd_len < sizeof (* cp )) {
1184+ LOG_DBG ("Packet too short: %u" , cmd_len );
11851185 return BTP_STATUS_FAILED ;
11861186 }
11871187
1188- err = bt_tbs_register_bearer (& tbs_param );
1189- if (err < 0 ) {
1190- LOG_DBG ("Failed to register TBS: %d" , err );
1188+ if (cmd_len != sizeof (* cp ) + cp -> provider_name_len +
1189+ cp -> uci_len + cp -> uri_scheme_list_len ) {
1190+ LOG_DBG ("Invalid length: %u" , cmd_len );
1191+ return BTP_STATUS_FAILED ;
1192+ }
11911193
1194+ if (cp -> provider_name_len >= sizeof (provider_name )) {
1195+ LOG_DBG ("Buffer overflow risk: provider_name_len=%u (max=%d)" ,
1196+ cp -> provider_name_len , CONFIG_BT_TBS_MAX_PROVIDER_NAME_LENGTH );
11921197 return BTP_STATUS_FAILED ;
11931198 }
11941199
1195- return BTP_STATUS_SUCCESS ;
1196- }
1200+ if (cp -> uci_len >= sizeof (uci )) {
1201+ LOG_DBG ("Buffer overflow risk: uci_len=%u (max=%u)" ,
1202+ cp -> uci_len , BT_TBS_MAX_UCI_SIZE - 1U );
1203+ return BTP_STATUS_FAILED ;
1204+ }
1205+
1206+ if (cp -> uri_scheme_list_len >= sizeof (uri_scheme_list )) {
1207+ LOG_DBG ("Buffer overflow risk: uri_scheme_list_len=%u (max=%d)" ,
1208+ cp -> uri_scheme_list_len , CONFIG_BT_TBS_MAX_URI_LENGTH );
1209+ return BTP_STATUS_FAILED ;
1210+ }
1211+
1212+ /* Extract provider_name */
1213+ (void )memcpy (provider_name , strings , cp -> provider_name_len );
1214+ provider_name [cp -> provider_name_len ] = '\0' ;
1215+
1216+ /* Extract uci */
1217+ (void )memcpy (uci , strings + cp -> provider_name_len , cp -> uci_len );
1218+ uci [cp -> uci_len ] = '\0' ;
1219+
1220+ /* Extract uri_scheme_list */
1221+ (void )memcpy (uri_scheme_list ,
1222+ strings + cp -> provider_name_len + cp -> uci_len ,
1223+ cp -> uri_scheme_list_len );
1224+ uri_scheme_list [cp -> uri_scheme_list_len ] = '\0' ;
1225+
1226+ struct bt_tbs_register_param param = {
1227+ .provider_name = provider_name ,
1228+ .uci = uci ,
1229+ .uri_schemes_supported = uri_scheme_list ,
1230+ .gtbs = cp -> gtbs == 1U ? true : false,
1231+ .technology = cp -> technology ,
1232+ .supported_features = sys_le16_to_cpu (cp -> optional_opcodes ),
1233+ };
1234+
1235+ int index = bt_tbs_register_bearer (& param );
1236+
1237+ if (index < 0 ) {
1238+ return BTP_STATUS_FAILED ;
1239+ }
1240+
1241+ /* Return the assigned index in the response */
1242+ rp -> index = (uint8_t )index ;
1243+ * rsp_len = sizeof (* rp );
11971244
1198- uint8_t tester_unregister_tbs (void )
1199- {
12001245 return BTP_STATUS_SUCCESS ;
12011246}
0 commit comments