blob: b71fca447d81260817049297acddd1adc23b8f48 [file] [log] [blame]
/******************************************************************************
*
* Copyright (C) 2010-2014 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
/******************************************************************************
*
* This file contains the LLCP API definitions
*
******************************************************************************/
#ifndef LLCP_API_H
#define LLCP_API_H
#include <string>
#include "llcp_defs.h"
#include "nfc_target.h"
/*****************************************************************************
** Constants
*****************************************************************************/
/* Successfully done */
#define LLCP_STATUS_SUCCESS 0
/* Failed without specific reason */
#define LLCP_STATUS_FAIL 1
/* Data link is congested */
#define LLCP_STATUS_CONGESTED 2
typedef uint8_t tLLCP_STATUS;
#define LLCP_MIN_OFFSET \
(NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + LLCP_PDU_HEADER_SIZE + \
LLCP_SEQUENCE_SIZE)
/* indication of failure to allocate data link resource */
#define LLCP_INVALID_SAP 0xFF
/*****************************************************************************
** Type Definitions
*****************************************************************************/
typedef struct {
bool is_initiator; /* TRUE if we are POLL mode */
uint8_t max_payload_size; /* 64, 128, 192 or 254 */
uint8_t waiting_time;
uint8_t* p_gen_bytes;
uint8_t gen_bytes_len;
} tLLCP_ACTIVATE_CONFIG;
typedef struct {
uint16_t miu; /* Local receiving MIU */
uint8_t rw; /* Local receiving window */
char sn[LLCP_MAX_SN_LEN + 1]; /* Service name to connect */
} tLLCP_CONNECTION_PARAMS;
/*********************************
** Callback Functions Prototypes
**********************************/
/* Link Management Callback Events */
/* Fail to activate link */
#define LLCP_LINK_ACTIVATION_FAILED_EVT 0x00
/* LLCP Link is activated */
#define LLCP_LINK_ACTIVATION_COMPLETE_EVT 0x01
/* LLCP Link is deactivated */
#define LLCP_LINK_DEACTIVATED_EVT 0x02
/* First LLCP packet received from remote */
#define LLCP_LINK_FIRST_PACKET_RECEIVED_EVT 0x03
/* Link Management Callback Reasons */
/* Success */
#define LLCP_LINK_SUCCESS 0x00
/* Failed to agree version */
#define LLCP_LINK_VERSION_FAILED 0x01
/* Failed to parse received general bytes */
#define LLCP_LINK_BAD_GEN_BYTES 0x02
/* Link has been deactivated by local */
#define LLCP_LINK_LOCAL_INITIATED 0x04
/* Link has been deactivated by remote */
#define LLCP_LINK_REMOTE_INITIATED 0x05
/* Link has been deactivated by timeout */
#define LLCP_LINK_TIMEOUT 0x06
/* Link has been deactivated by frame error */
#define LLCP_LINK_FRAME_ERROR 0x07
/* RF link loss without any rx LLC PDU */
#define LLCP_LINK_RF_LINK_LOSS_NO_RX_LLC 0x08
#define LLCP_LINK_RF_LINK_LOSS_ERR NFC_STATUS_LINK_LOSS
typedef void(tLLCP_LINK_CBACK)(uint8_t event, uint8_t reason);
/* Minimum length of Gen Bytes for LLCP */
/* In CE4 low power mode, NFCC can store up to 21 bytes */
#define LLCP_MIN_GEN_BYTES 20
/* Service Access Point (SAP) Callback Events */
/* Received data on SAP */
#define LLCP_SAP_EVT_DATA_IND 0x00
/* Connection request from peer */
#define LLCP_SAP_EVT_CONNECT_IND 0x01
/* Connection accepted by peer */
#define LLCP_SAP_EVT_CONNECT_RESP 0x02
/* Received disconnect request */
#define LLCP_SAP_EVT_DISCONNECT_IND 0x03
/* Received disconnect response */
#define LLCP_SAP_EVT_DISCONNECT_RESP 0x04
/* congested status is changed */
#define LLCP_SAP_EVT_CONGEST 0x05
/* Change of LLCP Link status */
#define LLCP_SAP_EVT_LINK_STATUS 0x06
/* tx queue is empty and all PDU is acked */
#define LLCP_SAP_EVT_TX_COMPLETE 0x07
#define LLCP_LINK_TYPE_LOGICAL_DATA_LINK 0x01
#define LLCP_LINK_TYPE_DATA_LINK_CONNECTION 0x02
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_DATA_IND */
uint8_t local_sap; /* SAP of local device */
uint8_t remote_sap; /* SAP of remote device */
uint8_t link_type; /* link type */
} tLLCP_SAP_DATA_IND;
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_CONNECT_IND */
uint8_t server_sap; /* SAP of local server */
uint8_t local_sap; /* SAP of local device */
uint8_t remote_sap; /* SAP of remote device */
uint16_t miu; /* MIU of peer device */
uint8_t rw; /* RW of peer device */
char* p_service_name; /* Service name (only for SDP) */
} tLLCP_SAP_CONNECT_IND;
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_CONNECT_RESP */
uint8_t local_sap; /* SAP of local device */
uint8_t remote_sap; /* SAP of remote device */
uint16_t miu; /* MIU of peer device */
uint8_t rw; /* RW of peer device */
} tLLCP_SAP_CONNECT_RESP;
#define LLCP_SAP_DISCONNECT_REASON_TIMEOUT 0x80
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_DISCONNECT_IND */
uint8_t local_sap; /* SAP of local device */
uint8_t remote_sap; /* SAP of remote device */
} tLLCP_SAP_DISCONNECT_IND;
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_DISCONNECT_RESP */
uint8_t local_sap; /* SAP of local device */
uint8_t remote_sap; /* SAP of remote device */
uint8_t reason; /* Reason of DM PDU if not timeout */
} tLLCP_SAP_DISCONNECT_RESP;
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_CONGEST */
uint8_t local_sap; /* SAP of local device */
uint8_t remote_sap; /* SAP of remote device */
bool is_congested; /* TRUE if congested */
uint8_t link_type; /* congested link type */
} tLLCP_SAP_CONGEST;
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_LINK_STATUS */
uint8_t local_sap; /* SAP of local device */
bool is_activated; /* TRUE if LLCP link is activated */
bool is_initiator; /* TRUE if local LLCP is initiator */
} tLLCP_SAP_LINK_STATUS;
typedef struct {
uint8_t event; /* LLCP_SAP_EVT_TX_COMPLETE */
uint8_t local_sap; /* SAP of local device */
uint8_t remote_sap; /* SAP of remote device */
} tLLCP_SAP_TX_COMPLETE;
typedef struct {
uint8_t event; /* event */
uint8_t local_sap; /* SAP of local device */
} tLLCP_SAP_HEADER;
typedef union {
tLLCP_SAP_HEADER hdr; /* common header */
tLLCP_SAP_DATA_IND data_ind; /* LLCP_SAP_EVT_DATA_IND */
tLLCP_SAP_CONNECT_IND connect_ind; /* LLCP_SAP_EVT_CONNECT_IND */
tLLCP_SAP_CONNECT_RESP connect_resp; /* LLCP_SAP_EVT_CONNECT_RESP */
tLLCP_SAP_DISCONNECT_IND disconnect_ind; /* LLCP_SAP_EVT_DISCONNECT_IND */
tLLCP_SAP_DISCONNECT_RESP disconnect_resp; /* LLCP_SAP_EVT_DISCONNECT_RESP */
tLLCP_SAP_CONGEST congest; /* LLCP_SAP_EVT_CONGEST */
tLLCP_SAP_LINK_STATUS link_status; /* LLCP_SAP_EVT_LINK_STATUS */
tLLCP_SAP_TX_COMPLETE tx_complete; /* LLCP_SAP_EVT_TX_COMPLETE */
} tLLCP_SAP_CBACK_DATA;
typedef void(tLLCP_APP_CBACK)(tLLCP_SAP_CBACK_DATA* p_data);
/* Service Discovery Callback */
typedef void(tLLCP_SDP_CBACK)(uint8_t tid, uint8_t remote_sap);
/* LLCP DTA Callback - notify DTA responded SNL for connectionless echo service
*/
typedef void(tLLCP_DTA_CBACK)(void);
/*****************************************************************************
** External Function Declarations
*****************************************************************************/
/*******************************************************************************
**
** Function LLCP_SetConfig
**
** Description Set configuration parameters for LLCP
** - Local Link MIU
** - Option parameter
** - Waiting Time Index
** - Local Link Timeout
** - Inactivity Timeout as initiator role
** - Inactivity Timeout as target role
** - Delay SYMM response
** - Data link connection timeout
** - Delay timeout to send first PDU as initiator
**
** Returns void
**
*******************************************************************************/
extern void LLCP_SetConfig(uint16_t link_miu, uint8_t opt, uint8_t wt,
uint16_t link_timeout, uint16_t inact_timeout_init,
uint16_t inact_timeout_target, uint16_t symm_delay,
uint16_t data_link_timeout,
uint16_t delay_first_pdu_timeout);
/*******************************************************************************
**
** Function LLCP_GetConfig
**
** Description Get configuration parameters for LLCP
** - Local Link MIU
** - Option parameter
** - Response Waiting Time Index
** - Local Link Timeout
** - Inactivity Timeout as initiator role
** - Inactivity Timeout as target role
** - Delay SYMM response
** - Data link connection timeout
** - Delay timeout to send first PDU as initiator
**
** Returns void
**
*******************************************************************************/
extern void LLCP_GetConfig(uint16_t* p_link_miu, uint8_t* p_opt, uint8_t* p_wt,
uint16_t* p_link_timeout,
uint16_t* p_inact_timeout_init,
uint16_t* p_inact_timeout_target,
uint16_t* p_symm_delay,
uint16_t* p_data_link_timeout,
uint16_t* p_delay_first_pdu_timeout);
/*******************************************************************************
**
** Function LLCP_GetDiscoveryConfig
**
** Description Returns discovery config for LLCP MAC link activation
** This function is called to get general bytes for
** NFC_PMID_ATR_REQ_GEN_BYTES or NFC_PMID_ATR_RES_GEN_BYTES
** before starting discovery.
**
** wt:Waiting time 0 - 8, only for listen
** p_gen_bytes: pointer to store LLCP magic number and
** paramters
** p_gen_bytes_len: length of buffer for gen bytes as input
** (NOTE:it must be bigger than
** LLCP_MIN_GEN_BYTES) actual gen bytes
** size as output
**
** Restrictions on the use of ISO 18092
** 1. The DID features shall not be used.
** 2. the NAD features shall not be used.
** 3. Frame waiting time extentions (WTX) shall not be used.
**
** Returns None
**
*******************************************************************************/
extern void LLCP_GetDiscoveryConfig(uint8_t* p_wt, uint8_t* p_gen_bytes,
uint8_t* p_gen_bytes_len);
/*******************************************************************************
**
** Function LLCP_ActivateLink
**
** Description This function will activate LLCP link with LR, WT and Gen
** Bytes in activation NTF from NFCC.
**
** LLCP_LINK_ACTIVATION_COMPLETE_EVT will be returned through
** callback function if successful.
** Otherwise, LLCP_LINK_ACTIVATION_FAILED_EVT will be returned.
**
** Returns LLCP_STATUS_SUCCESS if success
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_ActivateLink(tLLCP_ACTIVATE_CONFIG config,
tLLCP_LINK_CBACK* p_link_cback);
/*******************************************************************************
**
** Function LLCP_DeactivateLink
**
** Description Deactivate LLCP link
**
** LLCP_LINK_DEACTIVATED_EVT will be returned through callback
** when LLCP link is deactivated. Then NFC link may be
** deactivated.
**
** Returns LLCP_STATUS_SUCCESS if success
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_DeactivateLink(void);
/*******************************************************************************
**
** Function LLCP_RegisterServer
**
** Description Register server and callback function
**
** reg_sap : Well-Known SAP except LM and SDP (0x02 - 0x0F)
** Advertized by SDP (0x10 - 0x1F)
** LLCP_INVALID_SAP, LLCP will allocate between 0x10
** and 0x1F
** link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
** and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
** p_service_name : Null-terminated string up to
** LLCP_MAX_SN_LEN
**
** Returns SAP between 0x02 and 0x1F, if success
** LLCP_INVALID_SAP, otherwise
**
*******************************************************************************/
extern uint8_t LLCP_RegisterServer(uint8_t reg_sap, uint8_t link_type,
std::string p_service_name,
tLLCP_APP_CBACK* p_sap_cback);
/*******************************************************************************
**
** Function LLCP_RegisterClient
**
** Description Register client and callback function
**
** link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
** and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
**
** Returns SAP between 0x20 and 0x3F, if success
** LLCP_INVALID_SAP, otherwise
**
*******************************************************************************/
extern uint8_t LLCP_RegisterClient(uint8_t link_type,
tLLCP_APP_CBACK* p_sap_cback);
/*******************************************************************************
**
** Function LLCP_Deregister
**
** Description Deregister server or client
**
**
** Returns LLCP_STATUS_SUCCESS if success
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_Deregister(uint8_t sap);
/*******************************************************************************
**
** Function LLCP_IsLogicalLinkCongested
**
** Description Check if logical link is congested
**
**
** Returns TRUE if congested
**
*******************************************************************************/
extern bool LLCP_IsLogicalLinkCongested(uint8_t local_sap,
uint8_t num_pending_ui_pdu,
uint8_t total_pending_ui_pdu,
uint8_t total_pending_i_pdu);
/*******************************************************************************
**
** Function LLCP_SendUI
**
** Description Send connnectionless data to DSAP
**
**
** Returns LLCP_STATUS_SUCCESS if success
** LLCP_STATUS_CONGESTED if logical link is congested
** LLCP_STATUS_FAIL, otherwise
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_SendUI(uint8_t ssap, uint8_t dsap, NFC_HDR* p_buf);
/*******************************************************************************
**
** Function LLCP_ReadLogicalLinkData
**
** Description Read information of UI PDU for local SAP
**
** - Remote SAP who sent UI PDU is returned.
** - Information of UI PDU up to max_data_len is copied into
** p_data.
** - Information of next UI PDU is not concatenated.
** - Recommended max_data_len is link MIU of local device
**
** Returns TRUE if more information of UI PDU or more UI PDU in queue
**
*******************************************************************************/
extern bool LLCP_ReadLogicalLinkData(uint8_t local_sap, uint32_t max_data_len,
uint8_t* p_remote_sap,
uint32_t* p_data_len, uint8_t* p_data);
/*******************************************************************************
**
** Function LLCP_FlushLogicalLinkRxData
**
** Description Discard received data in logical data link of local SAP
**
**
** Returns length of data flushed
**
*******************************************************************************/
extern uint32_t LLCP_FlushLogicalLinkRxData(uint8_t local_sap);
/*******************************************************************************
**
** Function LLCP_ConnectReq
**
** Description Create data link connection between registered SAP and DSAP
** in peer LLCP,
**
**
** Returns LLCP_STATUS_SUCCESS if success
** LLCP_STATUS_FAIL, otherwise
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_ConnectReq(uint8_t reg_sap, uint8_t dsap,
tLLCP_CONNECTION_PARAMS* p_params);
/*******************************************************************************
**
** Function LLCP_ConnectCfm
**
** Description Accept connection request from peer LLCP
**
**
** Returns LLCP_STATUS_SUCCESS if success
** LLCP_STATUS_FAIL, otherwise
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_ConnectCfm(uint8_t local_sap, uint8_t remote_sap,
tLLCP_CONNECTION_PARAMS* p_params);
/*******************************************************************************
**
** Function LLCP_ConnectReject
**
** Description Reject connection request from peer LLCP
**
** reason : LLCP_SAP_DM_REASON_APP_REJECTED
** LLCP_SAP_DM_REASON_PERM_REJECT_THIS
** LLCP_SAP_DM_REASON_PERM_REJECT_ANY
** LLCP_SAP_DM_REASON_TEMP_REJECT_THIS
** LLCP_SAP_DM_REASON_TEMP_REJECT_ANY
**
** Returns LLCP_STATUS_SUCCESS if success
** LLCP_STATUS_FAIL, otherwise
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_ConnectReject(uint8_t local_sap, uint8_t remote_sap,
uint8_t reason);
/*******************************************************************************
**
** Function LLCP_IsDataLinkCongested
**
** Description Check if data link is congested
**
**
** Returns TRUE if congested
**
*******************************************************************************/
extern bool LLCP_IsDataLinkCongested(uint8_t local_sap, uint8_t remote_sap,
uint8_t num_pending_i_pdu,
uint8_t total_pending_ui_pdu,
uint8_t total_pending_i_pdu);
/*******************************************************************************
**
** Function LLCP_SendData
**
** Description Send connection-oriented data
**
**
** Returns LLCP_STATUS_SUCCESS if success
** LLCP_STATUS_CONGESTED if data link is congested
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_SendData(uint8_t local_sap, uint8_t remote_sap,
NFC_HDR* p_buf);
/*******************************************************************************
**
** Function LLCP_ReadDataLinkData
**
** Description Read information of I PDU for data link connection
**
** - Information of I PDU up to max_data_len is copied into
** p_data.
** - Information of next I PDU is not concatenated.
** - Recommended max_data_len is data link connection MIU of
** local end point
**
** Returns TRUE if more data in queue
**
*******************************************************************************/
extern bool LLCP_ReadDataLinkData(uint8_t local_sap, uint8_t remote_sap,
uint32_t max_data_len, uint32_t* p_data_len,
uint8_t* p_data);
/*******************************************************************************
**
** Function LLCP_FlushDataLinkRxData
**
** Description Discard received data in data link connection
**
**
** Returns length of rx data flushed
**
*******************************************************************************/
extern uint32_t LLCP_FlushDataLinkRxData(uint8_t local_sap, uint8_t remote_sap);
/*******************************************************************************
**
** Function LLCP_DisconnectReq
**
** Description Disconnect data link
** discard any pending data if flush is set to TRUE
**
** Returns LLCP_STATUS_SUCCESS if success
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_DisconnectReq(uint8_t local_sap, uint8_t remote_sap,
bool flush);
/*******************************************************************************
**
** Function LLCP_SetTxCompleteNtf
**
** Description This function is called to get LLCP_SAP_EVT_TX_COMPLETE
** when Tx queue is empty and all PDU is acked.
** This is one time event, so upper layer shall call this
** function again to get next LLCP_SAP_EVT_TX_COMPLETE.
**
** Returns LLCP_STATUS_SUCCESS if success
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_SetTxCompleteNtf(uint8_t local_sap,
uint8_t remote_sap);
/*******************************************************************************
**
** Function LLCP_SetLocalBusyStatus
**
** Description Set local busy status
**
**
** Returns LLCP_STATUS_SUCCESS if success
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_SetLocalBusyStatus(uint8_t local_sap,
uint8_t remote_sap, bool is_busy);
/*******************************************************************************
**
** Function LLCP_GetRemoteWKS
**
** Description Return well-known service bitmap of connected device
**
**
** Returns WKS bitmap if success
**
*******************************************************************************/
extern uint16_t LLCP_GetRemoteWKS(void);
/*******************************************************************************
**
** Function LLCP_GetRemoteLSC
**
** Description Return link service class of connected device
**
**
** Returns link service class
**
*******************************************************************************/
extern uint8_t LLCP_GetRemoteLSC(void);
/*******************************************************************************
**
** Function LLCP_GetRemoteVersion
**
** Description Return LLCP version of connected device
**
**
** Returns LLCP version
**
*******************************************************************************/
extern uint8_t LLCP_GetRemoteVersion(void);
/*******************************************************************************
**
** Function LLCP_GetLinkMIU
**
** Description Return local and remote link MIU
**
**
** Returns None
**
*******************************************************************************/
extern void LLCP_GetLinkMIU(uint16_t* p_local_link_miu,
uint16_t* p_remote_link_miu);
/*******************************************************************************
**
** Function LLCP_DiscoverService
**
** Description Return SAP of service name in connected device through
** callback
**
** Returns LLCP_STATUS_SUCCESS if success
**
*******************************************************************************/
extern tLLCP_STATUS LLCP_DiscoverService(char* p_name, tLLCP_SDP_CBACK* p_cback,
uint8_t* p_tid);
/*******************************************************************************
**
** Function LLCP_RegisterDtaCback
**
** Description Register callback function for LLCP DTA testing
**
**
** Returns void
**
*******************************************************************************/
extern void LLCP_RegisterDtaCback(tLLCP_DTA_CBACK* p_dta_cback);
#if (LLCP_TEST_INCLUDED == TRUE)
/*******************************************************************************
**
** Function LLCP_SetTestParams
**
** Description Set test parameters for LLCP
**
** Returns void
**
*******************************************************************************/
extern void LLCP_SetTestParams(uint8_t version, uint16_t wks);
#endif
#endif /* LLCP_API_H */