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

Commit 1874d5da authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Use Bind in BTA_JvL2capConnect

Bug: 68359837
Test: compilation test
Change-Id: I0d6efdfefa12551c615bee5dd43a3101a5cac3d2
parent 6459955f
Loading
Loading
Loading
Loading
+25 −35
Original line number Diff line number Diff line
@@ -922,59 +922,48 @@ static void bta_jv_l2cap_client_cback(uint16_t gap_handle, uint16_t event) {
  }
}

/*******************************************************************************
 *
 * Function     bta_jv_l2cap_connect
 *
 * Description  makes an l2cap client connection
 *
 * Returns      void
 *
 ******************************************************************************/
void bta_jv_l2cap_connect(tBTA_JV_MSG* p_data) {
  tBTA_JV_L2C_CB* p_cb;
  tBTA_JV_L2CAP_CL_INIT evt_data;
/* makes an l2cap client connection */
void bta_jv_l2cap_connect(int32_t type, tBTA_SEC sec_mask, tBTA_JV_ROLE role,
                          uint16_t remote_psm, uint16_t rx_mtu,
                          const RawAddress& peer_bd_addr,
                          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 = GAP_INVALID_HANDLE;
  uint8_t sec_id;
  tL2CAP_CFG_INFO cfg;
  tBTA_JV_API_L2CAP_CONNECT* cc = &(p_data->l2cap_connect);
  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 (cc->has_cfg) {
    cfg = cc->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 (cc->has_ertm_info) {
    ertm_info = &(cc->ertm_info);
  }

  /* We need to use this value for MTU to be able to handle cases where cfg is
   * not set in req. */
  cfg.mtu_present = true;
  cfg.mtu = cc->rx_mtu;
  cfg.mtu = rx_mtu;

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

  sec_id = bta_jv_alloc_sec_id();
  uint8_t sec_id = bta_jv_alloc_sec_id();
  tBTA_JV_L2CAP_CL_INIT evt_data;
  evt_data.sec_id = sec_id;
  evt_data.status = BTA_JV_FAILURE;

  if (sec_id) {
    /* PSM checking is not required for LE COC */
    if ((cc->type != BTA_JV_CONN_TYPE_L2CAP) ||
        (bta_jv_check_psm(cc->remote_psm))) /* allowed */
    if ((type != BTA_JV_CONN_TYPE_L2CAP) ||
        (bta_jv_check_psm(remote_psm))) /* allowed */
    {
      handle = GAP_ConnOpen("", sec_id, 0, &cc->peer_bd_addr, cc->remote_psm,
                            &cfg, ertm_info, cc->sec_mask, chan_mode_mask,
                            bta_jv_l2cap_client_cback, cc->type);
      handle = GAP_ConnOpen("", sec_id, 0, &peer_bd_addr, remote_psm, &cfg,
                            ertm_info.get(), sec_mask, chan_mode_mask,
                            bta_jv_l2cap_client_cback, type);
      if (handle != GAP_INVALID_HANDLE) {
        evt_data.status = BTA_JV_SUCCESS;
      }
@@ -982,10 +971,11 @@ void bta_jv_l2cap_connect(tBTA_JV_MSG* p_data) {
  }

  if (evt_data.status == BTA_JV_SUCCESS) {
    tBTA_JV_L2C_CB* p_cb;
    p_cb = &bta_jv_cb.l2c_cb[handle];
    p_cb->handle = handle;
    p_cb->p_cback = cc->p_cback;
    p_cb->l2cap_socket_id = cc->l2cap_socket_id;
    p_cb->p_cback = p_cback;
    p_cb->l2cap_socket_id = l2cap_socket_id;
    p_cb->psm = 0; /* not a server */
    p_cb->sec_id = sec_id;
    p_cb->state = BTA_JV_ST_CL_OPENING;
@@ -994,10 +984,10 @@ void bta_jv_l2cap_connect(tBTA_JV_MSG* p_data) {
  }

  evt_data.handle = handle;
  if (cc->p_cback) {
  if (p_cback) {
    tBTA_JV bta_jv;
    bta_jv.l2c_cl_init = evt_data;
    cc->p_cback(BTA_JV_L2CAP_CL_INIT_EVT, &bta_jv, cc->l2cap_socket_id);
    p_cback(BTA_JV_L2CAP_CL_INIT_EVT, &bta_jv, l2cap_socket_id);
  }
}

+11 −25
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
 *
 ******************************************************************************/
#include <base/bind.h>
#include <base/bind_helpers.h>
#include <string.h>

#include "bt_common.h"
@@ -296,34 +297,19 @@ tBTA_JV_STATUS BTA_JvL2capConnect(
    tBTA_JV_L2CAP_CBACK* p_cback, 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_CONNECT* p_msg =
      (tBTA_JV_API_L2CAP_CONNECT*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CONNECT));
  p_msg->hdr.event = BTA_JV_API_L2CAP_CONNECT_EVT;
  p_msg->type = conn_type;
  p_msg->sec_mask = sec_mask;
  p_msg->role = role;
  p_msg->remote_psm = remote_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->peer_bd_addr = peer_bd_addr;
  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_connect, conn_type, sec_mask, role,
                      remote_psm, rx_mtu, peer_bd_addr, base::Passed(&cfg_copy),
                      base::Passed(&ertm_info_copy), p_cback, l2cap_socket_id));
  return BTA_JV_SUCCESS;
}

+10 −24
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@
#include "port_api.h"
#include "rfcdefs.h"

#include <memory>

/*****************************************************************************
 *  Constants
 ****************************************************************************/
@@ -37,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_CONNECT_EVT,
  BTA_JV_API_L2CAP_CLOSE_EVT,
  BTA_JV_API_L2CAP_START_SERVER_EVT,
  BTA_JV_API_L2CAP_STOP_SERVER_EVT,
@@ -138,27 +139,6 @@ typedef struct {
  int curr_sess;          /* current sessions count*/
} tBTA_JV_RFC_CB;

/* data type for BTA_JV_API_L2CAP_CONNECT_EVT
 */
typedef struct {
  BT_HDR hdr;
  int32_t type; /* One of BTA_JV_CONN_TYPE_ */
  tBTA_SEC sec_mask;
  tBTA_JV_ROLE role;
  union {
    uint16_t remote_psm;
    uint16_t remote_chan;
  };
  uint16_t rx_mtu;
  RawAddress peer_bd_addr;
  int32_t has_cfg;
  tL2CAP_CFG_INFO cfg;
  int32_t has_ertm_info;
  tL2CAP_ERTM_INFO ertm_info;
  tBTA_JV_L2CAP_CBACK* p_cback;
  uint32_t l2cap_socket_id;
} tBTA_JV_API_L2CAP_CONNECT;

/* data type for BTA_JV_API_L2CAP_SERVER_EVT */
typedef struct {
  BT_HDR hdr;
@@ -282,7 +262,6 @@ typedef union {
  /* GKI event buffer header */
  BT_HDR hdr;
  tBTA_JV_API_START_DISCOVERY start_discovery;
  tBTA_JV_API_L2CAP_CONNECT l2cap_connect;
  tBTA_JV_API_L2CAP_READ l2cap_read;
  tBTA_JV_API_L2CAP_WRITE l2cap_write;
  tBTA_JV_API_L2CAP_CLOSE l2cap_close;
@@ -340,7 +319,14 @@ extern void bta_jv_free_scn(int32_t type, uint16_t scn);
extern void bta_jv_start_discovery(tBTA_JV_MSG* p_data);
extern void bta_jv_create_record(uint32_t rfcomm_slot_id);
extern void bta_jv_delete_record(uint32_t handle);
extern void bta_jv_l2cap_connect(tBTA_JV_MSG* p_data);
extern void bta_jv_l2cap_connect(int32_t type, tBTA_SEC sec_mask,
                                 tBTA_JV_ROLE role, uint16_t remote_psm,
                                 uint16_t rx_mtu,
                                 const RawAddress& peer_bd_addr,
                                 std::unique_ptr<tL2CAP_CFG_INFO> cfg,
                                 std::unique_ptr<tL2CAP_ERTM_INFO> ertm_info,
                                 tBTA_JV_L2CAP_CBACK* p_cback,
                                 uint32_t l2cap_socket_id);
extern void bta_jv_l2cap_close(tBTA_JV_MSG* p_data);
extern void bta_jv_l2cap_start_server(tBTA_JV_MSG* p_data);
extern void bta_jv_l2cap_stop_server(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_connect,         /* BTA_JV_API_L2CAP_CONNECT_EVT */
    bta_jv_l2cap_close,           /* BTA_JV_API_L2CAP_CLOSE_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 */