1093 lines
29 KiB
C
1093 lines
29 KiB
C
|
#ifndef _L2CC_PDU_H_
|
||
|
#define _L2CC_PDU_H_
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @addtogroup L2CC_PDU L2Cap Controller PDU generator/extractor
|
||
|
* @ingroup L2CC
|
||
|
* @brief This module is in charge to pack or unpack L2CAP packets
|
||
|
*
|
||
|
* @{
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* INCLUDE FILES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
#include "co_bt.h"
|
||
|
#include "gap.h"
|
||
|
#include "att.h"
|
||
|
#include "compiler.h"
|
||
|
|
||
|
/*
|
||
|
* MACROS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
* DEFINES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Minimal authorized MTU value (defined by Bluetooth SIG)
|
||
|
#define L2C_MIN_LE_MTUSIG (23)
|
||
|
|
||
|
/// L2CAP mode supported for BLE - only mode accepted
|
||
|
#define L2C_MODE_BASIC_L2CAP (0x00)
|
||
|
|
||
|
/// Packet partition
|
||
|
#define L2C_CID_LEN (2)
|
||
|
#define L2C_LENGTH_LEN (2)
|
||
|
#define L2C_CODE_LEN (1)
|
||
|
#define L2C_HEADER_LEN (L2C_CID_LEN + L2C_LENGTH_LEN)
|
||
|
#define L2C_SDU_LEN (2)
|
||
|
#define L2C_LECB_HEADER_LEN (L2C_HEADER_LEN + L2C_SDU_LEN)
|
||
|
|
||
|
/// Maximum credit
|
||
|
#define L2C_LECB_MAX_CREDIT 0xFFFF
|
||
|
|
||
|
|
||
|
/* result for connection parameter update response */
|
||
|
#define L2C_CONN_PARAM_ACCEPT 0x0000
|
||
|
#define L2C_CONN_PARAM_REJECT 0x0001
|
||
|
|
||
|
/* command reject reasons */
|
||
|
enum l2cc_pdu_err
|
||
|
{
|
||
|
L2C_CMD_NOT_UNDERSTOOD = 0x0000,
|
||
|
L2C_MTU_SIG_EXCEEDED = 0x0001,
|
||
|
L2C_INVALID_CID = 0x0002,
|
||
|
};
|
||
|
|
||
|
/// Check if channel ID is within the correct range
|
||
|
#define L2C_IS_DYNAMIC_CID(cid) ((cid >= L2C_CID_DYN_MIN) && (cid <= L2C_CID_DYN_MAX))
|
||
|
|
||
|
/// Check if LE PSM is within the correct range
|
||
|
#define L2C_IS_VALID_LEPSM(lepsm) (lepsm != L2C_LEPSM_RESERVED)
|
||
|
|
||
|
/*
|
||
|
* ENUMERATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/** L2CAP LE PSM limits */
|
||
|
enum l2cc_lepsm_limits
|
||
|
{
|
||
|
/// Reserved
|
||
|
L2C_LEPSM_RESERVED = 0x0000,
|
||
|
/// Fixed minimum range SIG assigned
|
||
|
L2C_LEPSM_FIXED_MIN = 0x0001,
|
||
|
/// Fixed maximum range SIG assigned
|
||
|
L2C_LEPSM_FIXED_MAX = 0x007F,
|
||
|
/// Dynamic minimum range SIG assigned
|
||
|
L2C_LEPSM_DYN_MIN = 0x0080,
|
||
|
/// Dynamic maximum range SIG assigned
|
||
|
L2C_LEPSM_DYN_MAX = 0x00FF,
|
||
|
/// Reserved minimum range SIG assigned
|
||
|
L2C_LEPSM_RSV_MIN = 0x0100,
|
||
|
/// Reserved maximum range SIG assigned
|
||
|
L2C_LEPSM_RSV_MAX = 0xFFFF,
|
||
|
};
|
||
|
|
||
|
/** L2CAP channels id */
|
||
|
enum l2cc_cid
|
||
|
{
|
||
|
/// Reserved channel id
|
||
|
L2C_CID_RESERVED = 0x0000,
|
||
|
/// Attribute channel id
|
||
|
L2C_CID_ATTRIBUTE = 0x0004,
|
||
|
/// Signaling channel id
|
||
|
L2C_CID_LE_SIGNALING = 0x0005,
|
||
|
/// Security channel id
|
||
|
L2C_CID_SECURITY = 0x0006,
|
||
|
/// Dynamically allocated minimum range
|
||
|
L2C_CID_DYN_MIN = 0x0040,
|
||
|
/// Dynamically allocated maximum range
|
||
|
L2C_CID_DYN_MAX = 0x007F,
|
||
|
};
|
||
|
|
||
|
|
||
|
/// signaling codes
|
||
|
enum l2cc_signal_code
|
||
|
{
|
||
|
/// Reserved code
|
||
|
L2C_CODE_RESERVED = 0x00,
|
||
|
/// Reject request
|
||
|
L2C_CODE_REJECT = 0x01,
|
||
|
/// Connection request
|
||
|
L2C_CODE_CONNECTION_REQ = 0x02,
|
||
|
/// Connection response
|
||
|
L2C_CODE_CONNECTION_RESP = 0x03,
|
||
|
/// Configuration request
|
||
|
L2C_CODE_CONFIGURATION_REQ = 0x04,
|
||
|
/// Configuration response
|
||
|
L2C_CODE_CONFIGURATION_RESP = 0x05,
|
||
|
/// Disconnection request
|
||
|
L2C_CODE_DISCONNECTION_REQ = 0x06,
|
||
|
/// Disconnection response
|
||
|
L2C_CODE_DISCONNECTION_RESP = 0x07,
|
||
|
/// Echo request
|
||
|
L2C_CODE_ECHO_REQ = 0x08,
|
||
|
/// Echo response
|
||
|
L2C_CODE_ECHO_RESP = 0x09,
|
||
|
/// Information request
|
||
|
L2C_CODE_INFORMATION_REQ = 0x0A,
|
||
|
/// Information response
|
||
|
L2C_CODE_INFORMATION_RESP = 0x0B,
|
||
|
/// Create channel request
|
||
|
L2C_CODE_CREATE_CHANNEL_REQ = 0x0C,
|
||
|
/// Create channel response
|
||
|
L2C_CODE_CREATE_CHANNEL_RESP = 0x0D,
|
||
|
/// Move channel request
|
||
|
L2C_CODE_MOVE_CHANNEL_REQ = 0x0E,
|
||
|
/// Move channel response
|
||
|
L2C_CODE_MOVE_CHANNEL_RESP = 0x0F,
|
||
|
/// Move channel confirmation
|
||
|
L2C_CODE_MOVE_CHANNEL_CFM = 0x10,
|
||
|
/// Move channel confirmation response
|
||
|
L2C_CODE_MOVE_CHANNEL_CFM_RESP = 0x11,
|
||
|
/// Connection Parameter Update Request
|
||
|
L2C_CODE_CONN_PARAM_UPD_REQ = 0x12,
|
||
|
/// Connection Parameter Update Response
|
||
|
L2C_CODE_CONN_PARAM_UPD_RESP = 0x13,
|
||
|
/// LE Credit Based Connection request
|
||
|
L2C_CODE_LE_CB_CONN_REQ = 0x14,
|
||
|
/// LE Credit Based Connection response
|
||
|
L2C_CODE_LE_CB_CONN_RESP = 0x15,
|
||
|
/// LE Flow Control Credit
|
||
|
L2C_CODE_LE_FLOW_CONTROL_CREDIT = 0x16,
|
||
|
|
||
|
/// max number of signaling codes
|
||
|
L2C_CODE_SIGNALING_MAX
|
||
|
};
|
||
|
|
||
|
|
||
|
/// security codes
|
||
|
enum l2cc_security_code
|
||
|
{
|
||
|
/// Pairing Request
|
||
|
L2C_CODE_PAIRING_REQUEST = 0x01,
|
||
|
/// Pairing Response
|
||
|
L2C_CODE_PAIRING_RESPONSE = 0x02,
|
||
|
/// Pairing Confirm
|
||
|
L2C_CODE_PAIRING_CONFIRM = 0x03,
|
||
|
/// Pairing Random
|
||
|
L2C_CODE_PAIRING_RANDOM = 0x04,
|
||
|
/// Pairing Failed
|
||
|
L2C_CODE_PAIRING_FAILED = 0x05,
|
||
|
/// Encryption Information
|
||
|
L2C_CODE_ENCRYPTION_INFORMATION = 0x06,
|
||
|
/// Master Identification
|
||
|
L2C_CODE_MASTER_IDENTIFICATION = 0x07,
|
||
|
/// Identity Information
|
||
|
L2C_CODE_IDENTITY_INFORMATION = 0x08,
|
||
|
/// Identity Address Information
|
||
|
L2C_CODE_IDENTITY_ADDRESS_INFORMATION = 0x09,
|
||
|
/// Signing Information
|
||
|
L2C_CODE_SIGNING_INFORMATION = 0x0A,
|
||
|
/// Security Request
|
||
|
L2C_CODE_SECURITY_REQUEST = 0x0B,
|
||
|
// Pairing Public Keys
|
||
|
L2C_CODE_PUBLIC_KEY = 0x0C,
|
||
|
// Pairing DHKey Check
|
||
|
L2C_CODE_DHKEY_CHECK = 0x0D,
|
||
|
// Pairing Keypress Notification
|
||
|
L2C_CODE_KEYPRESS_NOTIFICATION = 0x0E,
|
||
|
/// max number of security codes
|
||
|
L2C_CODE_SECURITY_MAX
|
||
|
};
|
||
|
|
||
|
|
||
|
/// attribute protocol PDU codes
|
||
|
enum l2cc_attribute_code
|
||
|
{
|
||
|
/// Error response
|
||
|
L2C_CODE_ATT_ERR_RSP = 0x01,
|
||
|
/// Exchange MTU Request
|
||
|
L2C_CODE_ATT_MTU_REQ = 0x02,
|
||
|
/// Exchange MTU Response
|
||
|
L2C_CODE_ATT_MTU_RSP = 0x03,
|
||
|
/// Find Information Request
|
||
|
L2C_CODE_ATT_FIND_INFO_REQ = 0x04,
|
||
|
/// Find Information Response
|
||
|
L2C_CODE_ATT_FIND_INFO_RSP = 0x05,
|
||
|
/// Find By Type Value Request
|
||
|
L2C_CODE_ATT_FIND_BY_TYPE_REQ = 0x06,
|
||
|
/// Find By Type Value Response
|
||
|
L2C_CODE_ATT_FIND_BY_TYPE_RSP = 0x07,
|
||
|
/// Read By Type Request
|
||
|
L2C_CODE_ATT_RD_BY_TYPE_REQ = 0x08,
|
||
|
/// Read By Type Response
|
||
|
L2C_CODE_ATT_RD_BY_TYPE_RSP = 0x09,
|
||
|
/// Read Request
|
||
|
L2C_CODE_ATT_RD_REQ = 0x0A,
|
||
|
/// Read Response
|
||
|
L2C_CODE_ATT_RD_RSP = 0x0B,
|
||
|
/// Read Blob Request
|
||
|
L2C_CODE_ATT_RD_BLOB_REQ = 0x0C,
|
||
|
/// Read Blob Response
|
||
|
L2C_CODE_ATT_RD_BLOB_RSP = 0x0D,
|
||
|
/// Read Multiple Request
|
||
|
L2C_CODE_ATT_RD_MULT_REQ = 0x0E,
|
||
|
/// Read Multiple Response
|
||
|
L2C_CODE_ATT_RD_MULT_RSP = 0x0F,
|
||
|
/// Read by Group Type Request
|
||
|
L2C_CODE_ATT_RD_BY_GRP_TYPE_REQ = 0x10,
|
||
|
/// Read By Group Type Response
|
||
|
L2C_CODE_ATT_RD_BY_GRP_TYPE_RSP = 0x11,
|
||
|
/// Write Request
|
||
|
L2C_CODE_ATT_WR_REQ = 0x12,
|
||
|
/// Write Response
|
||
|
L2C_CODE_ATT_WR_RSP = 0x13,
|
||
|
/// Write Command
|
||
|
L2C_CODE_ATT_WR_CMD_INFO = 0x14,
|
||
|
L2C_CODE_ATT_WR_CMD = 0x52,
|
||
|
/// Signed Write Command
|
||
|
L2C_CODE_ATT_SIGN_WR_CMD_INFO = 0x15,
|
||
|
L2C_CODE_ATT_SIGN_WR_CMD = 0xD2,
|
||
|
/// Prepare Write Request
|
||
|
L2C_CODE_ATT_PREP_WR_REQ = 0x16,
|
||
|
/// Prepare Write Response
|
||
|
L2C_CODE_ATT_PREP_WR_RSP = 0x17,
|
||
|
/// Execute Write Request
|
||
|
L2C_CODE_ATT_EXE_WR_REQ = 0x18,
|
||
|
/// Execute Write Response
|
||
|
L2C_CODE_ATT_EXE_WR_RSP = 0x19,
|
||
|
/// Handle Value Notification
|
||
|
L2C_CODE_ATT_HDL_VAL_NTF = 0x1B,
|
||
|
/// Handle Value Indication
|
||
|
L2C_CODE_ATT_HDL_VAL_IND = 0x1D,
|
||
|
/// Handle Value Confirmation
|
||
|
L2C_CODE_ATT_HDL_VAL_CFM = 0x1E,
|
||
|
|
||
|
/// max number of security codes
|
||
|
L2C_CODE_ATT_MAX
|
||
|
};
|
||
|
|
||
|
/// LE Connection oriented PDU codes
|
||
|
enum l2cc_le_connor_code
|
||
|
{
|
||
|
/// Data frame
|
||
|
L2C_CODE_CON_DATA = 0x01,
|
||
|
|
||
|
/// max number of connection oriented codes
|
||
|
L2C_CODE_CON_MAX
|
||
|
};
|
||
|
|
||
|
/// Result values for LE Credit Based Connection Response
|
||
|
enum l2cc_cb_resp_value
|
||
|
{
|
||
|
/// connection successful
|
||
|
L2C_CB_CON_SUCCESS = 0x0000,
|
||
|
/// Reserved
|
||
|
L2C_CB_CON_RSV1,
|
||
|
/// Connection refused - LE_PSM not supported
|
||
|
L2C_CB_CON_LEPSM_NOT_SUPP,
|
||
|
/// Reserved
|
||
|
L2C_CB_CON_RSV2,
|
||
|
/// Connection refused - no resources available
|
||
|
L2C_CB_CON_NO_RES_AVAIL,
|
||
|
/// Connection refused - insufficient authentication
|
||
|
L2C_CB_CON_INS_AUTH,
|
||
|
/// Connection refused - insufficient authorization
|
||
|
L2C_CB_CON_INS_AUTHOR,
|
||
|
/// Connection refused - insufficient encryption key size
|
||
|
L2C_CB_CON_INS_EKS,
|
||
|
/// Connection Refused - insufficient encryption
|
||
|
L2C_CB_CON_INS_ENCRYPTION,
|
||
|
|
||
|
/* ESR 09 error codes */
|
||
|
/// Connection Refused - invalid Source CID
|
||
|
L2C_CB_CON_INVALID_SRC_CID,
|
||
|
/// Connection Refused - Source CID already allocated
|
||
|
L2C_CB_CON_SRC_CID_ALREADY_ALLOC,
|
||
|
/// Connection Refused - Unacceptable parameters
|
||
|
L2C_CB_CON_UNACCEPTABLE_PARAM
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* TYPE DEFINITIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Disconnection Request
|
||
|
struct l2cc_disconnection_req
|
||
|
{
|
||
|
/// Signaling code - 0x06
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// Destination CID
|
||
|
uint16_t dcid;
|
||
|
/// Source CID
|
||
|
uint16_t scid;
|
||
|
};
|
||
|
|
||
|
/// Disconnection Response
|
||
|
struct l2cc_disconnection_rsp
|
||
|
{
|
||
|
/// Signaling code - 0x07
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// Destination CID
|
||
|
uint16_t dcid;
|
||
|
/// Source CID
|
||
|
uint16_t scid;
|
||
|
};
|
||
|
|
||
|
/// Connection Parameter Update Request
|
||
|
struct l2cc_update_param_req
|
||
|
{
|
||
|
/// Signaling code - 0x12
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// minimum value for the connection event interval
|
||
|
uint16_t intv_min;
|
||
|
/// maximum value for the connection event interval
|
||
|
uint16_t intv_max;
|
||
|
/// slave latency parameter
|
||
|
uint16_t latency;
|
||
|
/// connection timeout parameter
|
||
|
uint16_t timeout;
|
||
|
};
|
||
|
|
||
|
/// Connection Parameter Update Response
|
||
|
struct l2cc_update_param_rsp
|
||
|
{
|
||
|
/// Signaling code - 0x13
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// Result field indicates the response to the Connection Parameter Update Request
|
||
|
/// - 0x0000 Connection Parameters accepted
|
||
|
/// - 0x0001 Connection Parameters rejected
|
||
|
uint16_t response;
|
||
|
};
|
||
|
|
||
|
/// LE Credit based connection request
|
||
|
struct l2cc_lecb_req
|
||
|
{
|
||
|
/// Signaling code - 0x14
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// LE Protocol/Service Multiplexer
|
||
|
uint16_t le_psm;
|
||
|
/// Source CID
|
||
|
uint16_t scid;
|
||
|
/// Maximum Transmission Unit
|
||
|
uint16_t mtu;
|
||
|
/// Maximum PDU Size
|
||
|
uint16_t mps;
|
||
|
/// Initial credits
|
||
|
uint16_t initial_credits;
|
||
|
};
|
||
|
|
||
|
/// LE Credit based connection response
|
||
|
struct l2cc_lecb_rsp
|
||
|
{
|
||
|
/// Signaling code - 0x15
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// Destination CID
|
||
|
uint16_t dcid;
|
||
|
/// Maximum Transmission Unit
|
||
|
uint16_t mtu;
|
||
|
/// Maximum PDU Size
|
||
|
uint16_t mps;
|
||
|
/// Initial credits
|
||
|
uint16_t initial_credits;
|
||
|
/// Result
|
||
|
uint16_t result;
|
||
|
};
|
||
|
|
||
|
/// LE Flow Control Credit
|
||
|
struct l2cc_le_flow_ctl_credit
|
||
|
{
|
||
|
/// Signaling code - 0x16
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// CID
|
||
|
uint16_t cid;
|
||
|
/// Credits
|
||
|
uint16_t credits;
|
||
|
};
|
||
|
|
||
|
/// Command Reject
|
||
|
struct l2cc_reject
|
||
|
{
|
||
|
/// Signaling code - 0x01
|
||
|
uint8_t code;
|
||
|
/// Packet Identifier
|
||
|
uint8_t pkt_id;
|
||
|
/// data length
|
||
|
uint16_t length;
|
||
|
/// The Reason field describes why the Request packet was rejected
|
||
|
/// - 0x0000 Command not understood
|
||
|
/// - 0x0001 Signaling MTU exceeded
|
||
|
/// - 0x0002 Invalid CID in request
|
||
|
uint16_t reason;
|
||
|
/// Optional parameters total length
|
||
|
uint16_t opt_len;
|
||
|
///16-byte array for optional parameters
|
||
|
uint8_t opt[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
|
||
|
/// Pairing Request
|
||
|
struct l2cc_pairing_req
|
||
|
{
|
||
|
/// security code - 0x01
|
||
|
uint8_t code;
|
||
|
/// IO Capability
|
||
|
uint8_t iocap;
|
||
|
/// OOB data flag
|
||
|
uint8_t oob;
|
||
|
/// AuthReq
|
||
|
uint8_t auth;
|
||
|
/// Maximum Encryption Key Size
|
||
|
uint8_t key_size;
|
||
|
/// Initiator Key Distribution
|
||
|
uint8_t ikey_dist;
|
||
|
/// Responder Key Distribution
|
||
|
uint8_t rkey_dist;
|
||
|
};
|
||
|
/// Pairing Response
|
||
|
struct l2cc_pairing_rsp
|
||
|
{
|
||
|
/// security code - 0x02
|
||
|
uint8_t code;
|
||
|
/// IO Capability
|
||
|
uint8_t iocap;
|
||
|
/// OOB data flag
|
||
|
uint8_t oob;
|
||
|
/// AuthReq
|
||
|
uint8_t auth;
|
||
|
/// Maximum Encryption Key Size
|
||
|
uint8_t key_size;
|
||
|
/// Initiator Key Distribution
|
||
|
uint8_t ikey_dist;
|
||
|
/// Responder Key Distribution
|
||
|
uint8_t rkey_dist;
|
||
|
};
|
||
|
/// Pairing Confirm
|
||
|
struct l2cc_pairing_cfm
|
||
|
{
|
||
|
/// security code - 0x03
|
||
|
uint8_t code;
|
||
|
///Confirm value
|
||
|
uint8_t cfm_val[CFM_LEN];
|
||
|
};
|
||
|
/// Pairing Random
|
||
|
struct l2cc_pairing_random
|
||
|
{
|
||
|
/// security code - 0x04
|
||
|
uint8_t code;
|
||
|
///Random value
|
||
|
uint8_t random[RAND_VAL_LEN];
|
||
|
};
|
||
|
/// Pairing Failed
|
||
|
struct l2cc_pairing_failed
|
||
|
{
|
||
|
/// security code - 0x05
|
||
|
uint8_t code;
|
||
|
/// The Reason field indicates why the pairing failed
|
||
|
uint8_t reason;
|
||
|
};
|
||
|
/// Encryption Information
|
||
|
struct l2cc_encryption_inf
|
||
|
{
|
||
|
/// security code - 0x06
|
||
|
uint8_t code;
|
||
|
///16-byte array for LTK value
|
||
|
uint8_t ltk[GAP_KEY_LEN];
|
||
|
};
|
||
|
/// Master Identification
|
||
|
struct l2cc_master_id
|
||
|
{
|
||
|
/// security code - 0x07
|
||
|
uint8_t code;
|
||
|
/// key diversifier
|
||
|
uint16_t ediv;
|
||
|
///8-byte array for random number
|
||
|
uint8_t nb[GAP_RAND_NB_LEN];
|
||
|
};
|
||
|
/// Identity Information
|
||
|
struct l2cc_identity_inf
|
||
|
{
|
||
|
/// security code - 0x08
|
||
|
uint8_t code;
|
||
|
///16-byte array for IRK value
|
||
|
uint8_t irk[GAP_KEY_LEN];
|
||
|
};
|
||
|
/// Identity Address Information
|
||
|
struct l2cc_id_addr_inf
|
||
|
{
|
||
|
/// security code - 0x09
|
||
|
uint8_t code;
|
||
|
/// BD Address Type
|
||
|
uint8_t addr_type;
|
||
|
/// BD Address
|
||
|
bd_addr_t addr;
|
||
|
};
|
||
|
/// Signing Information
|
||
|
struct l2cc_signing_inf
|
||
|
{
|
||
|
/// security code - 0x0A
|
||
|
uint8_t code;
|
||
|
///16-byte array for CSRK value
|
||
|
uint8_t csrk[GAP_KEY_LEN];
|
||
|
};
|
||
|
/// Security Request
|
||
|
struct l2cc_security_req
|
||
|
{
|
||
|
/// security code - 0x0B
|
||
|
uint8_t code;
|
||
|
/// AuthReq
|
||
|
uint8_t auth;
|
||
|
};
|
||
|
|
||
|
/// Public Key (x,y)
|
||
|
struct l2cc_publc_key
|
||
|
{
|
||
|
/// security code - 0x0C
|
||
|
uint8_t code;
|
||
|
/// X and Y co-ordinates of the Public Key
|
||
|
uint8_t x[GAP_P256_KEY_LEN];
|
||
|
uint8_t y[GAP_P256_KEY_LEN];
|
||
|
};
|
||
|
|
||
|
/// DH Key Check
|
||
|
struct l2cc_dhkey_check
|
||
|
{
|
||
|
/// security code - 0x0D
|
||
|
uint8_t code;
|
||
|
uint8_t check[DHKEY_CHECK_LEN];
|
||
|
};
|
||
|
/// Keypress Notification - PassKey method only
|
||
|
struct l2cc_keypress_noticication
|
||
|
{
|
||
|
/// security code - 0x0E
|
||
|
uint8_t code;
|
||
|
|
||
|
uint8_t notification_type;
|
||
|
};
|
||
|
|
||
|
|
||
|
/* Attribute protocol PDUs */
|
||
|
|
||
|
/// Error response
|
||
|
struct l2cc_att_err_rsp
|
||
|
{
|
||
|
/// Error Response - 0x01
|
||
|
uint8_t code;
|
||
|
/// The request that generated this error response
|
||
|
uint8_t op_code;
|
||
|
/// The attribute handle that generated this error response
|
||
|
uint16_t handle;
|
||
|
///The reason why the request has generated an error response
|
||
|
uint8_t reason;
|
||
|
};
|
||
|
|
||
|
/// Exchange MTU Request
|
||
|
struct l2cc_att_mtu_req
|
||
|
{
|
||
|
/// Exchange MTU Request - 0x02
|
||
|
uint8_t code;
|
||
|
/// Client Rx MTU size
|
||
|
uint16_t mtu_size;
|
||
|
};
|
||
|
|
||
|
/// Exchange MTU Response
|
||
|
struct l2cc_att_mtu_rsp
|
||
|
{
|
||
|
/// Exchange MTU Response - 0x03
|
||
|
uint8_t code;
|
||
|
/// Server Rx MTU size
|
||
|
uint16_t mtu_size;
|
||
|
};
|
||
|
|
||
|
/// Find Information Request
|
||
|
struct l2cc_att_find_info_req
|
||
|
{
|
||
|
/// Find Information Request - 0x04
|
||
|
uint8_t code;
|
||
|
/// First requested handle number
|
||
|
uint16_t shdl;
|
||
|
/// Last requested handle number
|
||
|
uint16_t ehdl;
|
||
|
};
|
||
|
|
||
|
/// Find Information Response
|
||
|
struct l2cc_att_find_info_rsp
|
||
|
{
|
||
|
/// Find Information Response - 0x05
|
||
|
uint8_t code;
|
||
|
/// The format of the information data.
|
||
|
uint8_t format;
|
||
|
/// Data length
|
||
|
uint16_t data_len;
|
||
|
///The information data whose format is determined by the Format field
|
||
|
uint8_t data[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Find By Type Value Request
|
||
|
struct l2cc_att_find_by_type_req
|
||
|
{
|
||
|
/// Find By Type Value Request - 0x06
|
||
|
uint8_t code;
|
||
|
/// First requested handle number
|
||
|
uint16_t shdl;
|
||
|
/// Last requested handle number
|
||
|
uint16_t ehdl;
|
||
|
/// 2 octet UUID to find
|
||
|
uint16_t type;
|
||
|
/// Attribute value length
|
||
|
uint16_t val_len;
|
||
|
/// Attribute value to find
|
||
|
uint8_t val[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Find By Type Value Response
|
||
|
struct l2cc_att_find_by_type_rsp
|
||
|
{
|
||
|
/// Find By Type Value Response - 0x07
|
||
|
uint8_t code;
|
||
|
/// data length
|
||
|
uint16_t data_len;
|
||
|
/// A list of 1 or more Handle Informations.
|
||
|
uint8_t data[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read By Type Request
|
||
|
struct l2cc_att_rd_by_type_req
|
||
|
{
|
||
|
/// Read By Type Request - 0x08
|
||
|
uint8_t code;
|
||
|
/// Starting Handle
|
||
|
uint16_t shdl;
|
||
|
/// Ending Handle
|
||
|
uint16_t ehdl;
|
||
|
/// Attribute uuid length
|
||
|
uint16_t uuid_len;
|
||
|
/// Attribute type uuid
|
||
|
uint8_t uuid[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read By Type Response
|
||
|
struct l2cc_att_rd_by_type_rsp
|
||
|
{
|
||
|
/// Read By Type Response - 0x09
|
||
|
uint8_t code;
|
||
|
/// size of each attribute handle listed
|
||
|
uint8_t each_len;
|
||
|
/// Attribute Data length
|
||
|
uint16_t data_len;
|
||
|
/// A list of Attribute Data.
|
||
|
uint8_t data[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read Request
|
||
|
struct l2cc_att_rd_req
|
||
|
{
|
||
|
/// Read Request - 0x0A
|
||
|
uint8_t code;
|
||
|
/// Attribute Handle
|
||
|
uint16_t handle;
|
||
|
};
|
||
|
|
||
|
/// Read Response
|
||
|
struct l2cc_att_rd_rsp
|
||
|
{
|
||
|
/// Read Response - 0x0B
|
||
|
uint8_t code;
|
||
|
/// value length
|
||
|
uint16_t value_len;
|
||
|
/// The value of the attribute with the handle given
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read Blob Request
|
||
|
struct l2cc_att_rd_blob_req
|
||
|
{
|
||
|
/// Read Blob Request - 0x0C
|
||
|
uint8_t code;
|
||
|
/// Attribute Handle
|
||
|
uint16_t handle;
|
||
|
/// The offset of the first octet to be read
|
||
|
uint16_t offset;
|
||
|
};
|
||
|
|
||
|
/// Read Blob Response
|
||
|
struct l2cc_att_rd_blob_rsp
|
||
|
{
|
||
|
/// Read Blob Response - 0x0D
|
||
|
uint8_t code;
|
||
|
/// value length
|
||
|
uint16_t value_len;
|
||
|
/// Part of the value of the attribute with the handle given
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read Multiple Request
|
||
|
struct l2cc_att_rd_mult_req
|
||
|
{
|
||
|
/// Read Multiple Request - 0x0E
|
||
|
uint8_t code;
|
||
|
/// Number of handles
|
||
|
uint16_t nb_handles;
|
||
|
/// A set of two or more attribute handles.
|
||
|
uint16_t handles[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read Multiple Response
|
||
|
struct l2cc_att_rd_mult_rsp
|
||
|
{
|
||
|
/// Read Multiple Response - 0x0F
|
||
|
uint8_t code;
|
||
|
/// value length
|
||
|
uint16_t value_len;
|
||
|
/// A set of two or more values.
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read by Group Type Request
|
||
|
struct l2cc_att_rd_by_grp_type_req
|
||
|
{
|
||
|
/// Read by Group Type Request - 0x10
|
||
|
uint8_t code;
|
||
|
/// First requested handle number
|
||
|
uint16_t shdl;
|
||
|
/// Last requested handle number
|
||
|
uint16_t ehdl;
|
||
|
/// Attribute uuid length
|
||
|
uint16_t uuid_len;
|
||
|
/// Attribute type uuid (2 or 16 octet UUID)
|
||
|
uint8_t uuid[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Read By Group Type Response
|
||
|
struct l2cc_att_rd_by_grp_type_rsp
|
||
|
{
|
||
|
/// Read By Group Type Response - 0x11
|
||
|
uint8_t code;
|
||
|
/// size of each attribute handle listed
|
||
|
uint8_t each_len;
|
||
|
/// Attribute Data length
|
||
|
uint16_t data_len;
|
||
|
/// A list of Attribute Data.
|
||
|
uint8_t data[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Write Request
|
||
|
struct l2cc_att_wr_req
|
||
|
{
|
||
|
/// Write Request - 0x12
|
||
|
uint8_t code;
|
||
|
/// The handle of the attribute to be written
|
||
|
uint16_t handle;
|
||
|
/// Value length
|
||
|
uint16_t value_len;
|
||
|
/// The value to be written to the attribute
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Write Response
|
||
|
struct l2cc_att_wr_rsp
|
||
|
{
|
||
|
/// Write Response - 0x13
|
||
|
uint8_t code;
|
||
|
};
|
||
|
|
||
|
/// Write Command
|
||
|
struct l2cc_att_wr_cmd
|
||
|
{
|
||
|
/// Write Command - 0x52
|
||
|
uint8_t code;
|
||
|
/// The handle of the attribute to be written
|
||
|
uint16_t handle;
|
||
|
/// Value length
|
||
|
uint16_t value_len;
|
||
|
/// The value to be written to the attribute
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Signed Write Command
|
||
|
struct l2cc_att_sign_wr_cmd
|
||
|
{
|
||
|
/// Write Command - 0xD2
|
||
|
uint8_t code;
|
||
|
/// The handle of the attribute to be written
|
||
|
uint16_t handle;
|
||
|
/// Attribute Data length
|
||
|
uint16_t value_len;
|
||
|
/// The value to be written to the attribute
|
||
|
/// + 12 bytes of signatures:
|
||
|
/// Authentication signature for the Attribute Upload, Attribute Handle and Attribute
|
||
|
/// Value Parameters
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Prepare Write Request
|
||
|
struct l2cc_att_prep_wr_req
|
||
|
{
|
||
|
/// Prepare Write Request - 0x16
|
||
|
uint8_t code;
|
||
|
/// The handle of the attribute to be written
|
||
|
uint16_t handle;
|
||
|
/// The offset of the first octet to be written
|
||
|
uint16_t offset;
|
||
|
/// Value length
|
||
|
uint16_t value_len;
|
||
|
/// The value to be written to the attribute
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Prepare Write Response
|
||
|
struct l2cc_att_prep_wr_rsp
|
||
|
{
|
||
|
/// Prepare Write Response - 0x17
|
||
|
uint8_t code;
|
||
|
/// The handle of the attribute to be written
|
||
|
uint16_t handle;
|
||
|
/// The offset of the first octet to be written
|
||
|
uint16_t offset;
|
||
|
/// Value length
|
||
|
uint16_t value_len;
|
||
|
/// The value to be written to the attribute
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Execute Write Request
|
||
|
struct l2cc_att_exe_wr_req
|
||
|
{
|
||
|
/// Execute Write Request - 0x18
|
||
|
uint8_t code;
|
||
|
/// 0x00 - Cancel all prepared writes
|
||
|
/// 0x01 - Immediately write all pending prepared values
|
||
|
uint8_t flags;
|
||
|
};
|
||
|
|
||
|
/// Execute Write Response
|
||
|
struct l2cc_att_exe_wr_rsp
|
||
|
{
|
||
|
/// Prepare Write Response - 0x19
|
||
|
uint8_t code;
|
||
|
};
|
||
|
|
||
|
/// Handle Value Notification
|
||
|
struct l2cc_att_hdl_val_ntf
|
||
|
{
|
||
|
/// Handle Value Notification - 0x1B
|
||
|
uint8_t code;
|
||
|
/// The handle of the attribute to be written
|
||
|
uint16_t handle;
|
||
|
/// Value length
|
||
|
uint16_t value_len;
|
||
|
/// The current value of the attribute
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Handle Value Indication
|
||
|
struct l2cc_att_hdl_val_ind
|
||
|
{
|
||
|
/// Handle Value Indication - 0x1D
|
||
|
uint8_t code;
|
||
|
/// The handle of the attribute to be written
|
||
|
uint16_t handle;
|
||
|
/// Value length
|
||
|
uint16_t value_len;
|
||
|
/// The current value of the attribute
|
||
|
uint8_t value[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Handle Value Confirmation
|
||
|
struct l2cc_att_hdl_val_cfm
|
||
|
{
|
||
|
/// Handle Value Confirmation - 0x1E
|
||
|
uint8_t code;
|
||
|
};
|
||
|
|
||
|
/* LE Credit Based PDUs */
|
||
|
|
||
|
/// LE Generic send data request (includes total SDU Length)
|
||
|
struct l2cc_lecb_send_data_req
|
||
|
{
|
||
|
/// Code variable (RFU)
|
||
|
uint8_t code;
|
||
|
/// SDU data length
|
||
|
uint16_t sdu_data_len;
|
||
|
/// Data
|
||
|
uint8_t sdu_data[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
|
||
|
struct l2cc_pdu_data_t
|
||
|
{
|
||
|
/// L2Cap packet code.
|
||
|
uint8_t code;
|
||
|
};
|
||
|
|
||
|
/// Default L2Cap PDU definition
|
||
|
struct l2cc_pdu
|
||
|
{
|
||
|
/// L2Cap Payload Length
|
||
|
uint16_t payld_len;
|
||
|
/// L2Cap Channel ID
|
||
|
uint16_t chan_id;
|
||
|
|
||
|
/// Data PDU definition
|
||
|
union l2cc_pdu_data
|
||
|
{
|
||
|
/// L2Cap packet code.
|
||
|
uint8_t code;
|
||
|
|
||
|
/* LE Credit Based packets */
|
||
|
/// LE send first frame
|
||
|
struct l2cc_lecb_send_data_req send_lecb_data_req;
|
||
|
|
||
|
/* Connection Signaling Packets */
|
||
|
/// Command Reject
|
||
|
struct l2cc_reject reject;
|
||
|
/// Connection Parameter Update Request
|
||
|
struct l2cc_update_param_req update_req;
|
||
|
/// Connection Parameter Update Response
|
||
|
struct l2cc_update_param_rsp update_rsp;
|
||
|
/// LE Credit based connection request
|
||
|
struct l2cc_lecb_req credit_con_req;
|
||
|
/// LE Credit based connection response
|
||
|
struct l2cc_lecb_rsp credit_con_rsp;
|
||
|
/// LE Flow Control Credit
|
||
|
struct l2cc_le_flow_ctl_credit flow_ctl_credit;
|
||
|
/// LE disconnection request
|
||
|
struct l2cc_disconnection_req disc_req;
|
||
|
/// LE disconnection response
|
||
|
struct l2cc_disconnection_rsp disc_rsp;
|
||
|
|
||
|
/* Security manager PDUs */
|
||
|
/// Pairing Request
|
||
|
struct l2cc_pairing_req pairing_req;
|
||
|
/// Pairing Response
|
||
|
struct l2cc_pairing_rsp pairing_rsp;
|
||
|
/// Pairing Confirm
|
||
|
struct l2cc_pairing_cfm pairing_cfm;
|
||
|
/// Pairing Random
|
||
|
struct l2cc_pairing_random pairing_random;
|
||
|
/// Pairing Failed
|
||
|
struct l2cc_pairing_failed pairing_failed;
|
||
|
/// Encryption Information
|
||
|
struct l2cc_encryption_inf encryption_inf;
|
||
|
/// Master Identification
|
||
|
struct l2cc_master_id master_id;
|
||
|
/// Identity Information
|
||
|
struct l2cc_identity_inf identity_inf;
|
||
|
/// Identity Address Information
|
||
|
struct l2cc_id_addr_inf id_addr_inf;
|
||
|
/// Signing Information
|
||
|
struct l2cc_signing_inf signing_inf;
|
||
|
/// Security Request
|
||
|
struct l2cc_security_req security_req;
|
||
|
/// Public Keys
|
||
|
struct l2cc_publc_key public_key;
|
||
|
/// Key Press Notification
|
||
|
struct l2cc_keypress_noticication keypress_noticication;
|
||
|
/// DH Key Check
|
||
|
struct l2cc_dhkey_check dhkey_check;
|
||
|
/* Attribute protocol PDUs */
|
||
|
/// Error response
|
||
|
struct l2cc_att_err_rsp err_rsp;
|
||
|
/// Exchange MTU Request
|
||
|
struct l2cc_att_mtu_req mtu_req;
|
||
|
/// Exchange MTU Response
|
||
|
struct l2cc_att_mtu_rsp mtu_rsp;
|
||
|
/// Find Information Request
|
||
|
struct l2cc_att_find_info_req find_info_req;
|
||
|
/// Find Information Response
|
||
|
struct l2cc_att_find_info_rsp find_info_rsp;
|
||
|
/// Find By Type Value Request
|
||
|
struct l2cc_att_find_by_type_req find_by_type_req;
|
||
|
/// Find By Type Value Response
|
||
|
struct l2cc_att_find_by_type_rsp find_by_type_rsp;
|
||
|
/// Read By Type Request
|
||
|
struct l2cc_att_rd_by_type_req rd_by_type_req;
|
||
|
/// Read By Type Response
|
||
|
struct l2cc_att_rd_by_type_rsp rd_by_type_rsp;
|
||
|
/// Read Request
|
||
|
struct l2cc_att_rd_req rd_req;
|
||
|
/// Read Response
|
||
|
struct l2cc_att_rd_rsp rd_rsp;
|
||
|
/// Read Blob Request
|
||
|
struct l2cc_att_rd_blob_req rd_blob_req;
|
||
|
/// Read Blob Response
|
||
|
struct l2cc_att_rd_blob_rsp rd_blob_rsp;
|
||
|
/// Read Multiple Request
|
||
|
struct l2cc_att_rd_mult_req rd_mult_req;
|
||
|
/// Read Multiple Response
|
||
|
struct l2cc_att_rd_mult_rsp rd_mult_rsp;
|
||
|
/// Read by Group Type Request
|
||
|
struct l2cc_att_rd_by_grp_type_req rd_by_grp_type_req;
|
||
|
/// Read By Group Type Response
|
||
|
struct l2cc_att_rd_by_grp_type_rsp rd_by_grp_type_rsp;
|
||
|
/// Write Request
|
||
|
struct l2cc_att_wr_req wr_req;
|
||
|
/// Write Response
|
||
|
struct l2cc_att_wr_rsp wr_rsp;
|
||
|
/// Write Command
|
||
|
struct l2cc_att_wr_cmd wr_cmd;
|
||
|
/// Signed Write Command
|
||
|
struct l2cc_att_sign_wr_cmd sign_wr_cmd;
|
||
|
/// Prepare Write Request
|
||
|
struct l2cc_att_prep_wr_req prep_wr_req;
|
||
|
/// Prepare Write Response
|
||
|
struct l2cc_att_prep_wr_rsp prep_wr_rsp;
|
||
|
/// Execute Write Request
|
||
|
struct l2cc_att_exe_wr_req exe_wr_req;
|
||
|
/// Execute Write Response
|
||
|
struct l2cc_att_exe_wr_rsp exe_wr_rsp;
|
||
|
/// Handle Value Notification
|
||
|
struct l2cc_att_hdl_val_ntf hdl_val_ntf;
|
||
|
/// Handle Value Indication
|
||
|
struct l2cc_att_hdl_val_ind hdl_val_ind;
|
||
|
/// Handle Value Confirmation
|
||
|
struct l2cc_att_hdl_val_cfm hdl_val_cfm;
|
||
|
} data;
|
||
|
};
|
||
|
|
||
|
/// Default L2Cap DBG pdu definition
|
||
|
struct l2cc_dbg_pdu
|
||
|
{
|
||
|
/// Data length
|
||
|
uint16_t length;
|
||
|
/// data
|
||
|
uint8_t data[__ARRAY_EMPTY];
|
||
|
};
|
||
|
|
||
|
/// Default L2Cap SDU definition
|
||
|
struct l2cc_sdu;
|
||
|
|
||
|
|
||
|
/// @} L2CC_PDU
|
||
|
|
||
|
|
||
|
#endif /* _L2CC_PDU_H_ */
|