/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ #ifndef H_BLE_L2CAP_ #define H_BLE_L2CAP_ #include "nimble/nimble_opt.h" #ifdef __cplusplus extern "C" { #endif struct ble_l2cap_sig_update_req; struct ble_hs_conn; #define BLE_L2CAP_CID_ATT 4 #define BLE_L2CAP_CID_SIG 5 #define BLE_L2CAP_CID_SM 6 #define BLE_L2CAP_SIG_OP_REJECT 0x01 #define BLE_L2CAP_SIG_OP_CONNECT_REQ 0x02 #define BLE_L2CAP_SIG_OP_CONNECT_RSP 0x03 #define BLE_L2CAP_SIG_OP_CONFIG_REQ 0x04 #define BLE_L2CAP_SIG_OP_CONFIG_RSP 0x05 #define BLE_L2CAP_SIG_OP_DISCONN_REQ 0x06 #define BLE_L2CAP_SIG_OP_DISCONN_RSP 0x07 #define BLE_L2CAP_SIG_OP_ECHO_REQ 0x08 #define BLE_L2CAP_SIG_OP_ECHO_RSP 0x09 #define BLE_L2CAP_SIG_OP_INFO_REQ 0x0a #define BLE_L2CAP_SIG_OP_INFO_RSP 0x0b #define BLE_L2CAP_SIG_OP_CREATE_CHAN_REQ 0x0c #define BLE_L2CAP_SIG_OP_CREATE_CHAN_RSP 0x0d #define BLE_L2CAP_SIG_OP_MOVE_CHAN_REQ 0x0e #define BLE_L2CAP_SIG_OP_MOVE_CHAN_RSP 0x0f #define BLE_L2CAP_SIG_OP_MOVE_CHAN_CONF_REQ 0x10 #define BLE_L2CAP_SIG_OP_MOVE_CHAN_CONF_RSP 0x11 #define BLE_L2CAP_SIG_OP_UPDATE_REQ 0x12 #define BLE_L2CAP_SIG_OP_UPDATE_RSP 0x13 #define BLE_L2CAP_SIG_OP_LE_CREDIT_CONNECT_REQ 0x14 #define BLE_L2CAP_SIG_OP_LE_CREDIT_CONNECT_RSP 0x15 #define BLE_L2CAP_SIG_OP_FLOW_CTRL_CREDIT 0x16 #define BLE_L2CAP_SIG_OP_CREDIT_CONNECT_REQ 0x17 #define BLE_L2CAP_SIG_OP_CREDIT_CONNECT_RSP 0x18 #define BLE_L2CAP_SIG_OP_CREDIT_RECONFIG_REQ 0x19 #define BLE_L2CAP_SIG_OP_CREDIT_RECONFIG_RSP 0x1A #define BLE_L2CAP_SIG_OP_MAX 0x1B #define BLE_L2CAP_SIG_ERR_CMD_NOT_UNDERSTOOD 0x0000 #define BLE_L2CAP_SIG_ERR_MTU_EXCEEDED 0x0001 #define BLE_L2CAP_SIG_ERR_INVALID_CID 0x0002 #define BLE_L2CAP_COC_ERR_CONNECTION_SUCCESS 0x0000 #define BLE_L2CAP_COC_ERR_UNKNOWN_LE_PSM 0x0002 #define BLE_L2CAP_COC_ERR_NO_RESOURCES 0x0004 #define BLE_L2CAP_COC_ERR_INSUFFICIENT_AUTHEN 0x0005 #define BLE_L2CAP_COC_ERR_INSUFFICIENT_AUTHOR 0x0006 #define BLE_L2CAP_COC_ERR_INSUFFICIENT_KEY_SZ 0x0007 #define BLE_L2CAP_COC_ERR_INSUFFICIENT_ENC 0x0008 #define BLE_L2CAP_COC_ERR_INVALID_SOURCE_CID 0x0009 #define BLE_L2CAP_COC_ERR_SOURCE_CID_ALREADY_USED 0x000A #define BLE_L2CAP_COC_ERR_UNACCEPTABLE_PARAMETERS 0x000B #define BLE_L2CAP_COC_ERR_INVALID_PARAMETERS 0x000C #define BLE_L2CAP_ERR_RECONFIG_SUCCEED 0x0000 #define BLE_L2CAP_ERR_RECONFIG_REDUCTION_MTU_NOT_ALLOWED 0x0001 #define BLE_L2CAP_ERR_RECONFIG_REDUCTION_MPS_NOT_ALLOWED 0x0002 #define BLE_L2CAP_ERR_RECONFIG_INVALID_DCID 0x0003 #define BLE_L2CAP_ERR_RECONFIG_UNACCAPTED_PARAM 0x0004 #define BLE_L2CAP_EVENT_COC_CONNECTED 0 #define BLE_L2CAP_EVENT_COC_DISCONNECTED 1 #define BLE_L2CAP_EVENT_COC_ACCEPT 2 #define BLE_L2CAP_EVENT_COC_DATA_RECEIVED 3 #define BLE_L2CAP_EVENT_COC_TX_UNSTALLED 4 #define BLE_L2CAP_EVENT_COC_RECONFIG_COMPLETED 5 #define BLE_L2CAP_EVENT_COC_PEER_RECONFIGURED 6 typedef void ble_l2cap_sig_update_fn(uint16_t conn_handle, int status, void *arg); struct ble_l2cap_sig_update_params { uint16_t itvl_min; uint16_t itvl_max; uint16_t slave_latency; uint16_t timeout_multiplier; }; int ble_l2cap_sig_update(uint16_t conn_handle, struct ble_l2cap_sig_update_params *params, ble_l2cap_sig_update_fn *cb, void *cb_arg); struct ble_l2cap_chan; /** * Represents a L2CAP-related event. * When such an event occurs, the host notifies the application by passing an * instance of this structure to an application-specified callback. */ struct ble_l2cap_event { /** * Indicates the type of L2CAP event that occurred. This is one of the * BLE_L2CAP_EVENT codes. */ uint8_t type; /** * A discriminated union containing additional details concerning the L2CAP * event. The 'type' field indicates which member of the union is valid. */ union { /** * Represents a connection attempt. Valid for the following event * types: * o BLE_L2CAP_EVENT_COC_CONNECTED */ struct { /** * The status of the connection attempt; * o 0: the connection was successfully established. * o BLE host error code: the connection attempt failed for * the specified reason. */ int status; /** Connection handle of the relevant connection */ uint16_t conn_handle; /** The L2CAP channel of the relevant L2CAP connection. */ struct ble_l2cap_chan *chan; } connect; /** * Represents a terminated connection. Valid for the following event * types: * o BLE_L2CAP_EVENT_COC_DISCONNECTED */ struct { /** Connection handle of the relevant connection */ uint16_t conn_handle; /** Information about the L2CAP connection prior to termination. */ struct ble_l2cap_chan *chan; } disconnect; /** * Represents connection accept. Valid for the following event * types: * o BLE_L2CAP_EVENT_COC_ACCEPT */ struct { /** Connection handle of the relevant connection */ uint16_t conn_handle; /** MTU supported by peer device on the channel */ uint16_t peer_sdu_size; /** The L2CAP channel of the relevant L2CAP connection. */ struct ble_l2cap_chan *chan; } accept; /** * Represents received data. Valid for the following event * types: * o BLE_L2CAP_EVENT_COC_DATA_RECEIVED */ struct { /** Connection handle of the relevant connection */ uint16_t conn_handle; /** The L2CAP channel of the relevant L2CAP connection. */ struct ble_l2cap_chan *chan; /** The mbuf with received SDU. */ struct os_mbuf *sdu_rx; } receive; /** * Represents tx_unstalled data. Valid for the following event * types: * o BLE_L2CAP_EVENT_COC_TX_UNSTALLED */ struct { /** Connection handle of the relevant connection */ uint16_t conn_handle; /** The L2CAP channel of the relevant L2CAP connection. */ struct ble_l2cap_chan *chan; /** * The status of the send attempt which was stalled due to * lack of credits; This can be non zero only if there * is an issue with memory allocation for following SDU fragments. * In such a case last SDU has been partially sent to peer device * and it is up to application to decide how to handle it. */ int status; } tx_unstalled; /** * Represents reconfiguration done. Valid for the following event * types: * o BLE_L2CAP_EVENT_COC_RECONFIG_COMPLETED * o BLE_L2CAP_EVENT_COC_PEER_RECONFIGURED */ struct { /** * The status of the reconfiguration attempt; * o 0: the reconfiguration was successfully done. * o BLE host error code: the reconfiguration attempt failed for * the specified reason. */ int status; /** Connection handle of the relevant connection */ uint16_t conn_handle; /** The L2CAP channel of the relevant L2CAP connection. */ struct ble_l2cap_chan *chan; } reconfigured; }; }; struct ble_l2cap_chan_info { uint16_t scid; uint16_t dcid; uint16_t our_l2cap_mtu; uint16_t peer_l2cap_mtu; uint16_t psm; uint16_t our_coc_mtu; uint16_t peer_coc_mtu; }; typedef int ble_l2cap_event_fn(struct ble_l2cap_event *event, void *arg); uint16_t ble_l2cap_get_conn_handle(struct ble_l2cap_chan *chan); int ble_l2cap_create_server(uint16_t psm, uint16_t mtu, ble_l2cap_event_fn *cb, void *cb_arg); int ble_l2cap_connect(uint16_t conn_handle, uint16_t psm, uint16_t mtu, struct os_mbuf *sdu_rx, ble_l2cap_event_fn *cb, void *cb_arg); int ble_l2cap_disconnect(struct ble_l2cap_chan *chan); int ble_l2cap_send(struct ble_l2cap_chan *chan, struct os_mbuf *sdu_tx); int ble_l2cap_recv_ready(struct ble_l2cap_chan *chan, struct os_mbuf *sdu_rx); int ble_l2cap_get_chan_info(struct ble_l2cap_chan *chan, struct ble_l2cap_chan_info *chan_info); #ifdef __cplusplus } #endif #endif