| /* |
| * 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 <inttypes.h> |
| #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. */ |
| #define BLE_L2CAP_CHAN_F_DISCONNECTING 0x02 /* We have sent L2CAP Disconnect. */ |
| |
| 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 |