Home | History | Annotate | Download | only in sys
      1 /******************************************************************************
      2  *
      3  *  Copyright 2003-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  Routes connection status callbacks from various sub systems to DM
     22  *
     23  ******************************************************************************/
     24 
     25 #include <stddef.h>
     26 
     27 #include "bt_common.h"
     28 #include "bta_api.h"
     29 #include "bta_sys.h"
     30 #include "bta_sys_int.h"
     31 #include "osi/include/osi.h"
     32 #include "utl.h"
     33 
     34 /*******************************************************************************
     35  *
     36  * Function         bta_sys_rm_register
     37  *
     38  * Description      Called by BTA DM to register role management callbacks
     39  *
     40  *
     41  * Returns          void
     42  *
     43  ******************************************************************************/
     44 void bta_sys_rm_register(tBTA_SYS_CONN_CBACK* p_cback) {
     45   bta_sys_cb.prm_cb = p_cback;
     46 }
     47 
     48 /*******************************************************************************
     49  *
     50  * Function         bta_sys_policy_register
     51  *
     52  * Description      Called by BTA DM to register link policy change callbacks
     53  *
     54  *
     55  * Returns          void
     56  *
     57  ******************************************************************************/
     58 void bta_sys_policy_register(tBTA_SYS_CONN_CBACK* p_cback) {
     59   bta_sys_cb.p_policy_cb = p_cback;
     60 }
     61 
     62 /*******************************************************************************
     63  *
     64  * Function         bta_sys_role_chg_register
     65  *
     66  * Description      Called by BTA AV to register role change callbacks
     67  *
     68  *
     69  * Returns          void
     70  *
     71  ******************************************************************************/
     72 void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK* p_cback) {
     73   bta_sys_cb.p_role_cb = p_cback;
     74 }
     75 /*******************************************************************************
     76  *
     77  * Function         bta_sys_ssr_cfg_register
     78  *
     79  * Description      Called by BTA DM to register SSR configuration callback
     80  *
     81  *
     82  * Returns          void
     83  *
     84  ******************************************************************************/
     85 #if (BTM_SSR_INCLUDED == TRUE)
     86 void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK* p_cback) {
     87   bta_sys_cb.p_ssr_cb = p_cback;
     88 }
     89 #endif
     90 /*******************************************************************************
     91  *
     92  * Function         bta_sys_role_chg_register
     93  *
     94  * Description      Called by BTA AV to register role change callbacks
     95  *
     96  *
     97  * Returns          void
     98  *
     99  ******************************************************************************/
    100 void bta_sys_notify_role_chg(const RawAddress& peer_addr, uint8_t new_role,
    101                              uint8_t hci_status) {
    102   APPL_TRACE_DEBUG("%s: peer %s new_role:%d hci_status:0x%x", __func__,
    103                    peer_addr.ToString().c_str(), new_role, hci_status);
    104   if (bta_sys_cb.p_role_cb) {
    105     bta_sys_cb.p_role_cb(BTA_SYS_ROLE_CHANGE, new_role, hci_status, peer_addr);
    106   }
    107 }
    108 
    109 /*******************************************************************************
    110  *
    111  * Function         bta_sys_collision_register
    112  *
    113  * Description      Called by any BTA module to register for collision event.
    114  *
    115  *
    116  * Returns          void
    117  *
    118  ******************************************************************************/
    119 void bta_sys_collision_register(uint8_t bta_id, tBTA_SYS_CONN_CBACK* p_cback) {
    120   uint8_t index;
    121 
    122   for (index = 0; index < MAX_COLLISION_REG; index++) {
    123     if ((bta_sys_cb.colli_reg.id[index] == bta_id) ||
    124         (bta_sys_cb.colli_reg.id[index] == 0)) {
    125       bta_sys_cb.colli_reg.id[index] = bta_id;
    126       bta_sys_cb.colli_reg.p_coll_cback[index] = p_cback;
    127       return;
    128     }
    129   }
    130 }
    131 
    132 /*******************************************************************************
    133  *
    134  * Function         bta_sys_notify_collision
    135  *
    136  * Description      Called by BTA DM to notify collision event.
    137  *
    138  *
    139  * Returns          void
    140  *
    141  ******************************************************************************/
    142 void bta_sys_notify_collision(const RawAddress& peer_addr) {
    143   uint8_t index;
    144 
    145   for (index = 0; index < MAX_COLLISION_REG; index++) {
    146     if ((bta_sys_cb.colli_reg.id[index] != 0) &&
    147         (bta_sys_cb.colli_reg.p_coll_cback[index] != NULL)) {
    148       bta_sys_cb.colli_reg.p_coll_cback[index](0, BTA_ID_SYS, 0, peer_addr);
    149     }
    150   }
    151 }
    152 
    153 /*******************************************************************************
    154  *
    155  * Function         bta_sys_sco_register
    156  *
    157  * Description      Called by BTA AV to register sco connection change callbacks
    158  *
    159  *
    160  * Returns          void
    161  *
    162  ******************************************************************************/
    163 void bta_sys_sco_register(tBTA_SYS_CONN_CBACK* p_cback) {
    164   bta_sys_cb.p_sco_cb = p_cback;
    165 }
    166 
    167 /*******************************************************************************
    168  *
    169  * Function         bta_sys_pm_register
    170  *
    171  * Description      Called by BTA DM to register power management callbacks
    172  *
    173  *
    174  * Returns          void
    175  *
    176  ******************************************************************************/
    177 void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback) {
    178   bta_sys_cb.ppm_cb = p_cback;
    179 }
    180 
    181 /*******************************************************************************
    182  *
    183  * Function         bta_sys_conn_open
    184  *
    185  * Description      Called by BTA subsystems when a connection is made to
    186  *                  the service
    187  *
    188  *
    189  * Returns          void
    190  *
    191  ******************************************************************************/
    192 void bta_sys_conn_open(uint8_t id, uint8_t app_id,
    193                        const RawAddress& peer_addr) {
    194   if (bta_sys_cb.prm_cb) {
    195     bta_sys_cb.prm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
    196   }
    197 
    198   if (bta_sys_cb.ppm_cb) {
    199     bta_sys_cb.ppm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
    200   }
    201 }
    202 
    203 /*******************************************************************************
    204  *
    205  * Function         bta_sys_conn_close
    206  *
    207  * Description      Called by BTA subsystems when a connection to the service
    208  *                  is closed
    209  *
    210  *
    211  * Returns          void
    212  *
    213  ******************************************************************************/
    214 void bta_sys_conn_close(uint8_t id, uint8_t app_id,
    215                         const RawAddress& peer_addr) {
    216   if (bta_sys_cb.prm_cb) {
    217     bta_sys_cb.prm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
    218   }
    219 
    220   if (bta_sys_cb.ppm_cb) {
    221     bta_sys_cb.ppm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
    222   }
    223 }
    224 
    225 /*******************************************************************************
    226  *
    227  * Function         bta_sys_app_open
    228  *
    229  * Description      Called by BTA subsystems when application initiates
    230  *                  connection to a peer device
    231  *
    232  *
    233  * Returns          void
    234  *
    235  ******************************************************************************/
    236 void bta_sys_app_open(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
    237   if (bta_sys_cb.ppm_cb) {
    238     bta_sys_cb.ppm_cb(BTA_SYS_APP_OPEN, id, app_id, peer_addr);
    239   }
    240 }
    241 
    242 /*******************************************************************************
    243  *
    244  * Function         bta_sys_app_close
    245  *
    246  * Description      Called by BTA subsystems when application initiates close
    247  *                  of connection to peer device
    248  *
    249  * Returns          void
    250  *
    251  ******************************************************************************/
    252 void bta_sys_app_close(uint8_t id, uint8_t app_id,
    253                        const RawAddress& peer_addr) {
    254   if (bta_sys_cb.ppm_cb) {
    255     bta_sys_cb.ppm_cb(BTA_SYS_APP_CLOSE, id, app_id, peer_addr);
    256   }
    257 }
    258 
    259 /*******************************************************************************
    260  *
    261  * Function         bta_sys_sco_open
    262  *
    263  * Description      Called by BTA subsystems when sco connection for that
    264  *                  service is open
    265  *
    266  * Returns          void
    267  *
    268  ******************************************************************************/
    269 void bta_sys_sco_open(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
    270   /* AG triggers p_sco_cb by bta_sys_sco_use. */
    271   if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) {
    272     /* without querying BTM_GetNumScoLinks() */
    273     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
    274   }
    275 
    276   if (bta_sys_cb.ppm_cb) {
    277     bta_sys_cb.ppm_cb(BTA_SYS_SCO_OPEN, id, app_id, peer_addr);
    278   }
    279 }
    280 
    281 /*******************************************************************************
    282  *
    283  * Function         bta_sys_sco_close
    284  *
    285  * Description      Called by BTA subsystems when sco connection for that
    286  *                  service is closed
    287  *
    288  * Returns          void
    289  *
    290  ******************************************************************************/
    291 void bta_sys_sco_close(uint8_t id, uint8_t app_id,
    292                        const RawAddress& peer_addr) {
    293   uint8_t num_sco_links;
    294 
    295   if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) {
    296     num_sco_links = BTM_GetNumScoLinks();
    297     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
    298   }
    299 
    300   if (bta_sys_cb.ppm_cb) {
    301     bta_sys_cb.ppm_cb(BTA_SYS_SCO_CLOSE, id, app_id, peer_addr);
    302   }
    303 }
    304 
    305 /*******************************************************************************
    306  *
    307  * Function         bta_sys_sco_use
    308  *
    309  * Description      Called by BTA subsystems when that service needs to use sco.
    310  *
    311  *
    312  * Returns          void
    313  *
    314  ******************************************************************************/
    315 void bta_sys_sco_use(UNUSED_ATTR uint8_t id, uint8_t app_id,
    316                      const RawAddress& peer_addr) {
    317   /* AV streaming need to be suspended before SCO is connected. */
    318   if (bta_sys_cb.p_sco_cb) {
    319     /* without querying BTM_GetNumScoLinks() */
    320     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
    321   }
    322 }
    323 
    324 /*******************************************************************************
    325  *
    326  * Function         bta_sys_sco_unuse
    327  *
    328  * Description      Called by BTA subsystems when sco connection for that
    329  *                  service is no longer needed.
    330  *
    331  * Returns          void
    332  *
    333  ******************************************************************************/
    334 void bta_sys_sco_unuse(uint8_t id, uint8_t app_id,
    335                        const RawAddress& peer_addr) {
    336   if ((bta_sys_cb.p_sco_cb)) {
    337     uint8_t num_sco_links = BTM_GetNumScoLinks();
    338     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
    339   }
    340 }
    341 /*******************************************************************************
    342  *
    343  * Function         bta_sys_chg_ssr_config
    344  *
    345  * Description      Called by BTA subsystems to indicate that the given app SSR
    346  *                  setting needs to be changed.
    347  *
    348  * Returns          void
    349  *
    350  ******************************************************************************/
    351 #if (BTM_SSR_INCLUDED == TRUE)
    352 void bta_sys_chg_ssr_config(uint8_t id, uint8_t app_id, uint16_t max_latency,
    353                             uint16_t min_tout) {
    354   if (bta_sys_cb.p_ssr_cb) {
    355     bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout);
    356   }
    357 }
    358 #endif
    359 /*******************************************************************************
    360  *
    361  * Function         bta_sys_set_policy
    362  *
    363  * Description      Called by BTA subsystems to indicate that the given link
    364  *                  policy to peer device should be set
    365  *
    366  * Returns          void
    367  *
    368  ******************************************************************************/
    369 void bta_sys_set_policy(uint8_t id, uint8_t policy,
    370                         const RawAddress& peer_addr) {
    371   APPL_TRACE_DEBUG("%s: peer %s id:%d policy:0x%x", __func__,
    372                    peer_addr.ToString().c_str(), id, policy);
    373   if (bta_sys_cb.p_policy_cb) {
    374     bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_SET, id, policy, peer_addr);
    375   }
    376 }
    377 
    378 /*******************************************************************************
    379  *
    380  * Function         bta_sys_clear_policy
    381  *
    382  * Description      Called by BTA subsystems to indicate that the given link
    383  *                  policy to peer device should be clear
    384  *
    385  * Returns          void
    386  *
    387  ******************************************************************************/
    388 void bta_sys_clear_policy(uint8_t id, uint8_t policy,
    389                           const RawAddress& peer_addr) {
    390   APPL_TRACE_DEBUG("%s: peer %s id:%d policy:0x%x", __func__,
    391                    peer_addr.ToString().c_str(), id, policy);
    392   if (bta_sys_cb.p_policy_cb) {
    393     bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_CLR, id, policy, peer_addr);
    394   }
    395 }
    396 
    397 /*******************************************************************************
    398  *
    399  * Function         bta_sys_set_default_policy
    400  *
    401  * Description      Called by BTA subsystems to indicate that the given default
    402  *                  link policy should be set
    403  *
    404  * Returns          void
    405  *
    406  ******************************************************************************/
    407 void bta_sys_set_default_policy(uint8_t id, uint8_t policy) {
    408   APPL_TRACE_DEBUG("%s: id:%d policy:0x%x", __func__, id, policy);
    409   if (bta_sys_cb.p_policy_cb) {
    410     bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_SET, id, policy,
    411                            RawAddress::kEmpty);
    412   }
    413 }
    414 
    415 /*******************************************************************************
    416  *
    417  * Function         bta_sys_clear_default_policy
    418  *
    419  * Description      Called by BTA subsystems to indicate that the given default
    420  *                  link policy should be clear
    421  *
    422  * Returns          void
    423  *
    424  ******************************************************************************/
    425 void bta_sys_clear_default_policy(uint8_t id, uint8_t policy) {
    426   APPL_TRACE_DEBUG("%s: id:%d policy:0x%x", __func__, id, policy);
    427   if (bta_sys_cb.p_policy_cb) {
    428     bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_CLR, id, policy,
    429                            RawAddress::kEmpty);
    430   }
    431 }
    432 
    433 /*******************************************************************************
    434  *
    435  * Function         bta_sys_idle
    436  *
    437  * Description      Called by BTA subsystems to indicate that the connection to
    438  *                  peer device is idle
    439  *
    440  * Returns          void
    441  *
    442  ******************************************************************************/
    443 void bta_sys_idle(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
    444   if (bta_sys_cb.prm_cb) {
    445     bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
    446   }
    447 
    448   if (bta_sys_cb.ppm_cb) {
    449     bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
    450   }
    451 }
    452 
    453 /*******************************************************************************
    454  *
    455  * Function         bta_sys_busy
    456  *
    457  * Description      Called by BTA subsystems to indicate that the connection to
    458  *                  peer device is busy
    459  *
    460  * Returns          void
    461  *
    462  ******************************************************************************/
    463 void bta_sys_busy(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
    464   if (bta_sys_cb.prm_cb) {
    465     bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
    466   }
    467 
    468   if (bta_sys_cb.ppm_cb) {
    469     bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
    470   }
    471 }
    472 
    473 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
    474 /*******************************************************************************
    475  *
    476  * Function         bta_sys_eir_register
    477  *
    478  * Description      Called by BTA DM to register EIR utility function that can
    479  *                  be used by the other BTA modules to add/remove UUID.
    480  *
    481  * Returns          void
    482  *
    483  ******************************************************************************/
    484 void bta_sys_eir_register(tBTA_SYS_EIR_CBACK* p_cback) {
    485   bta_sys_cb.eir_cb = p_cback;
    486 }
    487 
    488 /*******************************************************************************
    489  *
    490  * Function         bta_sys_add_uuid
    491  *
    492  * Description      Called by BTA subsystems to indicate to DM that new service
    493  *                  class UUID is added.
    494  *
    495  * Returns          void
    496  *
    497  ******************************************************************************/
    498 void bta_sys_add_uuid(uint16_t uuid16) {
    499   if (bta_sys_cb.eir_cb) {
    500     bta_sys_cb.eir_cb(uuid16, true);
    501   }
    502 }
    503 
    504 /*******************************************************************************
    505  *
    506  * Function         bta_sys_remove_uuid
    507  *
    508  * Description      Called by BTA subsystems to indicate to DM that the service
    509  *                  class UUID is removed.
    510  *
    511  * Returns          void
    512  *
    513  ******************************************************************************/
    514 void bta_sys_remove_uuid(uint16_t uuid16) {
    515   if (bta_sys_cb.eir_cb) {
    516     bta_sys_cb.eir_cb(uuid16, false);
    517   }
    518 }
    519 #endif
    520