Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | /** @file * @brief Bluetooth L2CAP handling */ /* * Copyright (c) 2015 Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1) Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2) Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3) Neither the name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __BT_L2CAP_H #define __BT_L2CAP_H #ifdef __cplusplus extern "C" { #endif #if defined(CONFIG_BLUETOOTH_CENTRAL) || defined(CONFIG_BLUETOOTH_PERIPHERAL) #include <net/buf.h> #include <bluetooth/conn.h> /** @brief L2CAP Endpoint structure. */ struct bt_l2cap_endpoint { /** Endpoint CID */ uint16_t cid; /** Endpoint Maximum PDU payload Size */ uint16_t mps; /** Endpoint Maximum Transmission Unit */ uint16_t mtu; /** Endpoint credits */ struct nano_sem credits; }; /** @brief L2CAP Channel structure. */ struct bt_l2cap_chan { /** Channel connection reference */ struct bt_conn *conn; /** Channel operations reference */ struct bt_l2cap_chan_ops *ops; /** Channel Transmission Endpoint */ struct bt_l2cap_endpoint tx; /** Channel Receiving Endpoint */ struct bt_l2cap_endpoint rx; struct net_buf *_sdu; uint16_t _sdu_len; uint8_t _ident; struct bt_l2cap_chan *_next; }; /** @brief L2CAP Channel operations structure. */ struct bt_l2cap_chan_ops { /** Channel connected callback * * If this callback is provided it will be called whenever the * connection completes. * * @param chan The channel that has been connected */ void (*connected)(struct bt_l2cap_chan *chan); /** Channel disconnected callback * * If this callback is provided it will be called whenever the * channel is disconnected, including when a connection gets * rejected. * * @param chan The channel that has been Disconnected */ void (*disconnected)(struct bt_l2cap_chan *chan); /** Channel encrypt_change callback * * If this callback is provided it will be called whenever the * security level changed. * * @param chan The channel which has encryption status changed. */ void (*encrypt_change)(struct bt_l2cap_chan *chan); /** Channel alloc_buf callback * * If this callback is provided the channel will use it to allocate * buffers to store incoming data. * * @param chan The channel requesting a buffer. * * @return Allocated buffer. */ struct net_buf *(*alloc_buf)(struct bt_l2cap_chan *chan); /** Channel recv callback * * @param chan The channel receiving data. * @param buf Buffer containing incoming data. */ void (*recv)(struct bt_l2cap_chan *chan, struct net_buf *buf); }; #if defined(CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL) /** @def BT_L2CAP_CHAN_SEND_RESERVE * @brief Headroom needed for outgoing buffers */ #define BT_L2CAP_CHAN_SEND_RESERVE (CONFIG_BLUETOOTH_HCI_SEND_RESERVE + 4 + 4 \ + 2) /** @brief L2CAP Server structure. */ struct bt_l2cap_server { /** Server PSM */ uint16_t psm; /** Server accept callback * * This callback is called whenever a new incoming connection requires * authorization. * * @param conn The connection that is requesting authorization * @param chan Pointer to received the allocated channel * * @return 0 in case of success or negative value in case of error. */ int (*accept)(struct bt_conn *conn, struct bt_l2cap_chan **chan); struct bt_l2cap_server *_next; }; /** @brief Register L2CAP server. * * Register L2CAP server for a PSM, each new connection is authorized using * the accept() callback which in case of success shall allocate the channel * structure to be used by the new connection. * * @param server Server structure. * * @return 0 in case of success or negative value in case of error. */ int bt_l2cap_server_register(struct bt_l2cap_server *server); /** @brief Connect L2CAP channel * * Connect L2CAP channel by PSM, once the connection is completed channel * connected() callback will be called. If the connection is rejected * disconnected() callback is called instead. * * @param conn Connection object. * @param chan Channel object. * @param psm Channel PSM to connect to. * * @return 0 in case of success or negative value in case of error. */ int bt_l2cap_chan_connect(struct bt_conn *conn, struct bt_l2cap_chan *chan, uint16_t psm); /** @brief Disconnect L2CAP channel * * Disconnect L2CAP channel, if the connection is pending it will be * canceled and as a result the channel disconnected() callback is called. * * @param chan Channel object. * * @return 0 in case of success or negative value in case of error. */ int bt_l2cap_chan_disconnect(struct bt_l2cap_chan *chan); /** @brief Send data to L2CAP channel * * Send data from buffer to the channel. This procedure may block waiting for * credits to send data therefore it shall be used from a fiber to be able to * receive credits when necessary. * * @return Bytes sent in case of success or negative value in case of error. */ int bt_l2cap_chan_send(struct bt_l2cap_chan *chan, struct net_buf *buf); #endif /* CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL */ #endif /* CONFIG_BLUETOOTH_CENTRAL || CONFIG_BLUETOOTH_PERIPHERAL */ #ifdef __cplusplus } #endif #endif /* __BT_L2CAP_H */ |