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

Commit 8a919070 authored by Eric Shih's avatar Eric Shih Committed by Gerrit Code Review
Browse files

Merge "Refresh sniff timer in every rx rfcomm socket client packet" into main

parents 23f31590 c9d7e4a9
Loading
Loading
Loading
Loading
+68 −0
Original line number Diff line number Diff line
@@ -55,6 +55,8 @@ static void bta_dm_pm_btm_cback(const RawAddress& bd_addr,
                                tHCI_STATUS hci_status);
static bool bta_dm_pm_park(const RawAddress& peer_addr);
void bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE* p_peer_dev, uint8_t index);
static void bta_dm_sniff_cback(uint8_t id, uint8_t app_id,
                               const RawAddress& peer_addr);
static int bta_dm_get_sco_index();
static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer,
                                          uint8_t timer_idx);
@@ -95,6 +97,7 @@ void bta_dm_init_pm(void) {
  /* if there are no power manger entries, so not register */
  if (p_bta_dm_pm_cfg[0].app_id != 0) {
    bta_sys_pm_register(bta_dm_pm_cback);
    bta_sys_sniff_register(bta_dm_sniff_cback);

    get_btm_client_interface().lifecycle.BTM_PmRegister(
        (BTM_PM_REG_SET), &bta_dm_cb.pm_id, bta_dm_pm_btm_cback);
@@ -334,6 +337,71 @@ static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer,
  alarm_cancel(p_timer->timer[timer_idx]);
}

/*******************************************************************************
 *
 * Function         bta_dm_sniff_cback
 *
 * Description      Restart sniff timer for a peer
 *
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_dm_sniff_cback(uint8_t id, uint8_t app_id,
                               const RawAddress& peer_addr) {
  int i = 0, j = 0;
  uint64_t timeout_ms = 0;

  tBTA_DM_PEER_DEVICE* p_peer_device = bta_dm_find_peer_device(peer_addr);
  if (p_peer_device == NULL) {
    LOG_INFO("No peer device found: %s", ADDRESS_TO_LOGGABLE_CSTR(peer_addr));
    return;
  }

  /* Search for sniff table for timeout value
     p_bta_dm_pm_cfg[0].app_id is the number of entries */
  for (j = 1; j <= p_bta_dm_pm_cfg[0].app_id; j++) {
    if ((p_bta_dm_pm_cfg[j].id == id) &&
        ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID) ||
         (p_bta_dm_pm_cfg[j].app_id == app_id)))
      break;
  }
  // Handle overflow access
  if (j > p_bta_dm_pm_cfg[0].app_id) {
    LOG_INFO("No configuration found for %s",
             ADDRESS_TO_LOGGABLE_CSTR(peer_addr));
    return;
  }
  const tBTA_DM_PM_CFG* p_pm_cfg = &p_bta_dm_pm_cfg[j];
  const tBTA_DM_PM_SPEC* p_pm_spec = &get_bta_dm_pm_spec()[p_pm_cfg->spec_idx];
  const tBTA_DM_PM_ACTN* p_act0 = &p_pm_spec->actn_tbl[BTA_SYS_CONN_IDLE][0];
  const tBTA_DM_PM_ACTN* p_act1 = &p_pm_spec->actn_tbl[BTA_SYS_CONN_IDLE][1];

  tBTA_DM_PM_ACTION failed_pm = p_peer_device->pm_mode_failed;
  /* first check if the first preference is ok */
  if (!(failed_pm & p_act0->power_mode)) {
    timeout_ms = p_act0->timeout;
  }
  /* if first preference has already failed, try second preference */
  else if (!(failed_pm & p_act1->power_mode)) {
    timeout_ms = p_act1->timeout;
  }

  /* Refresh the sniff timer */
  for (i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
    if (bta_dm_cb.pm_timer[i].in_use &&
        bta_dm_cb.pm_timer[i].peer_bdaddr == peer_addr) {
      int timer_idx = bta_pm_action_to_timer_idx(BTA_DM_PM_SNIFF);
      if (timer_idx != BTA_DM_PM_MODE_TIMER_MAX) {
        /* Cancel and restart the timer */
        bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], timer_idx);
        bta_dm_pm_start_timer(&bta_dm_cb.pm_timer[i], timer_idx, timeout_ms, id,
                              BTA_DM_PM_SNIFF);
      }
    }
  }
}

/*******************************************************************************
 *
 * Function         bta_dm_pm_cback
+21 −2
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ static void bta_jv_pm_conn_busy(tBTA_JV_PM_CB* p_cb);
static void bta_jv_pm_conn_idle(tBTA_JV_PM_CB* p_cb);
static void bta_jv_pm_state_change(tBTA_JV_PM_CB* p_cb,
                                   const tBTA_JV_CONN_STATE state);
static void bta_jv_reset_sniff_timer(tBTA_JV_PM_CB* p_cb);

#ifndef BTA_JV_SDP_DB_SIZE
#define BTA_JV_SDP_DB_SIZE 4500
@@ -1258,10 +1259,10 @@ static int bta_jv_port_data_co_cback(uint16_t port_handle, uint8_t* buf,
  if (p_pcb != NULL) {
    switch (type) {
      case DATA_CO_CALLBACK_TYPE_INCOMING:
        // Exit sniff mode when receiving data by sysproxy
        // Reset sniff timer when receiving data by sysproxy
        if (osi_property_get_bool("bluetooth.rfcomm.sysproxy.rx.exit_sniff",
                                  false)) {
          bta_jv_pm_conn_busy(p_pcb->p_pm_cb);
          bta_jv_reset_sniff_timer(p_pcb->p_pm_cb);
        }
        return bta_co_rfc_data_incoming(p_pcb->rfcomm_slot_id, (BT_HDR*)buf);
      case DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE:
@@ -1900,4 +1901,22 @@ static void bta_jv_pm_state_change(tBTA_JV_PM_CB* p_cb,
      break;
  }
}

/*******************************************************************************
 *
 * Function    bta_jv_reset_sniff_timer
 *
 * Description reset pm sniff timer state (input param safe)
 *
 * Params      p_cb: pm control block of jv connection
 *
 * Returns     void
 *
 ******************************************************************************/
static void bta_jv_reset_sniff_timer(tBTA_JV_PM_CB* p_cb) {
  if (NULL != p_cb) {
    p_cb->state = BTA_JV_PM_IDLE_ST;
    bta_sys_reset_sniff(BTA_ID_JV, p_cb->app_id, p_cb->peer_bd_addr);
  }
}
/******************************************************************************/
+6 −2
Original line number Diff line number Diff line
@@ -200,6 +200,9 @@ typedef void(tBTA_SYS_ROLE_SWITCH_CBACK)(tBTA_SYS_CONN_STATUS status,
typedef void(tBTA_SYS_SSR_CFG_CBACK)(uint8_t id, uint8_t app_id,
                                     uint16_t latency, uint16_t tout);

typedef void(tBTA_SYS_SNIFF_CBACK)(uint8_t id, uint8_t app_id,
                                   const RawAddress& peer_addr);

typedef struct {
  bluetooth::Uuid custom_uuid;
  uint32_t handle;
@@ -241,7 +244,7 @@ void bta_sys_disable();

void bta_sys_rm_register(tBTA_SYS_CONN_CBACK* p_cback);
void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback);

void bta_sys_sniff_register(tBTA_SYS_SNIFF_CBACK* p_cback);
void bta_sys_sco_register(tBTA_SYS_CONN_SCO_CBACK* p_cback);

void bta_sys_conn_open(tBTA_SYS_ID id, uint8_t app_id,
@@ -262,7 +265,8 @@ void bta_sys_sco_unuse(tBTA_SYS_ID id, uint8_t app_id,
                       const RawAddress& peer_addr);
void bta_sys_idle(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr);
void bta_sys_busy(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr);

void bta_sys_reset_sniff(uint8_t id, uint8_t app_id,
                         const RawAddress& peer_addr);
void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK* p_cback);
void bta_sys_chg_ssr_config(tBTA_SYS_ID id, uint8_t app_id,
                            uint16_t max_latency, uint16_t min_tout);
+31 −0
Original line number Diff line number Diff line
@@ -169,6 +169,37 @@ void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback) {
  bta_sys_cb.ppm_cb = p_cback;
}

/*******************************************************************************
 *
 * Function         bta_sys_sniff_register
 *
 * Description      Called by BTA DM to register sniff callbacks
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_sys_sniff_register(tBTA_SYS_SNIFF_CBACK* p_cback) {
  bta_sys_cb.sniff_cb = p_cback;
}

/*******************************************************************************
 *
 * Function         bta_sys_reset_sniff
 *
 * Description      Called by BTA subsystems to reset sniff timer
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_sys_reset_sniff(uint8_t id, uint8_t app_id,
                         const RawAddress& peer_addr) {
  if (bta_sys_cb.sniff_cb) {
    bta_sys_cb.sniff_cb(id, app_id, peer_addr);
  }
}

/*******************************************************************************
 *
 * Function         bta_sys_conn_open
+2 −0
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ typedef struct {
  tBTA_SYS_CONN_CBACK* prm_cb; /* role management callback registered by DM */
  tBTA_SYS_CONN_CBACK*
      ppm_cb; /* low power management callback registered by DM */
  tBTA_SYS_SNIFF_CBACK*
      sniff_cb; /* low power management sniff callback registered by DM */
  tBTA_SYS_CONN_SCO_CBACK*
      p_sco_cb; /* SCO connection change callback registered by AV */
  tBTA_SYS_ROLE_SWITCH_CBACK*
Loading