#include "btu.h"
+
+extern fixed_queue_t *btu_general_alarm_queue;
+
/*****************************************************************************
** constants
*****************************************************************************/
void mca_ccb_free_msg(tMCA_CCB *p_ccb, tMCA_CCB_EVT *p_data)
{
UNUSED(p_ccb);
-
- osi_freebuf (p_data);
+ osi_free(p_data);
}
/*******************************************************************************
void mca_ccb_snd_req(tMCA_CCB *p_ccb, tMCA_CCB_EVT *p_data)
{
tMCA_CCB_MSG *p_msg = (tMCA_CCB_MSG *)p_data;
- BT_HDR *p_pkt;
UINT8 *p, *p_start;
BOOLEAN is_abort = FALSE;
tMCA_DCB *p_dcb;
* Get the mdl_id in dcb to compose the request */
p_msg->mdl_id = p_dcb->mdl_id;
mca_dcb_event(p_dcb, MCA_DCB_API_CLOSE_EVT, NULL);
- mca_free_buf ((void **)&p_ccb->p_tx_req);
+ osi_free_and_reset((void **)&p_ccb->p_tx_req);
p_ccb->status = MCA_CCB_STAT_NORM;
is_abort = TRUE;
}
p_ccb->p_tx_req = p_msg;
if (!p_ccb->cong)
{
- p_pkt = (BT_HDR *)osi_getbuf (MCA_CTRL_MTU);
- if (p_pkt)
- {
- p_pkt->offset = L2CAP_MIN_OFFSET;
- p = p_start = (UINT8*)(p_pkt + 1) + L2CAP_MIN_OFFSET;
- *p++ = p_msg->op_code;
- UINT16_TO_BE_STREAM (p, p_msg->mdl_id);
- if (p_msg->op_code == MCA_OP_MDL_CREATE_REQ)
- {
- *p++ = p_msg->mdep_id;
- *p++ = p_msg->param;
- }
- p_msg->hdr.layer_specific = TRUE; /* mark this message as sent */
- p_pkt->len = p - p_start;
- L2CA_DataWrite (p_ccb->lcid, p_pkt);
- p_ccb->timer_entry.param = (timer_param_t)p_ccb;
- btu_start_timer(&p_ccb->timer_entry, BTU_TTYPE_MCA_CCB_RSP, p_ccb->p_rcb->reg.rsp_tout);
+ BT_HDR *p_pkt = (BT_HDR *)osi_malloc(MCA_CTRL_MTU);
+
+ p_pkt->offset = L2CAP_MIN_OFFSET;
+ p = p_start = (UINT8*)(p_pkt + 1) + L2CAP_MIN_OFFSET;
+ *p++ = p_msg->op_code;
+ UINT16_TO_BE_STREAM (p, p_msg->mdl_id);
+ if (p_msg->op_code == MCA_OP_MDL_CREATE_REQ) {
+ *p++ = p_msg->mdep_id;
+ *p++ = p_msg->param;
}
+ p_msg->hdr.layer_specific = TRUE; /* mark this message as sent */
+ p_pkt->len = p - p_start;
+ L2CA_DataWrite (p_ccb->lcid, p_pkt);
+ period_ms_t interval_ms = p_ccb->p_rcb->reg.rsp_tout * 1000;
+ alarm_set_on_queue(p_ccb->mca_ccb_timer, interval_ms,
+ mca_ccb_timer_timeout, p_ccb,
+ btu_general_alarm_queue);
}
/* else the L2CAP channel is congested. keep the message to be sent later */
}
else
{
MCA_TRACE_WARNING ("dropping api req");
- osi_freebuf (p_data);
+ osi_free(p_data);
}
}
void mca_ccb_snd_rsp(tMCA_CCB *p_ccb, tMCA_CCB_EVT *p_data)
{
tMCA_CCB_MSG *p_msg = (tMCA_CCB_MSG *)p_data;
- BT_HDR *p_pkt;
UINT8 *p, *p_start;
BOOLEAN chk_mdl = FALSE;
+ BT_HDR *p_pkt = (BT_HDR *)osi_malloc(MCA_CTRL_MTU);
- MCA_TRACE_DEBUG ("mca_ccb_snd_rsp cong=%d req=%d", p_ccb->cong, p_msg->op_code);
+ MCA_TRACE_DEBUG("%s cong=%d req=%d", __func__, p_ccb->cong, p_msg->op_code);
/* assume that API functions verified the parameters */
- p_pkt = (BT_HDR *)osi_getbuf (MCA_CTRL_MTU);
- if (p_pkt)
- {
- p_pkt->offset = L2CAP_MIN_OFFSET;
- p = p_start = (UINT8*)(p_pkt + 1) + L2CAP_MIN_OFFSET;
- *p++ = p_msg->op_code;
- *p++ = p_msg->rsp_code;
- UINT16_TO_BE_STREAM (p, p_msg->mdl_id);
- if (p_msg->op_code == MCA_OP_MDL_CREATE_RSP)
- {
- *p++ = p_msg->param;
- chk_mdl = TRUE;
- }
- else if (p_msg->op_code == MCA_OP_MDL_RECONNECT_RSP)
- chk_mdl = TRUE;
- if (chk_mdl && p_msg->rsp_code == MCA_RSP_SUCCESS)
- {
- mca_dcb_by_hdl(p_msg->dcb_idx);
- BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_MCAP_DATA, p_ccb->sec_mask,
- p_ccb->p_rcb->reg.data_psm, BTM_SEC_PROTO_MCA, p_msg->dcb_idx);
- p_ccb->status = MCA_CCB_STAT_PENDING;
- /* set p_tx_req to block API_REQ/API_RSP before DL is up */
- mca_free_buf ((void **)&p_ccb->p_tx_req);
- p_ccb->p_tx_req = p_ccb->p_rx_msg;
- p_ccb->p_rx_msg = NULL;
- p_ccb->p_tx_req->dcb_idx = p_msg->dcb_idx;
- }
- mca_free_buf ((void **)&p_ccb->p_rx_msg);
- p_pkt->len = p - p_start;
- L2CA_DataWrite (p_ccb->lcid, p_pkt);
+ p_pkt->offset = L2CAP_MIN_OFFSET;
+ p = p_start = (UINT8*)(p_pkt + 1) + L2CAP_MIN_OFFSET;
+ *p++ = p_msg->op_code;
+ *p++ = p_msg->rsp_code;
+ UINT16_TO_BE_STREAM (p, p_msg->mdl_id);
+ if (p_msg->op_code == MCA_OP_MDL_CREATE_RSP) {
+ *p++ = p_msg->param;
+ chk_mdl = TRUE;
+ }
+ else if (p_msg->op_code == MCA_OP_MDL_RECONNECT_RSP) {
+ chk_mdl = TRUE;
}
+ if (chk_mdl && p_msg->rsp_code == MCA_RSP_SUCCESS) {
+ mca_dcb_by_hdl(p_msg->dcb_idx);
+ BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_MCAP_DATA,
+ p_ccb->sec_mask,
+ p_ccb->p_rcb->reg.data_psm, BTM_SEC_PROTO_MCA,
+ p_msg->dcb_idx);
+ p_ccb->status = MCA_CCB_STAT_PENDING;
+ /* set p_tx_req to block API_REQ/API_RSP before DL is up */
+ osi_free_and_reset((void **)&p_ccb->p_tx_req);
+ p_ccb->p_tx_req = p_ccb->p_rx_msg;
+ p_ccb->p_rx_msg = NULL;
+ p_ccb->p_tx_req->dcb_idx = p_msg->dcb_idx;
+ }
+ osi_free_and_reset((void **)&p_ccb->p_rx_msg);
+ p_pkt->len = p - p_start;
+ L2CA_DataWrite(p_ccb->lcid, p_pkt);
}
/*******************************************************************************
void mca_ccb_hdl_req(tMCA_CCB *p_ccb, tMCA_CCB_EVT *p_data)
{
BT_HDR *p_pkt = &p_data->hdr;
- BT_HDR *p_buf;
UINT8 *p, *p_start;
tMCA_DCB *p_dcb;
tMCA_CTRL evt_data;
p_ccb->status = MCA_CCB_STAT_NORM;
if (p_ccb->p_tx_req && ((p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx))!= NULL))
{
- mca_dcb_dealloc (p_dcb, NULL);
- mca_free_buf ((void **)&p_ccb->p_tx_req);
+ mca_dcb_dealloc(p_dcb, NULL);
+ osi_free_and_reset((void **)&p_ccb->p_tx_req);
}
}
else
{
mca_dcb_dealloc(p_dcb, NULL);
}
- mca_free_buf ((void **)&p_ccb->p_tx_req);
+ osi_free_and_reset((void **)&p_ccb->p_tx_req);
mca_stop_timer(p_ccb);
}
else
{
/* local is initiator, ignore the req */
- osi_freebuf (p_pkt);
+ osi_free(p_pkt);
return;
}
}
}
if (((reject_code != MCA_RSP_SUCCESS) && (evt_data.hdr.op_code != MCA_OP_SYNC_INFO_IND))
- || send_rsp)
- {
- p_buf = (BT_HDR *)osi_getbuf (MCA_CTRL_MTU);
- if (p_buf)
- {
- p_buf->offset = L2CAP_MIN_OFFSET;
- p = p_start = (UINT8*)(p_buf + 1) + L2CAP_MIN_OFFSET;
- *p++ = reject_opcode;
- *p++ = reject_code;
- UINT16_TO_BE_STREAM (p, evt_data.hdr.mdl_id);
- /*
- if (((*p_start) == MCA_OP_MDL_CREATE_RSP) && (reject_code == MCA_RSP_SUCCESS))
- {
- *p++ = evt_data.create_ind.cfg;
- }
- */
-
- p_buf->len = p - p_start;
- L2CA_DataWrite (p_ccb->lcid, p_buf);
- }
+ || send_rsp) {
+ BT_HDR *p_buf = (BT_HDR *)osi_malloc(MCA_CTRL_MTU);
+ p_buf->offset = L2CAP_MIN_OFFSET;
+ p = p_start = (UINT8*)(p_buf + 1) + L2CAP_MIN_OFFSET;
+ *p++ = reject_opcode;
+ *p++ = reject_code;
+ UINT16_TO_BE_STREAM(p, evt_data.hdr.mdl_id);
+ /*
+ if (((*p_start) == MCA_OP_MDL_CREATE_RSP) && (reject_code == MCA_RSP_SUCCESS))
+ {
+ *p++ = evt_data.create_ind.cfg;
+ }
+ */
+
+ p_buf->len = p - p_start;
+ L2CA_DataWrite (p_ccb->lcid, p_buf);
}
if (reject_code == MCA_RSP_SUCCESS)
p_ccb->p_rx_msg = p_rx_msg;
if (send_rsp)
{
- osi_freebuf (p_pkt);
+ osi_free(p_pkt);
p_ccb->p_rx_msg = NULL;
}
mca_ccb_report_event(p_ccb, evt_data.hdr.op_code, &evt_data);
}
else
- osi_freebuf (p_pkt);
+ osi_free(p_pkt);
}
/*******************************************************************************
} /* end of chk_mdl */
if (p_ccb->status != MCA_CCB_STAT_PENDING)
- mca_free_buf ((void **)&p_ccb->p_tx_req);
+ osi_free_and_reset((void **)&p_ccb->p_tx_req);
mca_ccb_report_event(p_ccb, evt_data.hdr.op_code, &evt_data);
}
/* else a bad response is received */
/* not expecting any response. drop it */
MCA_TRACE_WARNING ("dropping received rsp (not expecting a response)");
}
- osi_freebuf (p_data);
+ osi_free(p_data);
}
/*******************************************************************************
{
UNUSED(p_data);
- mca_free_buf ((void **)&p_ccb->p_tx_req);
- mca_free_buf ((void **)&p_ccb->p_rx_msg);
+ osi_free_and_reset((void **)&p_ccb->p_tx_req);
+ osi_free_and_reset((void **)&p_ccb->p_rx_msg);
p_ccb->status = MCA_CCB_STAT_NORM;
}