/******************************************************************************* ** ** Function rfc_port_sm_sabme_wait_ua ** ** Description This function handles events when SABME on the DLC was ** sent and SM is waiting for UA or DM. ** ** Returns void ** *******************************************************************************/ void rfc_port_sm_sabme_wait_ua (tPORT *p_port, UINT16 event, void *p_data) { switch (event) { case RFC_EVENT_OPEN: case RFC_EVENT_ESTABLISH_RSP: RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event); return; case RFC_EVENT_CLOSE: rfc_port_timer_start (p_port, RFC_DISC_TIMEOUT); rfc_send_disc (p_port->rfc.p_mcb, p_port->dlci); p_port->rfc.expected_rsp = 0; p_port->rfc.state = RFC_STATE_DISC_WAIT_UA; return; case RFC_EVENT_CLEAR: rfc_port_closed (p_port); return; case RFC_EVENT_DATA: GKI_freebuf (p_data); break; case RFC_EVENT_UA: rfc_port_timer_stop (p_port); p_port->rfc.state = RFC_STATE_OPENED; PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_SUCCESS); return; case RFC_EVENT_DM: p_port->rfc.p_mcb->is_disc_initiator = TRUE; PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR); rfc_port_closed (p_port); return; case RFC_EVENT_DISC: rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci); PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR); rfc_port_closed (p_port); return; case RFC_EVENT_SABME: /* Continue to wait for the UA the SABME this side sent */ rfc_send_ua (p_port->rfc.p_mcb, p_port->dlci); return; case RFC_EVENT_UIH: GKI_freebuf (p_data); return; case RFC_EVENT_TIMEOUT: p_port->rfc.state = RFC_STATE_CLOSED; PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR); return; } RFCOMM_TRACE_WARNING ("Port state sabme_wait_ua Event ignored %d", event); }
/******************************************************************************* ** ** Function RFCOMM_DlcEstablishReq ** ** Description This function is called by the user app to establish ** connection with the specific dlci on a specific bd device. ** It will allocate RFCOMM connection control block if not ** allocated before and dispatch open event to the state ** machine. ** *******************************************************************************/ void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) { tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); if (p_mcb->state != RFC_MX_STATE_CONNECTED) { PORT_DlcEstablishCnf (p_mcb, dlci, 0, RFCOMM_ERROR); return; } rfc_port_sm_execute(p_port, RFC_EVENT_OPEN, NULL); }
/******************************************************************************* ** ** Function RFCOMM_DlcEstablishReq ** ** Description This function is called by the user app to establish ** connection with the specific dlci on a specific bd device. ** It will allocate RFCOMM connection control block if not ** allocated before and dispatch open event to the state ** machine. ** *******************************************************************************/ void RFCOMM_DlcEstablishReq (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) { UNUSED(mtu); if (p_mcb->state != RFC_MX_STATE_CONNECTED) { PORT_DlcEstablishCnf (p_mcb, dlci, 0, RFCOMM_ERROR); return; } tPORT *p_port = port_find_mcb_dlci_port(p_mcb, dlci); if (p_port == NULL) { RFCOMM_TRACE_WARNING("%s Unable to find DLCI port dlci:%d", __func__, dlci); return; } rfc_port_sm_execute(p_port, RFC_EVENT_OPEN, NULL); }
/******************************************************************************* ** ** Function rfc_port_sm_orig_wait_sec_check ** ** Description This function handles events for the port in the ** ORIG_WAIT_SEC_CHECK state. RFCOMM is waiting for Security ** manager to finish before sending SABME to the peer ** ** Returns void ** *******************************************************************************/ void rfc_port_sm_orig_wait_sec_check (tPORT *p_port, UINT16 event, void *p_data) { switch (event) { case RFC_EVENT_SEC_COMPLETE: if (*((UINT8 *)p_data) != BTM_SUCCESS) { p_port->rfc.p_mcb->is_disc_initiator = TRUE; PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, 0, RFCOMM_SECURITY_ERR); rfc_port_closed (p_port); return; } rfc_send_sabme (p_port->rfc.p_mcb, p_port->dlci); rfc_port_timer_start (p_port, RFC_PORT_T1_TIMEOUT); p_port->rfc.state = RFC_STATE_SABME_WAIT_UA; return; case RFC_EVENT_OPEN: case RFC_EVENT_SABME: /* Peer should not use the same dlci */ RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event); return; case RFC_EVENT_CLOSE: btm_sec_abort_access_req (p_port->rfc.p_mcb->bd_addr); rfc_port_closed (p_port); return; case RFC_EVENT_DATA: RFCOMM_TRACE_ERROR ("Port error state Orig Wait Sec event Data"); GKI_freebuf (p_data); return; case RFC_EVENT_UIH: GKI_freebuf (p_data); return; } RFCOMM_TRACE_WARNING ("Port state orig_wait_sec_check Event ignored %d", event); }