aboutsummaryrefslogtreecommitdiff
path: root/stack/bnep/bnep_int.h
blob: e25e7f8226b09fd371d123ccd459bccf14e734f4 (plain)
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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
/******************************************************************************
 *
 *  Copyright (C) 2001-2012 Broadcom Corporation
 *
 *  Licensed 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.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This file contains internally used BNEP definitions
 *
 ******************************************************************************/

#ifndef BNEP_INT_H
#define BNEP_INT_H

#include "bnep_api.h"
#include "bt_common.h"
#include "bt_target.h"
#include "btm_int.h"
#include "btu.h"

/* BNEP frame types
*/
#define BNEP_FRAME_GENERAL_ETHERNET 0x00
#define BNEP_FRAME_CONTROL 0x01
#define BNEP_FRAME_COMPRESSED_ETHERNET 0x02
#define BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY 0x03
#define BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY 0x04

/* BNEP filter control message types
*/
#define BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD 0x00
#define BNEP_SETUP_CONNECTION_REQUEST_MSG 0x01
#define BNEP_SETUP_CONNECTION_RESPONSE_MSG 0x02
#define BNEP_FILTER_NET_TYPE_SET_MSG 0x03
#define BNEP_FILTER_NET_TYPE_RESPONSE_MSG 0x04
#define BNEP_FILTER_MULTI_ADDR_SET_MSG 0x05
#define BNEP_FILTER_MULTI_ADDR_RESPONSE_MSG 0x06

/* BNEP header extension types
*/
#define BNEP_EXTENSION_FILTER_CONTROL 0x00

/* BNEP Setup Connection response codes
*/
#define BNEP_SETUP_CONN_OK 0x0000
#define BNEP_SETUP_INVALID_DEST_UUID 0x0001
#define BNEP_SETUP_INVALID_SRC_UUID 0x0002
#define BNEP_SETUP_INVALID_UUID_SIZE 0x0003
#define BNEP_SETUP_CONN_NOT_ALLOWED 0x0004

/* BNEP filter control response codes
*/
#define BNEP_FILTER_CRL_OK 0x0000
#define BNEP_FILTER_CRL_UNSUPPORTED 0x0001
#define BNEP_FILTER_CRL_BAD_RANGE 0x0002
#define BNEP_FILTER_CRL_MAX_REACHED 0x0003
#define BNEP_FILTER_CRL_SECURITY_ERR 0x0004

/* 802.1p protocol packet will have actual protocol field in side the payload */
#define BNEP_802_1_P_PROTOCOL 0x8100

/* Timeout definitions.  */
/* Connection related timeout */
#define BNEP_CONN_TIMEOUT_MS (20 * 1000)
/* host response timeout */
#define BNEP_HOST_TIMEOUT_MS (200 * 1000)
#define BNEP_FILTER_SET_TIMEOUT_MS (10 * 1000)

/* Define the Out-Flow default values. */
#define BNEP_OFLOW_QOS_FLAG 0
#define BNEP_OFLOW_SERV_TYPE 0
#define BNEP_OFLOW_TOKEN_RATE 0
#define BNEP_OFLOW_TOKEN_BUCKET_SIZE 0
#define BNEP_OFLOW_PEAK_BANDWIDTH 0
#define BNEP_OFLOW_LATENCY 0
#define BNEP_OFLOW_DELAY_VARIATION 0

/* Define the In-Flow default values. */
#define BNEP_IFLOW_QOS_FLAG 0
#define BNEP_IFLOW_SERV_TYPE 0
#define BNEP_IFLOW_TOKEN_RATE 0
#define BNEP_IFLOW_TOKEN_BUCKET_SIZE 0
#define BNEP_IFLOW_PEAK_BANDWIDTH 0
#define BNEP_IFLOW_LATENCY 0
#define BNEP_IFLOW_DELAY_VARIATION 0

#define BNEP_FLUSH_TO 0xFFFF

#define BNEP_MAX_RETRANSMITS 3

/* Define the BNEP Connection Control Block
*/
typedef struct {
#define BNEP_STATE_IDLE 0
#define BNEP_STATE_CONN_START 1
#define BNEP_STATE_CFG_SETUP 2
#define BNEP_STATE_CONN_SETUP 3
#define BNEP_STATE_SEC_CHECKING 4
#define BNEP_STATE_SETUP_RCVD 5
#define BNEP_STATE_CONNECTED 6
  uint8_t con_state;

#define BNEP_FLAGS_IS_ORIG 0x01
#define BNEP_FLAGS_HIS_CFG_DONE 0x02
#define BNEP_FLAGS_MY_CFG_DONE 0x04
#define BNEP_FLAGS_L2CAP_CONGESTED 0x08
#define BNEP_FLAGS_FILTER_RESP_PEND 0x10
#define BNEP_FLAGS_MULTI_RESP_PEND 0x20
#define BNEP_FLAGS_SETUP_RCVD 0x40
#define BNEP_FLAGS_CONN_COMPLETED 0x80
  uint8_t con_flags;
  BT_HDR* p_pending_data;

  uint16_t l2cap_cid;
  RawAddress rem_bda;
  uint16_t rem_mtu_size;
  alarm_t* conn_timer;
  fixed_queue_t* xmit_q;

  uint16_t sent_num_filters;
  uint16_t sent_prot_filter_start[BNEP_MAX_PROT_FILTERS];
  uint16_t sent_prot_filter_end[BNEP_MAX_PROT_FILTERS];

  uint16_t sent_mcast_filters;
  RawAddress sent_mcast_filter_start[BNEP_MAX_MULTI_FILTERS];
  RawAddress sent_mcast_filter_end[BNEP_MAX_MULTI_FILTERS];

  uint16_t rcvd_num_filters;
  uint16_t rcvd_prot_filter_start[BNEP_MAX_PROT_FILTERS];
  uint16_t rcvd_prot_filter_end[BNEP_MAX_PROT_FILTERS];

  uint16_t rcvd_mcast_filters;
  RawAddress rcvd_mcast_filter_start[BNEP_MAX_MULTI_FILTERS];
  RawAddress rcvd_mcast_filter_end[BNEP_MAX_MULTI_FILTERS];

  uint16_t bad_pkts_rcvd;
  uint8_t re_transmits;
  uint16_t handle;
  tBT_UUID prv_src_uuid;
  tBT_UUID prv_dst_uuid;
  tBT_UUID src_uuid;
  tBT_UUID dst_uuid;

} tBNEP_CONN;

/*  The main BNEP control block
*/
typedef struct {
  tL2CAP_CFG_INFO l2cap_my_cfg; /* My L2CAP config     */
  tBNEP_CONN bcb[BNEP_MAX_CONNECTIONS];

  tBNEP_CONNECT_IND_CB* p_conn_ind_cb;
  tBNEP_CONN_STATE_CB* p_conn_state_cb;
  tBNEP_DATA_IND_CB* p_data_ind_cb;
  tBNEP_DATA_BUF_CB* p_data_buf_cb;
  tBNEP_FILTER_IND_CB* p_filter_ind_cb;
  tBNEP_MFILTER_IND_CB* p_mfilter_ind_cb;
  tBNEP_TX_DATA_FLOW_CB* p_tx_data_flow_cb;

  tL2CAP_APPL_INFO reg_info;

  bool profile_registered; /* true when we got our BD addr */
  uint8_t trace_level;

} tBNEP_CB;

/* Global BNEP data
*/
extern tBNEP_CB bnep_cb;

/* Functions provided by bnep_main.cc
*/
extern tBNEP_RESULT bnep_register_with_l2cap(void);
extern void bnep_disconnect(tBNEP_CONN* p_bcb, uint16_t reason);
extern tBNEP_CONN* bnep_conn_originate(uint8_t* p_bd_addr);
extern void bnep_conn_timer_timeout(void* data);
extern void bnep_connected(tBNEP_CONN* p_bcb);

/* Functions provided by bnep_utils.cc
*/
extern tBNEP_CONN* bnepu_find_bcb_by_cid(uint16_t cid);
extern tBNEP_CONN* bnepu_find_bcb_by_bd_addr(const RawAddress& p_bda);
extern tBNEP_CONN* bnepu_allocate_bcb(const RawAddress& p_rem_bda);
extern void bnepu_release_bcb(tBNEP_CONN* p_bcb);
extern void bnepu_send_peer_our_filters(tBNEP_CONN* p_bcb);
extern void bnepu_send_peer_our_multi_filters(tBNEP_CONN* p_bcb);
extern bool bnepu_does_dest_support_prot(tBNEP_CONN* p_bcb, uint16_t protocol);
extern void bnepu_build_bnep_hdr(tBNEP_CONN* p_bcb, BT_HDR* p_buf,
                                 uint16_t protocol,
                                 const RawAddress* p_src_addr,
                                 const RawAddress* p_dest_addr, bool ext_bit);
extern void test_bnepu_build_bnep_hdr(tBNEP_CONN* p_bcb, BT_HDR* p_buf,
                                      uint16_t protocol, uint8_t* p_src_addr,
                                      uint8_t* p_dest_addr, uint8_t type);

extern tBNEP_CONN* bnepu_get_route_to_dest(uint8_t* p_bda);
extern void bnepu_check_send_packet(tBNEP_CONN* p_bcb, BT_HDR* p_buf);
extern void bnep_send_command_not_understood(tBNEP_CONN* p_bcb,
                                             uint8_t cmd_code);
extern void bnepu_process_peer_filter_set(tBNEP_CONN* p_bcb, uint8_t* p_filters,
                                          uint16_t len);
extern void bnepu_process_peer_filter_rsp(tBNEP_CONN* p_bcb, uint8_t* p_data);
extern void bnepu_process_multicast_filter_rsp(tBNEP_CONN* p_bcb,
                                               uint8_t* p_data);
extern void bnep_send_conn_req(tBNEP_CONN* p_bcb);
extern void bnep_send_conn_responce(tBNEP_CONN* p_bcb, uint16_t resp_code);
extern void bnep_process_setup_conn_req(tBNEP_CONN* p_bcb, uint8_t* p_setup,
                                        uint8_t len);
extern void bnep_process_setup_conn_responce(tBNEP_CONN* p_bcb,
                                             uint8_t* p_setup);
extern uint8_t* bnep_process_control_packet(tBNEP_CONN* p_bcb, uint8_t* p,
                                            uint16_t* len, bool is_ext);
extern void bnep_sec_check_complete(const RawAddress* bd_addr,
                                    tBT_TRANSPORT trasnport, void* p_ref_data,
                                    uint8_t result);
extern tBNEP_RESULT bnep_is_packet_allowed(tBNEP_CONN* p_bcb,
                                           const RawAddress& p_dest_addr,
                                           uint16_t protocol,
                                           bool fw_ext_present,
                                           uint8_t* p_data);
extern uint32_t bnep_get_uuid32(tBT_UUID* src_uuid);

#endif