/******************************************************************************
*
* 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 is the private interface file for the NFA P2P.
*
******************************************************************************/
#ifndef NFA_P2P_INT_H
#define NFA_P2P_INT_H
#if (NFA_P2P_INCLUDED == TRUE)
#include "nfa_dm_int.h"
#include "nfa_p2p_api.h"
/*****************************************************************************
** Constants and data types
*****************************************************************************/
/* NFA P2P LLCP link state */
enum {
NFA_P2P_LLCP_STATE_IDLE,
NFA_P2P_LLCP_STATE_LISTENING,
NFA_P2P_LLCP_STATE_ACTIVATED
};
typedef uint8_t tNFA_P2P_LLCP_STATE;
/* NFA P2P events */
enum {
NFA_P2P_API_REG_SERVER_EVT = NFA_SYS_EVT_START(NFA_ID_P2P),
NFA_P2P_API_REG_CLIENT_EVT,
NFA_P2P_API_DEREG_EVT,
NFA_P2P_API_ACCEPT_CONN_EVT,
NFA_P2P_API_REJECT_CONN_EVT,
NFA_P2P_API_DISCONNECT_EVT,
NFA_P2P_API_CONNECT_EVT,
NFA_P2P_API_SEND_UI_EVT,
NFA_P2P_API_SEND_DATA_EVT,
NFA_P2P_API_SET_LOCAL_BUSY_EVT,
NFA_P2P_API_GET_LINK_INFO_EVT,
NFA_P2P_API_GET_REMOTE_SAP_EVT,
NFA_P2P_API_SET_LLCP_CFG_EVT,
NFA_P2P_INT_RESTART_RF_DISC_EVT,
NFA_P2P_LAST_EVT
};
/* data type for NFA_P2P_API_REG_SERVER_EVT */
typedef struct {
NFC_HDR hdr;
uint8_t server_sap;
tNFA_P2P_LINK_TYPE link_type;
char service_name[LLCP_MAX_SN_LEN + 1];
tNFA_P2P_CBACK* p_cback;
} tNFA_P2P_API_REG_SERVER;
/* data type for NFA_P2P_API_REG_CLIENT_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_P2P_LINK_TYPE link_type;
tNFA_P2P_CBACK* p_cback;
} tNFA_P2P_API_REG_CLIENT;
/* data type for NFA_P2P_API_DEREG_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE handle;
} tNFA_P2P_API_DEREG;
/* data type for NFA_P2P_API_ACCEPT_CONN_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE conn_handle;
uint16_t miu;
uint8_t rw;
} tNFA_P2P_API_ACCEPT_CONN;
/* data type for NFA_P2P_API_REJECT_CONN_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE conn_handle;
} tNFA_P2P_API_REJECT_CONN;
/* data type for NFA_P2P_API_DISCONNECT_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE conn_handle;
bool flush;
} tNFA_P2P_API_DISCONNECT;
/* data type for NFA_P2P_API_CONNECT_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE client_handle;
char service_name[LLCP_MAX_SN_LEN + 1];
uint8_t dsap;
uint16_t miu;
uint8_t rw;
} tNFA_P2P_API_CONNECT;
/* data type for NFA_P2P_API_SEND_UI_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE handle;
uint8_t dsap;
NFC_HDR* p_msg;
} tNFA_P2P_API_SEND_UI;
/* data type for NFA_P2P_API_SEND_DATA_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE conn_handle;
NFC_HDR* p_msg;
} tNFA_P2P_API_SEND_DATA;
/* data type for NFA_P2P_API_SET_LOCAL_BUSY_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE conn_handle;
bool is_busy;
} tNFA_P2P_API_SET_LOCAL_BUSY;
/* data type for NFA_P2P_API_GET_LINK_INFO_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE handle;
} tNFA_P2P_API_GET_LINK_INFO;
/* data type for NFA_P2P_API_GET_REMOTE_SAP_EVT */
typedef struct {
NFC_HDR hdr;
tNFA_HANDLE handle;
char service_name[LLCP_MAX_SN_LEN + 1];
} tNFA_P2P_API_GET_REMOTE_SAP;
/* data type for NFA_P2P_API_SET_LLCP_CFG_EVT */
typedef struct {
NFC_HDR hdr;
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;
} tNFA_P2P_API_SET_LLCP_CFG;
/* union of all event data types */
typedef union {
NFC_HDR hdr;
tNFA_P2P_API_REG_SERVER api_reg_server;
tNFA_P2P_API_REG_CLIENT api_reg_client;
tNFA_P2P_API_DEREG api_dereg;
tNFA_P2P_API_ACCEPT_CONN api_accept;
tNFA_P2P_API_REJECT_CONN api_reject;
tNFA_P2P_API_DISCONNECT api_disconnect;
tNFA_P2P_API_CONNECT api_connect;
tNFA_P2P_API_SEND_UI api_send_ui;
tNFA_P2P_API_SEND_DATA api_send_data;
tNFA_P2P_API_SET_LOCAL_BUSY api_local_busy;
tNFA_P2P_API_GET_LINK_INFO api_link_info;
tNFA_P2P_API_GET_REMOTE_SAP api_remote_sap;
tNFA_P2P_API_SET_LLCP_CFG api_set_llcp_cfg;
} tNFA_P2P_MSG;
/*****************************************************************************
** control block
*****************************************************************************/
/* Bit flag for connection handle */
#define NFA_P2P_HANDLE_FLAG_CONN 0x80
/* NFA P2P Connection block */
/* Connection control block is used */
#define NFA_P2P_CONN_FLAG_IN_USE 0x01
/* Remote set RW to 0 (flow off) */
#define NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO 0x02
/* data link connection is congested */
#define NFA_P2P_CONN_FLAG_CONGESTED 0x04
typedef struct {
uint8_t flags; /* internal flags for data link connection */
uint8_t local_sap; /* local SAP of data link connection */
uint8_t remote_sap; /* remote SAP of data link connection */
uint16_t remote_miu; /* MIU of remote end point */
uint8_t num_pending_i_pdu; /* number of tx I PDU not processed by NFA */
} tNFA_P2P_CONN_CB;
/* NFA P2P SAP control block */
/* registered server */
#define NFA_P2P_SAP_FLAG_SERVER 0x01
/* registered client */
#define NFA_P2P_SAP_FLAG_CLIENT 0x02
/* logical link connection is congested */
#define NFA_P2P_SAP_FLAG_LLINK_CONGESTED 0x04
typedef struct {
uint8_t flags; /* internal flags for local SAP */
tNFA_P2P_CBACK* p_cback; /* callback function for local SAP */
uint8_t num_pending_ui_pdu; /* number of tx UI PDU not processed by NFA */
} tNFA_P2P_SAP_CB;
/* NFA P2P SDP control block */
typedef struct {
uint8_t tid; /* transaction ID */
uint8_t local_sap;
} tNFA_P2P_SDP_CB;
#define NFA_P2P_NUM_SAP 64
/* NFA P2P control block */
typedef struct {
tNFA_HANDLE dm_disc_handle;
tNFA_DM_RF_DISC_STATE rf_disc_state;
tNFA_P2P_LLCP_STATE llcp_state;
bool is_initiator;
bool is_active_mode;
uint16_t local_link_miu;
uint16_t remote_link_miu;
tNFA_TECHNOLOGY_MASK listen_tech_mask; /* for P2P listening */
tNFA_TECHNOLOGY_MASK
listen_tech_mask_to_restore; /* to retry without active listen mode */
TIMER_LIST_ENT
active_listen_restore_timer; /* timer to restore active listen mode */
bool is_p2p_listening;
bool is_snep_listening;
tNFA_P2P_SAP_CB sap_cb[NFA_P2P_NUM_SAP];
tNFA_P2P_CONN_CB conn_cb[LLCP_MAX_DATA_LINK];
tNFA_P2P_SDP_CB sdp_cb[LLCP_MAX_SDP_TRANSAC];
uint8_t
total_pending_ui_pdu; /* total number of tx UI PDU not processed by NFA */
uint8_t
total_pending_i_pdu; /* total number of tx I PDU not processed by NFA */
} tNFA_P2P_CB;
/*****************************************************************************
** External variables
*****************************************************************************/
/* NFA P2P control block */
extern tNFA_P2P_CB nfa_p2p_cb;
/*****************************************************************************
** External functions
*****************************************************************************/
/*
** nfa_p2p_main.c
*/
void nfa_p2p_init(void);
void nfa_p2p_update_listen_tech(tNFA_TECHNOLOGY_MASK tech_mask);
void nfa_p2p_enable_listening(tNFA_SYS_ID sys_id, bool update_wks);
void nfa_p2p_disable_listening(tNFA_SYS_ID sys_id, bool update_wks);
void nfa_p2p_activate_llcp(tNFC_DISCOVER* p_data);
void nfa_p2p_deactivate_llcp(void);
void nfa_p2p_set_config(tNFA_DM_DISC_TECH_PROTO_MASK disc_mask);
/*
** nfa_p2p_act.c
*/
void nfa_p2p_proc_llcp_data_ind(tLLCP_SAP_CBACK_DATA* p_data);
void nfa_p2p_proc_llcp_connect_ind(tLLCP_SAP_CBACK_DATA* p_data);
void nfa_p2p_proc_llcp_connect_resp(tLLCP_SAP_CBACK_DATA* p_data);
void nfa_p2p_proc_llcp_disconnect_ind(tLLCP_SAP_CBACK_DATA* p_data);
void nfa_p2p_proc_llcp_disconnect_resp(tLLCP_SAP_CBACK_DATA* p_data);
void nfa_p2p_proc_llcp_congestion(tLLCP_SAP_CBACK_DATA* p_data);
void nfa_p2p_proc_llcp_link_status(tLLCP_SAP_CBACK_DATA* p_data);
bool nfa_p2p_start_sdp(char* p_service_name, uint8_t local_sap);
bool nfa_p2p_reg_server(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_reg_client(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_dereg(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_accept_connection(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_reject_connection(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_disconnect(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_create_data_link_connection(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_send_ui(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_send_data(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_set_local_busy(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_get_link_info(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_get_remote_sap(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_set_llcp_cfg(tNFA_P2P_MSG* p_msg);
bool nfa_p2p_restart_rf_discovery(tNFA_P2P_MSG* p_msg);
#else
#define nfa_p2p_init ()
#define nfa_p2p_activate_llcp (a){};
#define nfa_p2p_deactivate_llcp ()
#define nfa_p2p_set_config ()
#endif /* (NFA_P2P_INCLUDED == TRUE) */
#endif /* NFA_P2P_INT_H */