1 /****************************************************************************** 2 * 3 * Copyright 2001-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * This interface file contains the interface to the Bluetooth Network 22 * Encapsilation Protocol (BNEP). 23 * 24 ******************************************************************************/ 25 #ifndef BNEP_API_H 26 #define BNEP_API_H 27 28 #include <cstdint> 29 30 #include "stack/include/bt_hdr.h" 31 #include "stack/include/l2cap_types.h" 32 #include "types/bluetooth/uuid.h" 33 #include "types/raw_address.h" 34 35 /***************************************************************************** 36 * Constants 37 ****************************************************************************/ 38 39 /* Define the minimum offset needed in a GKI buffer for 40 * sending BNEP packets. Note, we are currently not sending 41 * extension headers, but may in the future, so allow 42 * space for them 43 */ 44 #define BNEP_MINIMUM_OFFSET (15 + L2CAP_MIN_OFFSET) 45 #define BNEP_INVALID_HANDLE 0xFFFF 46 47 /***************************************************************************** 48 * Type Definitions 49 ****************************************************************************/ 50 51 /* Define the result codes from BNEP 52 */ 53 enum { 54 BNEP_SUCCESS, /* Success */ 55 BNEP_CONN_DISCONNECTED, /* Connection terminated */ 56 BNEP_NO_RESOURCES, /* No resources */ 57 BNEP_MTU_EXCEEDED, /* Attempt to write long data */ 58 BNEP_INVALID_OFFSET, /* Insufficient offset in GKI buffer */ 59 BNEP_CONN_FAILED, /* Connection failed */ 60 BNEP_CONN_FAILED_CFG, /* Connection failed cos of config */ 61 BNEP_CONN_FAILED_SRC_UUID, /* Connection failed wrong source UUID */ 62 BNEP_CONN_FAILED_DST_UUID, /* Connection failed wrong destination UUID */ 63 BNEP_CONN_FAILED_UUID_SIZE, /* Connection failed wrong size UUID */ 64 BNEP_Q_SIZE_EXCEEDED, /* Too many buffers to dest */ 65 BNEP_TOO_MANY_FILTERS, /* Too many local filters specified */ 66 BNEP_SET_FILTER_FAIL, /* Set Filter failed */ 67 BNEP_WRONG_HANDLE, /* Wrong handle for the connection */ 68 BNEP_WRONG_STATE, /* Connection is in wrong state */ 69 BNEP_SECURITY_FAIL, /* Failed because of security */ 70 BNEP_IGNORE_CMD, /* To ignore the rcvd command */ 71 BNEP_TX_FLOW_ON, /* tx data flow enabled */ 72 BNEP_TX_FLOW_OFF /* tx data flow disabled */ 73 }; 74 typedef uint8_t tBNEP_RESULT; 75 76 /*************************** 77 * Callback Functions 78 ***************************/ 79 80 /* Connection state change callback prototype. Parameters are 81 * Connection handle 82 * BD Address of remote 83 * Connection state change result 84 * BNEP_SUCCESS indicates connection is success 85 * All values are used to indicate the reason for failure 86 * Flag to indicate if it is just a role change 87 */ 88 typedef void(tBNEP_CONN_STATE_CB)(uint16_t handle, const RawAddress& rem_bda, tBNEP_RESULT result, 89 bool is_role_change); 90 91 /* Connection indication callback prototype. Parameters are 92 * BD Address of remote, remote UUID and local UUID 93 * and flag to indicate role change and handle to the connection 94 * When BNEP calls this function profile should 95 * use BNEP_ConnectResp call to accept or reject the request 96 */ 97 typedef void(tBNEP_CONNECT_IND_CB)(uint16_t handle, const RawAddress& bd_addr, 98 const bluetooth::Uuid& remote_uuid, 99 const bluetooth::Uuid& local_uuid, bool is_role_change); 100 101 /* Data buffer received indication callback prototype. Parameters are 102 * Handle to the connection 103 * Source BD/Ethernet Address 104 * Dest BD/Ethernet address 105 * Protocol 106 * Pointer to the buffer 107 * Flag to indicate whether extension headers to be forwarded are 108 * present 109 */ 110 typedef void(tBNEP_DATA_BUF_CB)(uint16_t handle, const RawAddress& src, const RawAddress& dst, 111 uint16_t protocol, BT_HDR* p_buf, bool fw_ext_present); 112 113 /* Data received indication callback prototype. Parameters are 114 * Handle to the connection 115 * Source BD/Ethernet Address 116 * Dest BD/Ethernet address 117 * Protocol 118 * Pointer to the beginning of the data 119 * Length of data 120 * Flag to indicate whether extension headers to be forwarded are 121 * present 122 */ 123 typedef void(tBNEP_DATA_IND_CB)(uint16_t handle, const RawAddress& src, const RawAddress& dst, 124 uint16_t protocol, uint8_t* p_data, uint16_t len, 125 bool fw_ext_present); 126 127 /* Flow control callback for TX data. Parameters are 128 * Handle to the connection 129 * Event flow status 130 */ 131 typedef void(tBNEP_TX_DATA_FLOW_CB)(uint16_t handle, tBNEP_RESULT event); 132 133 /* Filters received indication callback prototype. Parameters are 134 * Handle to the connection 135 * true if the cb is called for indication 136 * Ignore this if it is indication, otherwise it is the result 137 * for the filter set operation performed by the local 138 * device 139 * Number of protocol filters present 140 * Pointer to the filters start. Filters are present in pairs 141 * of start of the range and end of the range. 142 * They will be present in big endian order. First 143 * two bytes will be starting of the first range and 144 * next two bytes will be ending of the range. 145 */ 146 typedef void(tBNEP_FILTER_IND_CB)(uint16_t handle, bool indication, tBNEP_RESULT result, 147 uint16_t num_filters, uint8_t* p_filters); 148 149 /* Multicast Filters received indication callback prototype. Parameters are 150 * Handle to the connection 151 * true if the cb is called for indication 152 * Ignore this if it is indication, otherwise it is the result 153 * for the filter set operation performed by the local 154 * device 155 * Number of multicast filters present 156 * Pointer to the filters start. Filters are present in pairs 157 * of start of the range and end of the range. 158 * First six bytes will be starting of the first range and 159 * next six bytes will be ending of the range. 160 */ 161 typedef void(tBNEP_MFILTER_IND_CB)(uint16_t handle, bool indication, tBNEP_RESULT result, 162 uint16_t num_mfilters, uint8_t* p_mfilters); 163 164 /* This is the structure used by profile to register with BNEP */ 165 typedef struct { 166 tBNEP_CONNECT_IND_CB* p_conn_ind_cb; /* To indicate the conn request */ 167 tBNEP_CONN_STATE_CB* p_conn_state_cb; /* To indicate conn state change */ 168 tBNEP_DATA_IND_CB* p_data_ind_cb; /* To pass the data received */ 169 tBNEP_DATA_BUF_CB* p_data_buf_cb; /* To pass the data buffer received */ 170 tBNEP_TX_DATA_FLOW_CB* p_tx_data_flow_cb; /* data flow callback */ 171 tBNEP_FILTER_IND_CB* p_filter_ind_cb; /* To indicate that peer set protocol filters */ 172 tBNEP_MFILTER_IND_CB* p_mfilter_ind_cb; /* To indicate that peer set mcast filters */ 173 } tBNEP_REGISTER; 174 175 /***************************************************************************** 176 * External Function Declarations 177 ****************************************************************************/ 178 /******************************************************************************* 179 * 180 * Function BNEP_Register 181 * 182 * Description This function is called by the upper layer to register 183 * its callbacks with BNEP 184 * 185 * Parameters: p_reg_info - contains all callback function pointers 186 * 187 * 188 * Returns BNEP_SUCCESS if registered successfully 189 * BNEP_FAILURE if connection state callback is missing 190 * 191 ******************************************************************************/ 192 tBNEP_RESULT BNEP_Register(tBNEP_REGISTER* p_reg_info); 193 194 /******************************************************************************* 195 * 196 * Function BNEP_Deregister 197 * 198 * Description This function is called by the upper layer to de-register 199 * its callbacks. 200 * 201 * Parameters: void 202 * 203 * 204 * Returns void 205 * 206 ******************************************************************************/ 207 void BNEP_Deregister(void); 208 209 /******************************************************************************* 210 * 211 * Function BNEP_Connect 212 * 213 * Description This function creates a BNEP connection to a remote 214 * device. 215 * 216 * Parameters: p_rem_addr - BD_ADDR of the peer 217 * src_uuid - source uuid for the connection 218 * dst_uuid - destination uuid for the connection 219 * p_handle - pointer to return the handle for the connection 220 * 221 * Returns BNEP_SUCCESS if connection started 222 * BNEP_NO_RESOURCES if no resources 223 * 224 ******************************************************************************/ 225 tBNEP_RESULT BNEP_Connect(const RawAddress& p_rem_bda, const bluetooth::Uuid& src_uuid, 226 const bluetooth::Uuid& dst_uuid, uint16_t* p_handle, uint32_t mx_chan_id); 227 228 /******************************************************************************* 229 * 230 * Function BNEP_ConnectResp 231 * 232 * Description This function is called in response to connection indication 233 * 234 * 235 * Parameters: handle - handle given in the connection indication 236 * resp - response for the connection indication 237 * 238 * Returns BNEP_SUCCESS if connection started 239 * BNEP_WRONG_HANDLE if the connection is not found 240 * BNEP_WRONG_STATE if the response is not expected 241 * 242 ******************************************************************************/ 243 tBNEP_RESULT BNEP_ConnectResp(uint16_t handle, tBNEP_RESULT resp); 244 245 /******************************************************************************* 246 * 247 * Function BNEP_Disconnect 248 * 249 * Description This function is called to close the specified connection. 250 * 251 * Parameters: handle - handle of the connection 252 * 253 * Returns BNEP_SUCCESS if connection is disconnected 254 * BNEP_WRONG_HANDLE if no connection is not found 255 * 256 ******************************************************************************/ 257 tBNEP_RESULT BNEP_Disconnect(uint16_t handle); 258 259 /******************************************************************************* 260 * 261 * Function BNEP_WriteBuf 262 * 263 * Description This function sends data in a GKI buffer on BNEP connection 264 * 265 * Parameters: handle - handle of the connection to write 266 * dest_addr - BD_ADDR/Ethernet addr of the destination 267 * p_buf - pointer to address of buffer with data 268 * protocol - protocol type of the packet 269 * src_addr - (optional) BD_ADDR/ethernet address of the 270 * source (should be kEmpty if it is the local 271 *BD Addr) fw_ext_present - forwarded extensions present 272 * 273 * Returns: BNEP_WRONG_HANDLE - if passed handle is not valid 274 * BNEP_MTU_EXCEEDED - If the data length is greater 275 * than MTU 276 * BNEP_IGNORE_CMD - If the packet is filtered out 277 * BNEP_Q_SIZE_EXCEEDED - If the Tx Q is full 278 * BNEP_SUCCESS - If written successfully 279 * 280 ******************************************************************************/ 281 tBNEP_RESULT BNEP_WriteBuf(uint16_t handle, const RawAddress& dest_addr, BT_HDR* p_buf, 282 uint16_t protocol, const RawAddress& src_addr, bool fw_ext_present); 283 284 /******************************************************************************* 285 * 286 * Function BNEP_Write 287 * 288 * Description This function sends data over a BNEP connection 289 * 290 * Parameters: handle - handle of the connection to write 291 * dest_addr - BD_ADDR/Ethernet addr of the destination 292 * p_data - pointer to data start 293 * protocol - protocol type of the packet 294 * src_addr - (optional) BD_ADDR/ethernet address of the 295 * source (should be kEmpty if it is the local 296 *BD Addr) fw_ext_present - forwarded extensions present 297 * 298 * Returns: BNEP_WRONG_HANDLE - if passed handle is not valid 299 * BNEP_MTU_EXCEEDED - If the data length is greater than 300 * the MTU 301 * BNEP_IGNORE_CMD - If the packet is filtered out 302 * BNEP_Q_SIZE_EXCEEDED - If the Tx Q is full 303 * BNEP_NO_RESOURCES - If not able to allocate a buffer 304 * BNEP_SUCCESS - If written successfully 305 * 306 ******************************************************************************/ 307 tBNEP_RESULT BNEP_Write(uint16_t handle, const RawAddress& dest_addr, uint8_t* p_data, uint16_t len, 308 uint16_t protocol, const RawAddress& src_addr, bool fw_ext_present); 309 310 /******************************************************************************* 311 * 312 * Function BNEP_SetProtocolFilters 313 * 314 * Description This function sets the protocol filters on peer device 315 * 316 * Parameters: handle - Handle for the connection 317 * num_filters - total number of filter ranges 318 * p_start_array - Array of beginings of all protocol ranges 319 * p_end_array - Array of ends of all protocol ranges 320 * 321 * Returns BNEP_WRONG_HANDLE - if the connection handle is 322 * not valid 323 * BNEP_SET_FILTER_FAIL - if the connection is in the 324 * wrong state 325 * BNEP_TOO_MANY_FILTERS - if too many filters 326 * BNEP_SUCCESS - if request sent successfully 327 * 328 ******************************************************************************/ 329 tBNEP_RESULT BNEP_SetProtocolFilters(uint16_t handle, uint16_t num_filters, uint16_t* p_start_array, 330 uint16_t* p_end_array); 331 332 /******************************************************************************* 333 * 334 * Function BNEP_SetMulticastFilters 335 * 336 * Description This function sets the filters for multicast addresses for 337 * BNEP. 338 * 339 * Parameters: handle - Handle for the connection 340 * num_filters - total number of filter ranges 341 * p_start_array - Pointer to sequence of beginings of all 342 * multicast address ranges 343 * p_end_array - Pointer to sequence of ends of all 344 * multicast address ranges 345 * 346 * Returns BNEP_WRONG_HANDLE - if the connection handle is 347 * not valid 348 * BNEP_SET_FILTER_FAIL - if the connection is in the 349 * wrong state 350 * BNEP_TOO_MANY_FILTERS - if too many filters 351 * BNEP_SUCCESS - if request sent successfully 352 * 353 ******************************************************************************/ 354 tBNEP_RESULT BNEP_SetMulticastFilters(uint16_t handle, uint16_t num_filters, uint8_t* p_start_array, 355 uint8_t* p_end_array); 356 357 /******************************************************************************* 358 * 359 * Function BNEP_Init 360 * 361 * Description This function initializes the BNEP unit. It should be called 362 * before accessing any other APIs to initialize the control 363 * block 364 * 365 * Returns void 366 * 367 ******************************************************************************/ 368 void BNEP_Init(void); 369 370 #endif 371