Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3419f2c0 authored by Zach Johnson's avatar Zach Johnson
Browse files

Associate role management with ACL, not device management

Bug: 159815595
Tag: #refactor
Test: compile & verify basic functions working
Change-Id: I96e58238b83bbea78247fcbe94a48e1c4655dc33
parent 24bad913
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -1867,7 +1867,7 @@ void bta_av_do_start(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
   * It would not hurt us, if the peer device wants us to be master */
  if ((BTM_GetRole(p_scb->PeerAddress(), &cur_role) == BTM_SUCCESS) &&
      (cur_role == HCI_ROLE_MASTER)) {
    BTA_dm_block_role_switch_for(p_scb->PeerAddress());
    BTM_block_role_switch_for(p_scb->PeerAddress());
  }

  if (p_scb->started) {
@@ -1938,7 +1938,7 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->PeerAddress());
  if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 ||
      bta_av_cb.audio_open_cnt == 1) {
    BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
    BTM_unblock_role_switch_for(p_scb->PeerAddress());
  }

  if (p_scb->co_started) {
@@ -2372,7 +2372,7 @@ void bta_av_start_ok(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
       * master */
      if ((BTM_GetRole(p_scb->PeerAddress(), &cur_role) == BTM_SUCCESS) &&
          (cur_role == HCI_ROLE_MASTER)) {
        BTA_dm_block_role_switch_for(p_scb->PeerAddress());
        BTM_block_role_switch_for(p_scb->PeerAddress());
      }
    }

@@ -2435,7 +2435,7 @@ void bta_av_start_failed(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
    notify_start_failed(p_scb);
  }

  BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
  BTM_unblock_role_switch_for(p_scb->PeerAddress());
  p_scb->sco_suspend = false;
}

@@ -2459,7 +2459,7 @@ void bta_av_str_closed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {

  if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 ||
      bta_av_cb.audio_open_cnt == 1) {
    BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
    BTM_unblock_role_switch_for(p_scb->PeerAddress());
  }
  if (bta_av_cb.audio_open_cnt <= 1) {
    BTM_default_unblock_role_switch();
@@ -2570,7 +2570,7 @@ void bta_av_suspend_cfm(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->PeerAddress());
  if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 ||
      bta_av_cb.audio_open_cnt == 1) {
    BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
    BTM_unblock_role_switch_for(p_scb->PeerAddress());
  }

  /* in case that we received suspend_ind, we may need to call co_stop here */
+4 −4
Original line number Diff line number Diff line
@@ -921,7 +921,7 @@ void bta_av_restore_switch(void) {
    mask = BTA_AV_HNDL_TO_MSK(i);
    if (p_cb->conn_audio == mask) {
      if (p_cb->p_scb[i]) {
        BTA_dm_unblock_role_switch_for(p_cb->p_scb[i]->PeerAddress());
        BTM_unblock_role_switch_for(p_cb->p_scb[i]->PeerAddress());
      }
      break;
    }
@@ -974,7 +974,7 @@ static void bta_av_sys_rs_cback(UNUSED_ATTR tBTA_SYS_CONN_STATUS status,
  if ((HCI_SUCCESS != app_id) &&
      (BTM_GetRole(peer_addr, &cur_role) == BTM_SUCCESS) &&
      (cur_role == HCI_ROLE_SLAVE)) {
    BTA_dm_unblock_role_switch_for(peer_addr);
    BTM_unblock_role_switch_for(peer_addr);
  }

  /* if BTA_AvOpen() was called for other device, which caused the role switch
@@ -1100,7 +1100,7 @@ bool bta_av_switch_if_needed(tBTA_AV_SCB* p_scb) {
       */
      if (HCI_ROLE_MASTER != role) {
        if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
          BTA_dm_block_role_switch_for(p_scbi->PeerAddress());
          BTM_block_role_switch_for(p_scbi->PeerAddress());
        if (BTM_CMD_STARTED !=
            BTM_SwitchRole(p_scbi->PeerAddress(), HCI_ROLE_MASTER)) {
          /* can not switch role on SCBI
@@ -1144,7 +1144,7 @@ bool bta_av_link_role_ok(tBTA_AV_SCB* p_scb, uint8_t bits) {
        (A2DP_BitsSet(bta_av_cb.conn_audio) > bits ||
         (bta_av_cb.features & BTA_AV_FEAT_MASTER))) {
      if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
        BTA_dm_block_role_switch_for(p_scb->PeerAddress());
        BTM_block_role_switch_for(p_scb->PeerAddress());

      tBTM_STATUS status =
          BTM_SwitchRole(p_scb->PeerAddress(), HCI_ROLE_MASTER);
+2 −38
Original line number Diff line number Diff line
@@ -804,42 +804,6 @@ void bta_dm_pin_reply(std::unique_ptr<tBTA_DM_API_PIN_REPLY> msg) {
  }
}

void BTA_dm_unblock_sniff_mode_for(const RawAddress& peer_addr) {
  auto p_dev = bta_dm_find_peer_device(peer_addr);
  if (!p_dev) {
    return;
  }
  p_dev->link_policy |= HCI_ENABLE_SNIFF_MODE;
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
}

void BTA_dm_block_sniff_mode_for(const RawAddress& peer_addr) {
  auto p_dev = bta_dm_find_peer_device(peer_addr);
  if (!p_dev) {
    return;
  }
  p_dev->link_policy &= ~HCI_ENABLE_SNIFF_MODE;
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
}

void BTA_dm_unblock_role_switch_for(const RawAddress& peer_addr) {
  auto p_dev = bta_dm_find_peer_device(peer_addr);
  if (!p_dev) {
    return;
  }
  p_dev->link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
}

void BTA_dm_block_role_switch_for(const RawAddress& peer_addr) {
  auto p_dev = bta_dm_find_peer_device(peer_addr);
  if (!p_dev) {
    return;
  }
  p_dev->link_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
}

/** Send the user confirm request reply in response to a request from BTM */
void bta_dm_confirm(const RawAddress& bd_addr, bool accept) {
  BTM_ConfirmReqReply(accept ? BTM_SUCCESS : BTM_NOT_AUTHORIZED, bd_addr);
@@ -2519,7 +2483,7 @@ static void handle_role_change(const RawAddress& bd_addr, uint8_t new_role,
    }

    if (need_policy_change) {
      BTA_dm_block_role_switch_for(p_dev->peer_bdaddr);
      BTM_block_role_switch_for(p_dev->peer_bdaddr);
    }
  } else {
    /* there's AV no activity on this link and role switch happened
@@ -2710,7 +2674,7 @@ static void bta_dm_check_av() {
        /* make master and take away the role switch policy */
        BTM_SwitchRole(p_dev->peer_bdaddr, HCI_ROLE_MASTER);
        /* else either already master or can not switch for some reasons */
        BTA_dm_block_role_switch_for(p_dev->peer_bdaddr);
        BTM_block_role_switch_for(p_dev->peer_bdaddr);
        break;
      }
    }
+2 −2
Original line number Diff line number Diff line
@@ -1072,10 +1072,10 @@ static void bta_dm_pm_hid_check(bool bScoActive) {
          bScoActive, bta_dm_conn_srvcs.conn_srvc[j].state);
      auto peer_addr = bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr;
      if (bScoActive) {
        BTA_dm_block_sniff_mode_for(peer_addr);
        BTM_block_sniff_mode_for(peer_addr);
        bta_dm_pm_active(peer_addr);
      } else {
        BTA_dm_unblock_sniff_mode_for(peer_addr);
        BTM_unblock_sniff_mode_for(peer_addr);
        bta_dm_pm_set_mode(peer_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART);
      }
    }
+0 −5
Original line number Diff line number Diff line
@@ -241,9 +241,4 @@ extern void bta_sys_remove_uuid(uint16_t uuid16);
#define bta_sys_remove_uuid(ut)
#endif

void BTA_dm_unblock_sniff_mode_for(const RawAddress& peer_addr);
void BTA_dm_block_sniff_mode_for(const RawAddress& peer_addr);
void BTA_dm_unblock_role_switch_for(const RawAddress& peer_addr);
void BTA_dm_block_role_switch_for(const RawAddress& peer_addr);

#endif /* BTA_SYS_H */
Loading