@@ -967,6 +967,33 @@ static int hci_le_read_remote_features(struct bt_conn *conn)
967967 return 0 ;
968968}
969969
970+ static int hci_read_remote_version (struct bt_conn * conn )
971+ {
972+ struct bt_hci_cp_read_remote_version_info * cp ;
973+ struct net_buf * buf ;
974+
975+ if (conn -> state != BT_CONN_CONNECTED ) {
976+ return - ENOTCONN ;
977+ }
978+
979+ /* Remote version cannot change. */
980+ if (atomic_test_bit (conn -> flags , BT_CONN_AUTO_VERSION_INFO )) {
981+ return 0 ;
982+ }
983+
984+ buf = bt_hci_cmd_create (BT_HCI_OP_READ_REMOTE_VERSION_INFO ,
985+ sizeof (* cp ));
986+ if (!buf ) {
987+ return - ENOBUFS ;
988+ }
989+
990+ cp = net_buf_add (buf , sizeof (* cp ));
991+ cp -> handle = sys_cpu_to_le16 (conn -> handle );
992+
993+ return bt_hci_cmd_send_sync (BT_HCI_OP_READ_REMOTE_VERSION_INFO , buf ,
994+ NULL );
995+ }
996+
970997/* LE Data Length Change Event is optional so this function just ignore
971998 * error and stack will continue to use default values.
972999 */
@@ -1099,6 +1126,14 @@ static void conn_auto_initiate(struct bt_conn *conn)
10991126 }
11001127 }
11011128
1129+ if (IS_ENABLED (CONFIG_BT_REMOTE_VERSION ) &&
1130+ !atomic_test_bit (conn -> flags , BT_CONN_AUTO_VERSION_INFO )) {
1131+ err = hci_read_remote_version (conn );
1132+ if (!err ) {
1133+ return ;
1134+ }
1135+ }
1136+
11021137 if (IS_ENABLED (CONFIG_BT_AUTO_PHY_UPDATE ) &&
11031138 !atomic_test_bit (conn -> flags , BT_CONN_AUTO_PHY_COMPLETE ) &&
11041139 BT_FEAT_LE_PHY_2M (bt_dev .le .features )) {
@@ -1372,6 +1407,12 @@ static void le_remote_feat_complete(struct net_buf *buf)
13721407 }
13731408
13741409 atomic_set_bit (conn -> flags , BT_CONN_AUTO_FEATURE_EXCH );
1410+
1411+ if (IS_ENABLED (CONFIG_BT_REMOTE_INFO ) &&
1412+ !IS_ENABLED (CONFIG_BT_REMOTE_VERSION )) {
1413+ notify_remote_info (conn );
1414+ }
1415+
13751416 /* Continue with auto-initiated procedures */
13761417 conn_auto_initiate (conn );
13771418
@@ -3231,6 +3272,39 @@ static void hci_encrypt_key_refresh_complete(struct net_buf *buf)
32313272}
32323273#endif /* CONFIG_BT_SMP || CONFIG_BT_BREDR */
32333274
3275+ #if defined(CONFIG_BT_REMOTE_VERSION )
3276+ static void bt_hci_evt_read_remote_version_complete (struct net_buf * buf )
3277+ {
3278+ struct bt_hci_evt_remote_version_info * evt ;
3279+ struct bt_conn * conn ;
3280+
3281+ evt = net_buf_pull_mem (buf , sizeof (* evt ));
3282+ conn = bt_conn_lookup_handle (evt -> handle );
3283+ if (!conn ) {
3284+ BT_ERR ("No connection for handle %u" , evt -> handle );
3285+ return ;
3286+ }
3287+
3288+ if (!evt -> status ) {
3289+ conn -> rv .version = evt -> version ;
3290+ conn -> rv .manufacturer = sys_le16_to_cpu (evt -> manufacturer );
3291+ conn -> rv .subversion = sys_le16_to_cpu (evt -> subversion );
3292+ }
3293+
3294+ atomic_set_bit (conn -> flags , BT_CONN_AUTO_VERSION_INFO );
3295+
3296+ if (IS_ENABLED (CONFIG_BT_REMOTE_INFO )) {
3297+ /* Remote features is already present */
3298+ notify_remote_info (conn );
3299+ }
3300+
3301+ /* Continue with auto-initiated procedures */
3302+ conn_auto_initiate (conn );
3303+
3304+ bt_conn_unref (conn );
3305+ }
3306+ #endif /* CONFIG_BT_REMOTE_VERSION */
3307+
32343308#if defined(CONFIG_BT_SMP )
32353309static void le_ltk_neg_reply (u16_t handle )
32363310{
@@ -3795,6 +3869,11 @@ static const struct event_handler normal_events[] = {
37953869 hci_encrypt_key_refresh_complete ,
37963870 sizeof (struct bt_hci_evt_encrypt_key_refresh_complete )),
37973871#endif /* CONFIG_BT_SMP || CONFIG_BT_BREDR */
3872+ #if defined(CONFIG_BT_REMOTE_VERSION )
3873+ EVENT_HANDLER (BT_HCI_EVT_REMOTE_VERSION_INFO ,
3874+ bt_hci_evt_read_remote_version_complete ,
3875+ sizeof (struct bt_hci_evt_remote_version_info )),
3876+ #endif /* CONFIG_BT_REMOTE_VERSION */
37983877};
37993878
38003879static void hci_event (struct net_buf * buf )
0 commit comments