1 /******************************************************************************
2 *
3 * Copyright (C) 2009-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 * Filename: bta_pan_co.c
22 *
23 * Description: PAN stack callout api
24 *
25 *
26 ******************************************************************************/
27 #include "bta_pan_co.h"
28 #include <base/logging.h>
29 #include <hardware/bluetooth.h>
30 #include <hardware/bt_pan.h>
31 #include <string.h>
32 #include "bt_common.h"
33 #include "bta_api.h"
34 #include "bta_pan_api.h"
35 #include "bta_pan_ci.h"
36 #include "btif_pan_internal.h"
37 #include "btif_sock_thread.h"
38 #include "btif_util.h"
39 #include "osi/include/osi.h"
40 #include "pan_api.h"
41
42 /*******************************************************************************
43 *
44 * Function bta_pan_co_init
45 *
46 * Description
47 *
48 *
49 * Returns Data flow mask.
50 *
51 ******************************************************************************/
bta_pan_co_init(uint8_t * q_level)52 uint8_t bta_pan_co_init(uint8_t* q_level) {
53 BTIF_TRACE_API("bta_pan_co_init");
54
55 /* set the q_level to 30 buffers */
56 *q_level = 30;
57
58 // return (BTA_PAN_RX_PULL | BTA_PAN_TX_PULL);
59 return (BTA_PAN_RX_PUSH_BUF | BTA_PAN_RX_PUSH | BTA_PAN_TX_PULL);
60 }
61
62 /******************************************************************************
63 *
64 * Function bta_pan_co_open
65 *
66 * Description
67 *
68 *
69 *
70 *
71 *
72 * Returns void
73 *
74 ******************************************************************************/
bta_pan_co_open(uint16_t handle,uint8_t app_id,tBTA_PAN_ROLE local_role,tBTA_PAN_ROLE peer_role,const RawAddress & peer_addr)75 void bta_pan_co_open(uint16_t handle, uint8_t app_id, tBTA_PAN_ROLE local_role,
76 tBTA_PAN_ROLE peer_role, const RawAddress& peer_addr) {
77 BTIF_TRACE_API(
78 "bta_pan_co_open:app_id:%d, local_role:%d, peer_role:%d, "
79 "handle:%d",
80 app_id, local_role, peer_role, handle);
81 btpan_conn_t* conn = btpan_find_conn_addr(peer_addr);
82 if (conn == NULL)
83 conn = btpan_new_conn(handle, peer_addr, local_role, peer_role);
84 if (conn) {
85 BTIF_TRACE_DEBUG(
86 "bta_pan_co_open:tap_fd:%d, open_count:%d, "
87 "conn->handle:%d should = handle:%d, local_role:%d, remote_role:%d",
88 btpan_cb.tap_fd, btpan_cb.open_count, conn->handle, handle,
89 conn->local_role, conn->remote_role);
90 // refresh the role & bt address
91
92 btpan_cb.open_count++;
93 conn->handle = handle;
94 // conn->peer = peer_addr;
95 if (btpan_cb.tap_fd < 0) {
96 btpan_cb.tap_fd = btpan_tap_open();
97 if (btpan_cb.tap_fd >= 0) create_tap_read_thread(btpan_cb.tap_fd);
98 }
99 if (btpan_cb.tap_fd >= 0) {
100 btpan_cb.flow = 1;
101 conn->state = PAN_STATE_OPEN;
102 bta_pan_ci_rx_ready(handle);
103 }
104 }
105 }
106
107 /*******************************************************************************
108 *
109 * Function bta_pan_co_close
110 *
111 * Description This function is called by PAN when a connection to a
112 * peer is closed.
113 *
114 *
115 * Returns void
116 *
117 ******************************************************************************/
bta_pan_co_close(uint16_t handle,uint8_t app_id)118 void bta_pan_co_close(uint16_t handle, uint8_t app_id) {
119 BTIF_TRACE_API("bta_pan_co_close:app_id:%d, handle:%d", app_id, handle);
120 btpan_conn_t* conn = btpan_find_conn_handle(handle);
121 if (conn && conn->state == PAN_STATE_OPEN) {
122 BTIF_TRACE_DEBUG("bta_pan_co_close");
123
124 // let bta close event reset this handle as it needs
125 // the handle to find the connection upon CLOSE
126 // conn->handle = -1;
127 conn->state = PAN_STATE_CLOSE;
128 btpan_cb.open_count--;
129
130 if (btpan_cb.open_count == 0 && btpan_cb.tap_fd != -1) {
131 btpan_tap_close(btpan_cb.tap_fd);
132 btpan_cb.tap_fd = -1;
133 }
134 }
135 }
136
137 /*******************************************************************************
138 *
139 * Function bta_pan_co_tx_path
140 *
141 * Description This function is called by PAN to transfer data on the
142 * TX path; that is, data being sent from BTA to the phone.
143 * This function is used when the TX data path is configured
144 * to use the pull interface. The implementation of this
145 * function will typically call Bluetooth stack functions
146 * PORT_Read() or PORT_ReadData() to read data from RFCOMM
147 * and then a platform-specific function to send data that
148 * data to the phone.
149 *
150 *
151 * Returns void
152 *
153 ******************************************************************************/
bta_pan_co_tx_path(uint16_t handle,uint8_t app_id)154 void bta_pan_co_tx_path(uint16_t handle, uint8_t app_id) {
155 BT_HDR* p_buf;
156 RawAddress src;
157 RawAddress dst;
158 uint16_t protocol;
159 bool ext;
160 bool forward;
161
162 BTIF_TRACE_API("%s, handle:%d, app_id:%d", __func__, handle, app_id);
163
164 btpan_conn_t* conn = btpan_find_conn_handle(handle);
165 if (!conn) {
166 BTIF_TRACE_ERROR("%s: cannot find pan connection", __func__);
167 return;
168 } else if (conn->state != PAN_STATE_OPEN) {
169 BTIF_TRACE_ERROR("%s: conn is not opened, conn:%p, conn->state:%d",
170 __func__, conn, conn->state);
171 return;
172 }
173
174 do {
175 /* read next data buffer from pan */
176 p_buf = bta_pan_ci_readbuf(handle, src, dst, &protocol, &ext, &forward);
177 if (p_buf) {
178 BTIF_TRACE_DEBUG(
179 "%s, calling btapp_tap_send, "
180 "p_buf->len:%d, offset:%d",
181 __func__, p_buf->len, p_buf->offset);
182 if (is_empty_eth_addr(conn->eth_addr) && is_valid_bt_eth_addr(src)) {
183 VLOG(1) << __func__ << " pan bt peer addr: " << conn->peer
184 << " update its ethernet addr: " << src;
185 conn->eth_addr = src;
186 }
187 btpan_tap_send(btpan_cb.tap_fd, src, dst, protocol,
188 (char*)(p_buf + 1) + p_buf->offset, p_buf->len, ext,
189 forward);
190 osi_free(p_buf);
191 }
192
193 } while (p_buf != NULL);
194 }
195
196 /*******************************************************************************
197 *
198 * Function bta_pan_co_rx_path
199 *
200 * Description
201 *
202 *
203 *
204 *
205 * Returns void
206 *
207 ******************************************************************************/
bta_pan_co_rx_path(UNUSED_ATTR uint16_t handle,UNUSED_ATTR uint8_t app_id)208 void bta_pan_co_rx_path(UNUSED_ATTR uint16_t handle,
209 UNUSED_ATTR uint8_t app_id) {
210 BTIF_TRACE_API("bta_pan_co_rx_path not used");
211 }
212
213 /*******************************************************************************
214 *
215 * Function bta_pan_co_tx_write
216 *
217 * Description This function is called by PAN to send data to the phone
218 * when the TX path is configured to use a push interface.
219 * The implementation of this function must copy the data to
220 * the phone's memory.
221 *
222 *
223 * Returns void
224 *
225 ******************************************************************************/
bta_pan_co_tx_write(UNUSED_ATTR uint16_t handle,UNUSED_ATTR uint8_t app_id,UNUSED_ATTR const RawAddress & src,UNUSED_ATTR const RawAddress & dst,UNUSED_ATTR uint16_t protocol,UNUSED_ATTR uint8_t * p_data,UNUSED_ATTR uint16_t len,UNUSED_ATTR bool ext,UNUSED_ATTR bool forward)226 void bta_pan_co_tx_write(UNUSED_ATTR uint16_t handle,
227 UNUSED_ATTR uint8_t app_id,
228 UNUSED_ATTR const RawAddress& src,
229 UNUSED_ATTR const RawAddress& dst,
230 UNUSED_ATTR uint16_t protocol,
231 UNUSED_ATTR uint8_t* p_data, UNUSED_ATTR uint16_t len,
232 UNUSED_ATTR bool ext, UNUSED_ATTR bool forward) {
233 BTIF_TRACE_API("bta_pan_co_tx_write not used");
234 }
235
236 /*******************************************************************************
237 *
238 * Function bta_pan_co_tx_writebuf
239 *
240 * Description This function is called by PAN to send data to the phone
241 * when the TX path is configured to use a push interface with
242 * zero copy. The phone must free the buffer using function
243 * osi_free() when it is through processing the buffer.
244 *
245 *
246 * Returns true if flow enabled
247 *
248 ******************************************************************************/
bta_pan_co_tx_writebuf(UNUSED_ATTR uint16_t handle,UNUSED_ATTR uint8_t app_id,UNUSED_ATTR const RawAddress & src,UNUSED_ATTR const RawAddress & dst,UNUSED_ATTR uint16_t protocol,UNUSED_ATTR BT_HDR * p_buf,UNUSED_ATTR bool ext,UNUSED_ATTR bool forward)249 void bta_pan_co_tx_writebuf(UNUSED_ATTR uint16_t handle,
250 UNUSED_ATTR uint8_t app_id,
251 UNUSED_ATTR const RawAddress& src,
252 UNUSED_ATTR const RawAddress& dst,
253 UNUSED_ATTR uint16_t protocol,
254 UNUSED_ATTR BT_HDR* p_buf, UNUSED_ATTR bool ext,
255 UNUSED_ATTR bool forward) {
256 BTIF_TRACE_API("bta_pan_co_tx_writebuf not used");
257 }
258
259 /*******************************************************************************
260 *
261 * Function bta_pan_co_rx_flow
262 *
263 * Description This function is called by PAN to enable or disable
264 * data flow on the RX path when it is configured to use
265 * a push interface. If data flow is disabled the phone must
266 * not call bta_pan_ci_rx_write() or bta_pan_ci_rx_writebuf()
267 * until data flow is enabled again.
268 *
269 *
270 * Returns void
271 *
272 ******************************************************************************/
bta_pan_co_rx_flow(UNUSED_ATTR uint16_t handle,UNUSED_ATTR uint8_t app_id,UNUSED_ATTR bool enable)273 void bta_pan_co_rx_flow(UNUSED_ATTR uint16_t handle, UNUSED_ATTR uint8_t app_id,
274 UNUSED_ATTR bool enable) {
275 BTIF_TRACE_API("bta_pan_co_rx_flow, enabled:%d, not used", enable);
276 btpan_conn_t* conn = btpan_find_conn_handle(handle);
277 if (!conn || conn->state != PAN_STATE_OPEN) return;
278 btpan_set_flow_control(enable);
279 }
280
281 /*******************************************************************************
282 *
283 * Function bta_pan_co_filt_ind
284 *
285 * Description protocol filter indication from peer device
286 *
287 * Returns void
288 *
289 ******************************************************************************/
bta_pan_co_pfilt_ind(UNUSED_ATTR uint16_t handle,UNUSED_ATTR bool indication,UNUSED_ATTR tBTA_PAN_STATUS result,UNUSED_ATTR uint16_t len,UNUSED_ATTR uint8_t * p_filters)290 void bta_pan_co_pfilt_ind(UNUSED_ATTR uint16_t handle,
291 UNUSED_ATTR bool indication,
292 UNUSED_ATTR tBTA_PAN_STATUS result,
293 UNUSED_ATTR uint16_t len,
294 UNUSED_ATTR uint8_t* p_filters) {
295 BTIF_TRACE_API("bta_pan_co_pfilt_ind");
296 }
297
298 /*******************************************************************************
299 *
300 * Function bta_pan_co_mfilt_ind
301 *
302 * Description multicast filter indication from peer device
303 *
304 * Returns void
305 *
306 ******************************************************************************/
bta_pan_co_mfilt_ind(UNUSED_ATTR uint16_t handle,UNUSED_ATTR bool indication,UNUSED_ATTR tBTA_PAN_STATUS result,UNUSED_ATTR uint16_t len,UNUSED_ATTR uint8_t * p_filters)307 void bta_pan_co_mfilt_ind(UNUSED_ATTR uint16_t handle,
308 UNUSED_ATTR bool indication,
309 UNUSED_ATTR tBTA_PAN_STATUS result,
310 UNUSED_ATTR uint16_t len,
311 UNUSED_ATTR uint8_t* p_filters) {
312 BTIF_TRACE_API("bta_pan_co_mfilt_ind");
313 }
314