299 lines
8.1 KiB
C
299 lines
8.1 KiB
C
|
#ifndef L2CC_TASK_H_
|
||
|
#define L2CC_TASK_H_
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @addtogroup L2CCTASK Task
|
||
|
* @ingroup L2CC
|
||
|
* @brief Handles ALL messages to/from L2CC block.
|
||
|
*
|
||
|
* The L2CC task is responsible for L2CAP attribute and security block handling.
|
||
|
*
|
||
|
* @{
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* INCLUDE FILES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
#include "rwip_task.h" // Task definitions
|
||
|
#include "compiler.h"
|
||
|
#include <stdbool.h>
|
||
|
|
||
|
/*
|
||
|
* MACRO DEFINITIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Number of L2CC Deprecated messages
|
||
|
#define L2CC_NB_DEPRECATED_MSG (4)
|
||
|
|
||
|
/*
|
||
|
* STATES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* MESSAGES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Message API of the L2CC task
|
||
|
enum l2cc_msg_id
|
||
|
{
|
||
|
/// L2CAP Operation completed event
|
||
|
L2CC_CMP_EVT = TASK_FIRST_MSG(TASK_ID_L2CC) + L2CC_NB_DEPRECATED_MSG,
|
||
|
|
||
|
/* ************* LE Credit Based API ************* */
|
||
|
/// LE credit based connection request
|
||
|
L2CC_LECB_CONNECT_CMD,
|
||
|
/// LE credit based connection request indication
|
||
|
L2CC_LECB_CONNECT_REQ_IND,
|
||
|
/// LE credit based connection request confirmation
|
||
|
L2CC_LECB_CONNECT_CFM,
|
||
|
/// LE credit based connection indication
|
||
|
L2CC_LECB_CONNECT_IND,
|
||
|
/// LE credit based disconnect request
|
||
|
L2CC_LECB_DISCONNECT_CMD,
|
||
|
/// LE credit based disconnect indication
|
||
|
L2CC_LECB_DISCONNECT_IND,
|
||
|
/// LE credit based credit addition
|
||
|
L2CC_LECB_ADD_CMD,
|
||
|
/// LE credit based credit addition indication
|
||
|
L2CC_LECB_ADD_IND,
|
||
|
|
||
|
/// Send data over an LE Credit Based Connection
|
||
|
L2CC_LECB_SDU_SEND_CMD,
|
||
|
/// Inform that a data packet has been received from a LE Credit Based connection.
|
||
|
L2CC_LECB_SDU_RECV_IND,
|
||
|
|
||
|
|
||
|
/* ******************* Debug API ******************* */
|
||
|
/// Send Debug PDU data
|
||
|
L2CC_DBG_PDU_SEND_CMD,
|
||
|
/// Debug PDU data received
|
||
|
L2CC_DBG_PDU_RECV_IND,
|
||
|
|
||
|
|
||
|
/* **************** PDU Internal API ****************** */
|
||
|
/// Send Legacy PDU data
|
||
|
L2CC_PDU_SEND_CMD,
|
||
|
/// Legacy PDU data received
|
||
|
L2CC_PDU_RECV_IND,
|
||
|
|
||
|
/// Timeout indication for a transaction on signaling channel
|
||
|
L2CC_SIGNALING_TRANS_TO_IND,
|
||
|
};
|
||
|
|
||
|
|
||
|
/// request operation type - application interface
|
||
|
enum l2cc_operation
|
||
|
{
|
||
|
/* Operation Flags */
|
||
|
/* No Operation (if nothing has been requested) */
|
||
|
/* ************************************************ */
|
||
|
/// No operation
|
||
|
L2CC_NO_OP = 0x00,
|
||
|
|
||
|
/* LE Credit Based */
|
||
|
/* ************************************************ */
|
||
|
/// LE credit based connection request
|
||
|
L2CC_LECB_CONNECT,
|
||
|
/// LE credit based disconnection request
|
||
|
L2CC_LECB_DISCONNECT,
|
||
|
/// LE credit addition request
|
||
|
L2CC_LECB_CREDIT_ADD,
|
||
|
/// Send SDU
|
||
|
L2CC_LECB_SDU_SEND,
|
||
|
|
||
|
/* Debug PDU Transmission (internal) */
|
||
|
/* ************************************************ */
|
||
|
/// Send a Debug PDU
|
||
|
L2CC_DBG_PDU_SEND,
|
||
|
|
||
|
/* PDU Transmission (internal) */
|
||
|
/* ************************************************ */
|
||
|
/// Send internal LE Legacy PDU
|
||
|
L2CC_PDU_SEND,
|
||
|
};
|
||
|
|
||
|
|
||
|
/// Default L2Cap SDU definition
|
||
|
struct l2cc_sdu
|
||
|
{
|
||
|
/// Channel Identifier
|
||
|
uint16_t cid;
|
||
|
/// Number of credit used
|
||
|
uint16_t credit;
|
||
|
/// SDU Data length
|
||
|
uint16_t length;
|
||
|
/// data
|
||
|
uint8_t data[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
|
||
|
/// Operation completed event
|
||
|
struct l2cc_cmp_evt
|
||
|
{
|
||
|
/// L2CC request type (@see enum l2cc_operation)
|
||
|
uint8_t operation;
|
||
|
/// Status of request.
|
||
|
uint8_t status;
|
||
|
/// Channel ID
|
||
|
uint16_t cid;
|
||
|
/// Number of peer credit used - only relevant for LECB
|
||
|
uint16_t credit;
|
||
|
};
|
||
|
|
||
|
/// LE credit based connection request
|
||
|
struct l2cc_lecb_connect_cmd
|
||
|
{
|
||
|
/// L2CC request type:
|
||
|
/// - L2CC_LECB_CONNECT: LE credit connection
|
||
|
uint8_t operation;
|
||
|
/// parameter used for internal usage
|
||
|
uint8_t pkt_id;
|
||
|
/// LE Protocol/Service Multiplexer
|
||
|
uint16_t le_psm;
|
||
|
/// Local Channel identifier (0: automatically allocate a free channel)
|
||
|
uint16_t local_cid;
|
||
|
/// Credit allocated for the LE Credit Based Connection
|
||
|
/// Shall be at least: floor(((SDU + 2) + (MPS - 1)) / MPS) + 1
|
||
|
/// To be sure that 1 SDU can be fully received without requesting credits to application
|
||
|
uint16_t local_credit;
|
||
|
/// Maximum SDU size - Shall not exceed device MTU
|
||
|
uint16_t local_mtu;
|
||
|
/// Maximum Packet size - Shall not exceed device MPS
|
||
|
uint16_t local_mps;
|
||
|
};
|
||
|
|
||
|
/// LE credit based connection request indication
|
||
|
struct l2cc_lecb_connect_req_ind
|
||
|
{
|
||
|
/// LE Protocol/Service Multiplexer
|
||
|
uint16_t le_psm;
|
||
|
/// Peer Channel identifier
|
||
|
uint16_t peer_cid;
|
||
|
/// Maximum SDU size
|
||
|
uint16_t peer_mtu;
|
||
|
/// Maximum Packet size
|
||
|
uint16_t peer_mps;
|
||
|
};
|
||
|
|
||
|
/// LE credit based connection request confirmation
|
||
|
struct l2cc_lecb_connect_cfm
|
||
|
{
|
||
|
/// LE Protocol/Service Multiplexer
|
||
|
uint16_t le_psm;
|
||
|
/// Peer Channel identifier
|
||
|
uint16_t peer_cid;
|
||
|
/// True to accept the incoming connection, False else
|
||
|
bool accept;
|
||
|
/// Local Channel identifier (0: automatically allocate a free channel)
|
||
|
uint16_t local_cid;
|
||
|
/// Credit allocated for the LE Credit Based Connection
|
||
|
/// Shall be at least: floor(((SDU + 2) + (MPS - 1)) / MPS) + 1
|
||
|
/// To be sure that 1 SDU can be fully received without requesting credits to application
|
||
|
uint16_t local_credit;
|
||
|
/// Maximum SDU size - Shall not exceed device MTU
|
||
|
uint16_t local_mtu;
|
||
|
/// Maximum Packet size - Shall not exceed device MPS
|
||
|
uint16_t local_mps;
|
||
|
};
|
||
|
|
||
|
/// LE credit based connection indication
|
||
|
struct l2cc_lecb_connect_ind
|
||
|
{
|
||
|
/// Status
|
||
|
uint8_t status;
|
||
|
/// LE Protocol/Service Multiplexer
|
||
|
uint16_t le_psm;
|
||
|
/// Local Channel identifier
|
||
|
uint16_t local_cid;
|
||
|
/// Peer Channel identifier
|
||
|
uint16_t peer_cid;
|
||
|
/// Destination Credit for the LE Credit Based Connection
|
||
|
uint16_t peer_credit;
|
||
|
/// Maximum SDU size
|
||
|
uint16_t peer_mtu;
|
||
|
/// Maximum Packet size
|
||
|
uint16_t peer_mps;
|
||
|
};
|
||
|
|
||
|
/// LE credit based disconnect request
|
||
|
struct l2cc_lecb_disconnect_cmd
|
||
|
{
|
||
|
/// L2CC request type:
|
||
|
/// - L2CC_LECB_DISCONNECT: LE credit disconnection
|
||
|
uint8_t operation;
|
||
|
/// parameter used for internal usage
|
||
|
uint8_t pkt_id;
|
||
|
/// Peer Channel identifier
|
||
|
uint16_t peer_cid;
|
||
|
};
|
||
|
|
||
|
/// LE credit based disconnect indication
|
||
|
struct l2cc_lecb_disconnect_ind
|
||
|
{
|
||
|
/// LE Protocol/Service Multiplexer
|
||
|
uint16_t le_psm;
|
||
|
/// Local Channel identifier
|
||
|
uint16_t local_cid;
|
||
|
/// Peer Channel identifier
|
||
|
uint16_t peer_cid;
|
||
|
/// Reason
|
||
|
uint8_t reason;
|
||
|
};
|
||
|
|
||
|
/// LE credit based credit addition
|
||
|
struct l2cc_lecb_add_cmd
|
||
|
{
|
||
|
/// L2CC request type:
|
||
|
/// - L2CC_LECB_CREDIT_ADD: LE credit addition
|
||
|
uint8_t operation;
|
||
|
/// parameter used for internal usage
|
||
|
uint8_t pkt_id;
|
||
|
/// Local Channel identifier
|
||
|
uint16_t local_cid;
|
||
|
/// Credit added locally for channel identifier
|
||
|
uint16_t credit;
|
||
|
};
|
||
|
|
||
|
///LE credit based credit addition indication
|
||
|
struct l2cc_lecb_add_ind
|
||
|
{
|
||
|
/// Peer Channel identifier
|
||
|
uint16_t peer_cid;
|
||
|
/// Destination added credit (relative value)
|
||
|
uint16_t peer_added_credit;
|
||
|
};
|
||
|
|
||
|
/// Send data over an LE Credit Based Connection
|
||
|
struct l2cc_lecb_sdu_send_cmd
|
||
|
{
|
||
|
/// L2CC request type (@see enum l2cc_operation):
|
||
|
/// - L2CC_LECB_SDU_SEND: Send a SDU
|
||
|
uint8_t operation;
|
||
|
/// offset value information - for internal use only
|
||
|
uint16_t offset;
|
||
|
/// SDU information
|
||
|
struct l2cc_sdu sdu;
|
||
|
};
|
||
|
|
||
|
/// Inform that a data packet has been received from a LE Credit Based connection.
|
||
|
struct l2cc_lecb_sdu_recv_ind
|
||
|
{
|
||
|
/// Status information
|
||
|
uint8_t status;
|
||
|
/// offset value information
|
||
|
uint16_t offset;
|
||
|
/// SDU information
|
||
|
struct l2cc_sdu sdu;
|
||
|
};
|
||
|
|
||
|
|
||
|
/// @} L2CCTASK
|
||
|
|
||
|
#endif // L2CC_TASK_H_
|