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

Commit 815c4e84 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Use Bind in BTA_JvL2capStartServer

Bug: 68359837
Test: compilation test
Change-Id: I0fb574e25c11f46a6fa68bef830a2e9fbcbd2d42
parent 5935afe7
Loading
Loading
Loading
Loading
+25 −37
Original line number Diff line number Diff line
@@ -1071,79 +1071,67 @@ static void bta_jv_l2cap_server_cback(uint16_t gap_handle, uint16_t event) {
  }
}

/*******************************************************************************
 *
 * Function     bta_jv_l2cap_start_server
 *
 * Description  starts an L2CAP server
 *
 * Returns      void
 *
 ******************************************************************************/
void bta_jv_l2cap_start_server(tBTA_JV_MSG* p_data) {
  tBTA_JV_L2C_CB* p_cb;
  uint8_t sec_id;
/** starts an L2CAP server */
void bta_jv_l2cap_start_server(int32_t type, tBTA_SEC sec_mask,
                               tBTA_JV_ROLE role, uint16_t local_psm,
                               uint16_t rx_mtu,
                               std::unique_ptr<tL2CAP_CFG_INFO> cfg_param,
                               std::unique_ptr<tL2CAP_ERTM_INFO> ertm_info,
                               tBTA_JV_L2CAP_CBACK* p_cback,
                               uint32_t l2cap_socket_id) {
  uint16_t handle;
  tL2CAP_CFG_INFO cfg;
  tBTA_JV_L2CAP_START evt_data;
  tBTA_JV_API_L2CAP_SERVER* ls = &(p_data->l2cap_server);
  uint8_t chan_mode_mask = GAP_FCR_CHAN_OPT_BASIC;
  tL2CAP_ERTM_INFO* ertm_info = NULL;

  tL2CAP_CFG_INFO cfg;
  memset(&cfg, 0, sizeof(tL2CAP_CFG_INFO));

  if (ls->has_cfg) {
    cfg = ls->cfg;
  if (cfg_param) {
    cfg = *cfg_param;
    if (cfg.fcr_present && cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) {
      chan_mode_mask = GAP_FCR_CHAN_OPT_ERTM;
    }
  }

  if (ls->has_ertm_info) {
    ertm_info = &(ls->ertm_info);
  }

  // FIX: MTU=0 means not present
  if (ls->rx_mtu > 0) {
  if (rx_mtu > 0) {
    cfg.mtu_present = true;
    cfg.mtu = ls->rx_mtu;
    cfg.mtu = rx_mtu;
  } else {
    cfg.mtu_present = false;
    cfg.mtu = 0;
  }

  /* TODO DM role manager
  L2CA_SetDesireRole(ls->role);
  L2CA_SetDesireRole(role);
  */

  sec_id = bta_jv_alloc_sec_id();
  uint8_t sec_id = bta_jv_alloc_sec_id();
  /* PSM checking is not required for LE COC */
  if (0 == sec_id ||
      ((ls->type == BTA_JV_CONN_TYPE_L2CAP) &&
       (!bta_jv_check_psm(ls->local_psm))) ||
      (handle = GAP_ConnOpen("JV L2CAP", sec_id, 1, nullptr, ls->local_psm,
                             &cfg, ertm_info, ls->sec_mask, chan_mode_mask,
                             bta_jv_l2cap_server_cback, ls->type)) ==
      ((type == BTA_JV_CONN_TYPE_L2CAP) && (!bta_jv_check_psm(local_psm))) ||
      (handle = GAP_ConnOpen("JV L2CAP", sec_id, 1, nullptr, local_psm, &cfg,
                             ertm_info.get(), sec_mask, chan_mode_mask,
                             bta_jv_l2cap_server_cback, type)) ==
          GAP_INVALID_HANDLE) {
    bta_jv_free_sec_id(&sec_id);
    evt_data.status = BTA_JV_FAILURE;
  } else {
    p_cb = &bta_jv_cb.l2c_cb[handle];
    tBTA_JV_L2C_CB* p_cb = &bta_jv_cb.l2c_cb[handle];
    evt_data.status = BTA_JV_SUCCESS;
    evt_data.handle = handle;
    evt_data.sec_id = sec_id;
    p_cb->p_cback = ls->p_cback;
    p_cb->l2cap_socket_id = ls->l2cap_socket_id;
    p_cb->p_cback = p_cback;
    p_cb->l2cap_socket_id = l2cap_socket_id;
    p_cb->handle = handle;
    p_cb->sec_id = sec_id;
    p_cb->state = BTA_JV_ST_SR_LISTEN;
    p_cb->psm = ls->local_psm;
    p_cb->psm = local_psm;
  }

  if (ls->p_cback) {
  if (p_cback) {
    tBTA_JV bta_jv;
    bta_jv.l2c_start = evt_data;
    ls->p_cback(BTA_JV_L2CAP_START_EVT, &bta_jv, ls->l2cap_socket_id);
    p_cback(BTA_JV_L2CAP_START_EVT, &bta_jv, l2cap_socket_id);
  }
}

+10 −24
Original line number Diff line number Diff line
@@ -376,33 +376,19 @@ tBTA_JV_STATUS BTA_JvL2capStartServer(int conn_type, tBTA_SEC sec_mask,
                                      uint32_t l2cap_socket_id) {
  APPL_TRACE_API("%s", __func__);

  if (p_cback == NULL) return BTA_JV_FAILURE; /* Nothing to do */
  if (!p_cback) return BTA_JV_FAILURE; /* Nothing to do */

  tBTA_JV_API_L2CAP_SERVER* p_msg =
      (tBTA_JV_API_L2CAP_SERVER*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER));
  p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_EVT;
  p_msg->type = conn_type;
  p_msg->sec_mask = sec_mask;
  p_msg->role = role;
  p_msg->local_psm = local_psm;
  p_msg->rx_mtu = rx_mtu;
  if (cfg != NULL) {
    p_msg->has_cfg = true;
    p_msg->cfg = *cfg;
  } else {
    p_msg->has_cfg = false;
  }
  if (ertm_info != NULL) {
    p_msg->has_ertm_info = true;
    p_msg->ertm_info = *ertm_info;
  } else {
    p_msg->has_ertm_info = false;
  }
  p_msg->p_cback = p_cback;
  p_msg->l2cap_socket_id = l2cap_socket_id;
  std::unique_ptr<tL2CAP_CFG_INFO> cfg_copy;
  if (cfg) cfg_copy = std::make_unique<tL2CAP_CFG_INFO>(*cfg);

  bta_sys_sendmsg(p_msg);
  std::unique_ptr<tL2CAP_ERTM_INFO> ertm_info_copy;
  if (ertm_info)
    ertm_info_copy = std::make_unique<tL2CAP_ERTM_INFO>(*ertm_info);

  do_in_bta_thread(
      FROM_HERE, Bind(&bta_jv_l2cap_start_server, conn_type, sec_mask, role,
                      local_psm, rx_mtu, base::Passed(&cfg_copy),
                      base::Passed(&ertm_info_copy), p_cback, l2cap_socket_id));
  return BTA_JV_SUCCESS;
}

+5 −2
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@
enum {
  /* these events are handled by the state machine */
  BTA_JV_API_START_DISCOVERY_EVT = BTA_SYS_EVT_START(BTA_ID_JV),
  BTA_JV_API_L2CAP_START_SERVER_EVT,
  BTA_JV_API_L2CAP_STOP_SERVER_EVT,
  BTA_JV_API_L2CAP_READ_EVT,
  BTA_JV_API_L2CAP_WRITE_EVT,
@@ -318,7 +317,11 @@ extern void bta_jv_l2cap_connect(int32_t type, tBTA_SEC sec_mask,
                                 tBTA_JV_L2CAP_CBACK* p_cback,
                                 uint32_t l2cap_socket_id);
extern void bta_jv_l2cap_close(uint32_t handle, tBTA_JV_L2C_CB* p_cb);
extern void bta_jv_l2cap_start_server(tBTA_JV_MSG* p_data);
extern void bta_jv_l2cap_start_server(
    int32_t type, tBTA_SEC sec_mask, tBTA_JV_ROLE role, uint16_t local_psm,
    uint16_t rx_mtu, std::unique_ptr<tL2CAP_CFG_INFO> cfg_param,
    std::unique_ptr<tL2CAP_ERTM_INFO> ertm_info, tBTA_JV_L2CAP_CBACK* p_cback,
    uint32_t l2cap_socket_id);
extern void bta_jv_l2cap_stop_server(tBTA_JV_MSG* p_data);
extern void bta_jv_l2cap_read(tBTA_JV_MSG* p_data);
extern void bta_jv_l2cap_write(tBTA_JV_MSG* p_data);
+0 −1
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ typedef void (*tBTA_JV_ACTION)(tBTA_JV_MSG* p_data);
/* action function list */
const tBTA_JV_ACTION bta_jv_action[] = {
    bta_jv_start_discovery,       /* BTA_JV_API_START_DISCOVERY_EVT */
    bta_jv_l2cap_start_server,    /* BTA_JV_API_L2CAP_START_SERVER_EVT */
    bta_jv_l2cap_stop_server,     /* BTA_JV_API_L2CAP_STOP_SERVER_EVT */
    bta_jv_l2cap_read,            /* BTA_JV_API_L2CAP_READ_EVT */
    bta_jv_l2cap_write,           /* BTA_JV_API_L2CAP_WRITE_EVT */