/* * 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_L2CAP_PRIV_ #define H_L2CAP_PRIV_ #include "ble_l2cap_coc_priv.h" #include "host/ble_l2cap.h" #include #include "stats/stats.h" #include "os/queue.h" #include "os/os_mbuf.h" #ifdef __cplusplus extern "C" { #endif struct ble_hs_conn; struct hci_data_hdr; STATS_SECT_START(ble_l2cap_stats) STATS_SECT_ENTRY(chan_create) STATS_SECT_ENTRY(chan_delete) STATS_SECT_ENTRY(update_init) STATS_SECT_ENTRY(update_rx) STATS_SECT_ENTRY(update_fail) STATS_SECT_ENTRY(proc_timeout) STATS_SECT_ENTRY(sig_tx) STATS_SECT_ENTRY(sig_rx) STATS_SECT_ENTRY(sm_tx) STATS_SECT_ENTRY(sm_rx) STATS_SECT_END extern STATS_SECT_DECL(ble_l2cap_stats) ble_l2cap_stats; extern struct os_mempool ble_l2cap_chan_pool; /* This is nimble specific; packets sent to the black hole CID do not elicit * an "invalid CID" response. */ #define BLE_L2CAP_CID_BLACK_HOLE 0xffff #define BLE_L2CAP_HDR_SZ 4 typedef uint8_t ble_l2cap_chan_flags; typedef int ble_l2cap_rx_fn(struct ble_l2cap_chan *chan); struct ble_l2cap_chan { SLIST_ENTRY(ble_l2cap_chan) next; uint16_t conn_handle; uint16_t dcid; uint16_t scid; /* Unions just to avoid confusion on MPS/MTU. * In CoC context, L2CAP MTU is MPS */ union { uint16_t my_mtu; uint16_t my_coc_mps; }; union { uint16_t peer_mtu; uint16_t peer_coc_mps; }; ble_l2cap_chan_flags flags; struct os_mbuf *rx_buf; uint16_t rx_len; /* Length of current reassembled rx packet. */ ble_l2cap_rx_fn *rx_fn; #if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) != 0 uint16_t psm; struct ble_l2cap_coc_endpoint coc_rx; struct ble_l2cap_coc_endpoint coc_tx; uint16_t initial_credits; ble_l2cap_event_fn *cb; void *cb_arg; #endif }; struct ble_l2cap_hdr { uint16_t len; uint16_t cid; }; typedef int ble_l2cap_tx_fn(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); #define BLE_L2CAP_CHAN_F_TXED_MTU 0x01 /* We have sent our MTU. */ SLIST_HEAD(ble_l2cap_chan_list, ble_l2cap_chan); int ble_l2cap_parse_hdr(struct os_mbuf *om, int off, struct ble_l2cap_hdr *l2cap_hdr); struct os_mbuf *ble_l2cap_prepend_hdr(struct os_mbuf *om, uint16_t cid, uint16_t len); struct ble_l2cap_chan *ble_l2cap_chan_alloc(uint16_t conn_handle); void ble_l2cap_chan_free(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); bool ble_l2cap_is_mtu_req_sent(const struct ble_l2cap_chan *chan); int ble_l2cap_rx(struct ble_hs_conn *conn, struct hci_data_hdr *hci_hdr, struct os_mbuf *om, ble_l2cap_rx_fn **out_rx_cb, int *out_reject_cid); int ble_l2cap_tx(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan, struct os_mbuf *txom); void ble_l2cap_remove_rx(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); int ble_l2cap_init(void); /* Below experimental API is available when BLE_VERSION >= 52 */ int ble_l2cap_enhanced_connect(uint16_t conn_handle, uint16_t psm, uint16_t mtu, uint8_t num, struct os_mbuf *sdu_rx[], ble_l2cap_event_fn *cb, void *cb_arg); int ble_l2cap_reconfig(struct ble_l2cap_chan *chans[], uint8_t num, uint16_t new_mtu); #ifdef __cplusplus } #endif #endif