blob: ac179be616e0dff179a35e706d8be8aa412414bd [file] [log] [blame]
/*
* 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_CREDIT_CONNECT_REQ 0x14
#define BLE_L2CAP_SIG_OP_CREDIT_CONNECT_RSP 0x15
#define BLE_L2CAP_SIG_OP_FLOW_CTRL_CREDIT 0x16
#define BLE_L2CAP_SIG_OP_MAX 0x17
#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_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
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;
};
};
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);
void ble_l2cap_recv_ready(struct ble_l2cap_chan *chan, struct os_mbuf *sdu_rx);
int ble_l2cap_get_scid(struct ble_l2cap_chan *chan);
int ble_l2cap_get_dcid(struct ble_l2cap_chan *chan);
int ble_l2cap_get_our_mtu(struct ble_l2cap_chan *chan);
int ble_l2cap_get_peer_mtu(struct ble_l2cap_chan *chan);
#ifdef __cplusplus
}
#endif
#endif