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

Commit cff17cc9 authored by Himanshu Rawat's avatar Himanshu Rawat Committed by Gerrit Code Review
Browse files

Merge changes I8dc69596,I101773a4,Icd8c3d40 into main

* changes:
  Reset AG state on discarding outgoing connection attempt
  Convert AG state from int to enum
  Flag to reset AG state on collision
parents 75e28f96 4ea88981
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -106,3 +106,13 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "reset_ag_state_on_collision"
    namespace: "bluetooth"
    description: "Reset AG instance state as well when outgoing connection attempt is discarded on collision detection"
    bug: "341376713"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -334,7 +334,7 @@ void bta_ag_disc_fail(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& /* data */) {
 ******************************************************************************/
void bta_ag_open_fail(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& data) {
  /* call open cback w. failure */
  log::debug("state [0x{:02x}]", p_scb->state);
  log::debug("state {}", bta_ag_state_str(p_scb->state));
  bta_ag_cback_open(p_scb, data.api_open.bd_addr, BTA_AG_FAIL_RESOURCES);
}

@@ -352,6 +352,9 @@ void bta_ag_rfc_fail(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& /* data */) {
  log::info("reset p_scb with index={}", bta_ag_scb_to_idx(p_scb));
  RawAddress peer_addr = p_scb->peer_addr;
  /* reinitialize stuff */
  if (com::android::bluetooth::flags::reset_ag_state_on_collision()) {
    p_scb->state = BTA_AG_INIT_ST;
  }
  p_scb->conn_handle = 0;
  p_scb->conn_service = 0;
  p_scb->peer_features = 0;
+11 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <bluetooth/log.h>

#include <cstdint>
#include <string>

#include "bta/ag/bta_ag_at.h"
#include "bta/include/bta_ag_api.h"
@@ -238,6 +239,14 @@ typedef enum {
  BTA_AG_SCO_APTX_SWB_SETTINGS_UNKNOWN = 0xFFFF,
} tBTA_AG_SCO_APTX_SWB_SETTINGS;

/* state machine states */
typedef enum {
  BTA_AG_INIT_ST,
  BTA_AG_OPENING_ST,
  BTA_AG_OPEN_ST,
  BTA_AG_CLOSING_ST
} tBTA_AG_STATE;

/* type for each service control block */
struct tBTA_AG_SCB {
  char clip[BTA_AG_AT_MAX_LEN + 1];     /* number string used for CLIP */
@@ -264,7 +273,7 @@ struct tBTA_AG_SCB {
  bool inband_enabled;      /* set to true if inband ring enabled */
  bool nrec_enabled;        /* noise reduction & echo canceling */
  bool svc_conn;            /* set to true when service level connection up */
  uint8_t state;            /* state machine state */
  tBTA_AG_STATE state;      /* state machine state */
  uint8_t conn_service;     /* connected service */
  uint8_t peer_scn;         /* peer scn */
  uint8_t app_id;           /* application id */
@@ -388,6 +397,7 @@ void bta_ag_sm_execute_by_handle(uint16_t handle, uint16_t event,
void bta_ag_collision_cback(tBTA_SYS_CONN_STATUS status, tBTA_SYS_ID id,
                            uint8_t app_id, const RawAddress& peer_addr);
void bta_ag_resume_open(tBTA_AG_SCB* p_scb);
const std::string bta_ag_state_str(tBTA_AG_STATE state);

/* SDP functions */
bool bta_ag_add_record(uint16_t service_uuid, const char* p_service_name,
+22 −19
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include "bta/ag/bta_ag_int.h"
#include "bta/include/bta_hfp_api.h"
#include "internal_include/bt_target.h"
#include "macros.h"
#include "osi/include/alarm.h"
#include "osi/include/compat.h"
#include "stack/include/bt_hdr.h"
@@ -42,9 +43,6 @@ using namespace bluetooth;
/*****************************************************************************
 * Constants and types
 ****************************************************************************/
/* state machine states */
enum { BTA_AG_INIT_ST, BTA_AG_OPENING_ST, BTA_AG_OPEN_ST, BTA_AG_CLOSING_ST };

#define CASE_RETURN_STR(const) \
  case const:                  \
    return #const;
@@ -108,14 +106,14 @@ static const char* bta_ag_evt_str(uint16_t event) {
  }
}

static const char* bta_ag_state_str(uint8_t state) {
const std::string bta_ag_state_str(tBTA_AG_STATE state) {
  switch (state) {
    CASE_RETURN_STR(BTA_AG_INIT_ST)
    CASE_RETURN_STR(BTA_AG_OPENING_ST)
    CASE_RETURN_STR(BTA_AG_OPEN_ST)
    CASE_RETURN_STR(BTA_AG_CLOSING_ST)
    CASE_RETURN_STRING(BTA_AG_INIT_ST);
    CASE_RETURN_STRING(BTA_AG_OPENING_ST);
    CASE_RETURN_STRING(BTA_AG_OPEN_ST);
    CASE_RETURN_STRING(BTA_AG_CLOSING_ST);
    default:
      return "Unknown AG State";
      RETURN_UNKNOWN_TYPE_STRING(tBTA_AG_STATE, state);
  }
}

@@ -394,7 +392,7 @@ void bta_ag_resume_open(tBTA_AG_SCB* p_scb) {
    bta_ag_sm_execute(p_scb, BTA_AG_API_OPEN_EVT, open_data);
  } else {
    log::verbose("device {} is already in state {}", p_scb->peer_addr,
                 p_scb->state);
                 bta_ag_state_str(p_scb->state));
  }
}

@@ -584,7 +582,8 @@ static void bta_ag_better_state_machine(tBTA_AG_SCB* p_scb, uint16_t event,
          bta_ag_free_db(p_scb, data);
          break;
        default:
          log::error("unknown event {} at state {}", event, p_scb->state);
          log::error("unknown event {} at state {}", event,
                     bta_ag_state_str(p_scb->state));
          break;
      }
      break;
@@ -633,7 +632,8 @@ static void bta_ag_better_state_machine(tBTA_AG_SCB* p_scb, uint16_t event,
          bta_ag_handle_collision(p_scb, data);
          break;
        default:
          log::error("unknown event {} at state {}", event, p_scb->state);
          log::error("unknown event {} at state {}", event,
                     bta_ag_state_str(p_scb->state));
          break;
      }
      break;
@@ -690,7 +690,8 @@ static void bta_ag_better_state_machine(tBTA_AG_SCB* p_scb, uint16_t event,
          bta_ag_start_close(p_scb, data);
          break;
        default:
          log::error("unknown event {} at state {}", event, p_scb->state);
          log::error("unknown event {} at state {}", event,
                     bta_ag_state_str(p_scb->state));
          break;
      }
      break;
@@ -722,7 +723,8 @@ static void bta_ag_better_state_machine(tBTA_AG_SCB* p_scb, uint16_t event,
          bta_ag_free_db(p_scb, data);
          break;
        default:
          log::error("unknown event {} at state {}", event, p_scb->state);
          log::error("unknown event {} at state {}", event,
                     bta_ag_state_str(p_scb->state));
          break;
      }
      break;
@@ -742,14 +744,15 @@ static void bta_ag_better_state_machine(tBTA_AG_SCB* p_scb, uint16_t event,
void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event,
                       const tBTA_AG_DATA& data) {
  uint16_t previous_event = event;
  uint8_t previous_state = p_scb->state;
  tBTA_AG_STATE previous_state = p_scb->state;

  log::debug(
      "Execute AG event handle:0x{:04x} bd_addr:{} state:{}[0x{:02x}] "
      "event:{}[0x{:04x}] result:{}[0x{:02x}]",
      bta_ag_scb_to_idx(p_scb), p_scb->peer_addr,
      bta_ag_state_str(p_scb->state), p_scb->state, bta_ag_evt_str(event),
      event, bta_ag_res_str(data.api_result.result), data.api_result.result);
      bta_ag_state_str(p_scb->state), static_cast<uint64_t>(p_scb->state),
      bta_ag_evt_str(event), event, bta_ag_res_str(data.api_result.result),
      data.api_result.result);

  bta_ag_better_state_machine(p_scb, event, data);

@@ -759,8 +762,8 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event,
        "state_change:{}[0x{:02x}]->{}[0x{:02x}] event:{}[0x{:04x}] "
        "result:{}[0x{:02x}]",
        bta_ag_scb_to_idx(p_scb), p_scb->peer_addr,
        bta_ag_state_str(previous_state), previous_state,
        bta_ag_state_str(p_scb->state), p_scb->state,
        bta_ag_state_str(previous_state), static_cast<uint64_t>(previous_state),
        bta_ag_state_str(p_scb->state), static_cast<uint64_t>(p_scb->state),
        bta_ag_evt_str(previous_event), previous_event,
        bta_ag_res_str(data.api_result.result), data.api_result.result);
  }
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ static void bta_ag_port_cback(uint32_t /* code */, uint16_t port_handle,
    if (!bta_ag_scb_open(p_scb)) {
      log::error(
          "rfcomm data on an unopened control block {} peer_addr {} state {}",
          handle, p_scb->peer_addr, p_scb->state);
          handle, p_scb->peer_addr, bta_ag_state_str(p_scb->state));
    }
    do_in_main_thread(
        FROM_HERE, base::BindOnce(&bta_ag_sm_execute_by_handle, handle,
Loading