/******************************************************************************* ** ** Function llcp_util_parse_cc ** ** Description Parse CC PDU ** ** Returns tLLCP_STATUS ** *******************************************************************************/ tLLCP_STATUS llcp_util_parse_cc (UINT8 *p_bytes, UINT16 length, UINT16 *p_miu, UINT8 *p_rw) { UINT8 param_type, param_len, *p = p_bytes; *p_miu = LLCP_DEFAULT_MIU; *p_rw = LLCP_DEFAULT_RW; while (length) { BE_STREAM_TO_UINT8 (param_type, p); length--; switch (param_type) { case LLCP_MIUX_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT16 ((*p_miu), p); (*p_miu) &= LLCP_MIUX_MASK; (*p_miu) += LLCP_DEFAULT_MIU; LLCP_TRACE_DEBUG1 ("llcp_util_parse_cc (): LLCP_MIUX_TYPE:%d", *p_miu); break; case LLCP_RW_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT8 ((*p_rw), p); (*p_rw) &= 0x0F; LLCP_TRACE_DEBUG1 ("llcp_util_parse_cc (): LLCP_RW_TYPE:%d", *p_rw); break; default: LLCP_TRACE_ERROR1 ("llcp_util_parse_cc (): Unexpected type 0x%x", param_type); BE_STREAM_TO_UINT8 (param_len, p); p += param_len; break; } if (length >= param_len + 1) length -= param_len + 1; else { LLCP_TRACE_ERROR0 ("llcp_util_parse_cc (): Bad LTV's"); return LLCP_STATUS_FAIL; } } return LLCP_STATUS_SUCCESS; }
/******************************************************************************* ** ** Function llcp_process_timeout ** ** Description This function is called when an LLCP-related timeout occurs ** ** Returns void ** *******************************************************************************/ void llcp_process_timeout (TIMER_LIST_ENT *p_tle) { UINT8 reason; LLCP_TRACE_DEBUG1 ("llcp_process_timeout: event=%d", p_tle->event); switch (p_tle->event) { case NFC_TTYPE_LLCP_LINK_MANAGER: /* Link timeout or Symm timeout */ llcp_link_process_link_timeout (); break; case NFC_TTYPE_LLCP_LINK_INACT: /* inactivity timeout */ llcp_link_deactivate (LLCP_LINK_LOCAL_INITIATED); break; case NFC_TTYPE_LLCP_DATA_LINK: reason = LLCP_SAP_DISCONNECT_REASON_TIMEOUT; llcp_dlsm_execute ((tLLCP_DLCB *) (p_tle->param), LLCP_DLC_EVENT_TIMEOUT, &reason); break; case NFC_TTYPE_LLCP_DELAY_FIRST_PDU: llcp_link_check_send_data (); break; default: break; } }
/******************************************************************************* ** ** Function llcp_util_deallocate_data_link ** ** Description Deallocate tLLCP_DLCB ** ** Returns void ** ******************************************************************************/ void llcp_util_deallocate_data_link (tLLCP_DLCB *p_dlcb) { if (p_dlcb) { LLCP_TRACE_DEBUG1 ("llcp_util_deallocate_data_link (): local_sap = 0x%x", p_dlcb->local_sap); if (p_dlcb->state != LLCP_DLC_STATE_IDLE) { nfc_stop_quick_timer (&p_dlcb->timer); llcp_dlc_flush_q (p_dlcb); p_dlcb->state = LLCP_DLC_STATE_IDLE; if (llcp_cb.num_data_link_connection > 0) { llcp_cb.num_data_link_connection--; } LLCP_TRACE_DEBUG1 ("llcp_util_deallocate_data_link (): num_data_link_connection = %d", llcp_cb.num_data_link_connection); } } }
/******************************************************************************* ** ** Function llcp_util_parse_connect ** ** Description Parse CONNECT PDU ** ** Returns tLLCP_STATUS ** *******************************************************************************/ tLLCP_STATUS llcp_util_parse_connect (UINT8 *p_bytes, UINT16 length, tLLCP_CONNECTION_PARAMS *p_params) { UINT8 param_type, param_len, *p = p_bytes; p_params->miu = LLCP_DEFAULT_MIU; p_params->rw = LLCP_DEFAULT_RW; p_params->sn[0] = 0; while (length) { BE_STREAM_TO_UINT8 (param_type, p); length--; switch (param_type) { case LLCP_MIUX_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT16 (p_params->miu, p); p_params->miu &= LLCP_MIUX_MASK; p_params->miu += LLCP_DEFAULT_MIU; LLCP_TRACE_DEBUG1 ("llcp_util_parse_connect (): LLCP_MIUX_TYPE:%d", p_params->miu); break; case LLCP_RW_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT8 (p_params->rw, p); p_params->rw &= 0x0F; LLCP_TRACE_DEBUG1 ("llcp_util_parse_connect (): LLCP_RW_TYPE:%d", p_params->rw); break; case LLCP_SN_TYPE: BE_STREAM_TO_UINT8 (param_len, p); if (param_len <= LLCP_MAX_SN_LEN) { memcpy (p_params->sn, p, param_len); p_params->sn[param_len] = 0; } else { memcpy (p_params->sn, p, LLCP_MAX_SN_LEN); p_params->sn[LLCP_MAX_SN_LEN] = 0; } p += param_len; LLCP_TRACE_DEBUG1 ("llcp_util_parse_connect (): LLCP_SN_TYPE:<%s>", p_params->sn); break; default: LLCP_TRACE_ERROR1 ("llcp_util_parse_connect (): Unexpected type 0x%x", param_type); BE_STREAM_TO_UINT8 (param_len, p); p += param_len; break; } /* check remaining lengh */ if (length >= param_len + 1) { length -= param_len + 1; } else { LLCP_TRACE_ERROR0 ("llcp_util_parse_connect (): Bad LTV's"); return LLCP_STATUS_FAIL; } } return LLCP_STATUS_SUCCESS; }
/******************************************************************************* ** ** Function llcp_util_parse_link_params ** ** Description Parse LLCP Link parameters ** ** Returns TRUE if success ** *******************************************************************************/ BOOLEAN llcp_util_parse_link_params (UINT16 length, UINT8 *p_bytes) { UINT8 param_type, param_len, *p = p_bytes; while (length) { BE_STREAM_TO_UINT8 (param_type, p); length--; switch (param_type) { case LLCP_VERSION_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT8 (llcp_cb.lcb.peer_version, p); LLCP_TRACE_DEBUG1 ("Peer Version - 0x%02X", llcp_cb.lcb.peer_version); break; case LLCP_MIUX_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT16 (llcp_cb.lcb.peer_miu, p); llcp_cb.lcb.peer_miu &= LLCP_MIUX_MASK; llcp_cb.lcb.peer_miu += LLCP_DEFAULT_MIU; LLCP_TRACE_DEBUG1 ("Peer MIU - %d bytes", llcp_cb.lcb.peer_miu); break; case LLCP_WKS_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT16 (llcp_cb.lcb.peer_wks, p); LLCP_TRACE_DEBUG1 ("Peer WKS - 0x%04X", llcp_cb.lcb.peer_wks); break; case LLCP_LTO_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT8 (llcp_cb.lcb.peer_lto, p); llcp_cb.lcb.peer_lto *= LLCP_LTO_UNIT; /* 10ms unit */ LLCP_TRACE_DEBUG1 ("Peer LTO - %d ms", llcp_cb.lcb.peer_lto); break; case LLCP_OPT_TYPE: BE_STREAM_TO_UINT8 (param_len, p); BE_STREAM_TO_UINT8 (llcp_cb.lcb.peer_opt, p); LLCP_TRACE_DEBUG1 ("Peer OPT - 0x%02X", llcp_cb.lcb.peer_opt); break; default: LLCP_TRACE_ERROR1 ("llcp_util_parse_link_params (): Unexpected type 0x%x", param_type); BE_STREAM_TO_UINT8 (param_len, p); p += param_len; break; } if (length >= param_len + 1) length -= param_len + 1; else { LLCP_TRACE_ERROR0 ("llcp_util_parse_link_params (): Bad LTV's"); return (FALSE); } } return (TRUE); }