1 /******************************************************************************
2 *
3 * Copyright (C) 2004-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 is the implementation file for data gateway call-in functions.
22 *
23 ******************************************************************************/
24
25 #include "bt_target.h"
26
27 #include <string.h>
28
29 #include "gki.h"
30 #include "pan_api.h"
31 #include "bta_api.h"
32 #include "bta_pan_api.h"
33 #include "bta_pan_ci.h"
34 #include "bta_pan_int.h"
35 #include "bt_utils.h"
36
37 #if defined(BTA_PAN_INCLUDED) && (BTA_PAN_INCLUDED == TRUE)
38
39 /*******************************************************************************
40 **
41 ** Function bta_pan_ci_tx_ready
42 **
43 ** Description This function sends an event to PAN indicating the phone is
44 ** ready for more data and PAN should call bta_pan_co_tx_path().
45 ** This function is used when the TX data path is configured
46 ** to use a pull interface.
47 **
48 **
49 ** Returns void
50 **
51 *******************************************************************************/
bta_pan_ci_tx_ready(UINT16 handle)52 void bta_pan_ci_tx_ready(UINT16 handle)
53 {
54 BT_HDR *p_buf;
55
56 if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
57 {
58 p_buf->layer_specific = handle;
59 p_buf->event = BTA_PAN_CI_TX_READY_EVT;
60 bta_sys_sendmsg(p_buf);
61 }
62 }
63
64 /*******************************************************************************
65 **
66 ** Function bta_pan_ci_rx_ready
67 **
68 ** Description This function sends an event to PAN indicating the phone
69 ** has data available to send to PAN and PAN should call
70 ** bta_pan_co_rx_path(). This function is used when the RX
71 ** data path is configured to use a pull interface.
72 **
73 **
74 ** Returns void
75 **
76 *******************************************************************************/
bta_pan_ci_rx_ready(UINT16 handle)77 void bta_pan_ci_rx_ready(UINT16 handle)
78 {
79 BT_HDR *p_buf;
80
81 if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
82 {
83 p_buf->layer_specific = handle;
84 p_buf->event = BTA_PAN_CI_RX_READY_EVT;
85 bta_sys_sendmsg(p_buf);
86 }
87 }
88
89 /*******************************************************************************
90 **
91 ** Function bta_pan_ci_tx_flow
92 **
93 ** Description This function is called to enable or disable data flow on
94 ** the TX path. The phone should call this function to
95 ** disable data flow when it is congested and cannot handle
96 ** any more data sent by bta_pan_co_tx_write() or
97 ** bta_pan_co_tx_writebuf(). This function is used when the
98 ** TX data path is configured to use a push interface.
99 **
100 **
101 ** Returns void
102 **
103 *******************************************************************************/
bta_pan_ci_tx_flow(UINT16 handle,BOOLEAN enable)104 void bta_pan_ci_tx_flow(UINT16 handle, BOOLEAN enable)
105 {
106 tBTA_PAN_CI_TX_FLOW *p_buf;
107
108 if ((p_buf = (tBTA_PAN_CI_TX_FLOW *) GKI_getbuf(sizeof(tBTA_PAN_CI_TX_FLOW))) != NULL)
109 {
110 p_buf->hdr.layer_specific = handle;
111 p_buf->hdr.event = BTA_PAN_CI_TX_FLOW_EVT;
112 p_buf->enable = enable;
113 bta_sys_sendmsg(p_buf);
114 }
115 }
116
117 /*******************************************************************************
118 **
119 ** Function bta_pan_ci_rx_write
120 **
121 ** Description This function is called to send data to PAN when the RX path
122 ** is configured to use a push interface. The function copies
123 ** data to an event buffer and sends it to PAN.
124 **
125 **
126 ** Returns void
127 **
128 *******************************************************************************/
bta_pan_ci_rx_write(UINT16 handle,BD_ADDR dst,BD_ADDR src,UINT16 protocol,UINT8 * p_data,UINT16 len,BOOLEAN ext)129 void bta_pan_ci_rx_write(UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol,
130 UINT8 *p_data, UINT16 len, BOOLEAN ext)
131 {
132 BT_HDR * p_buf;
133
134 if((p_buf = (BT_HDR *) GKI_getpoolbuf(PAN_POOL_ID)) != NULL)
135 {
136
137
138 p_buf->offset = PAN_MINIMUM_OFFSET;
139
140 /* copy all other params before the data */
141 bdcpy(((tBTA_PAN_DATA_PARAMS *)p_buf)->src, src);
142 bdcpy(((tBTA_PAN_DATA_PARAMS *)p_buf)->dst, dst);
143 ((tBTA_PAN_DATA_PARAMS *)p_buf)->protocol = protocol;
144 ((tBTA_PAN_DATA_PARAMS *)p_buf)->ext = ext;
145 p_buf->len=len;
146
147 /* copy data */
148 memcpy((UINT8 *)(p_buf + 1) + p_buf->offset, p_data, len);
149
150 p_buf->layer_specific = handle;
151 p_buf->event = BTA_PAN_CI_RX_WRITEBUF_EVT;
152 bta_sys_sendmsg(p_buf);
153 }
154
155 }
156
157 /*******************************************************************************
158 **
159 ** Function bta_pan_ci_rx_writebuf
160 **
161 ** Description This function is called to send data to the phone when
162 ** the RX path is configured to use a push interface with
163 ** zero copy. The function sends an event to PAN containing
164 ** the data buffer. The buffer must be allocated using
165 ** functions GKI_getbuf() or GKI_getpoolbuf(). The buffer
166 ** will be freed by BTA; the phone must not free the buffer.
167 **
168 **
169 ** Returns void
170 **
171 *******************************************************************************/
bta_pan_ci_rx_writebuf(UINT16 handle,BD_ADDR dst,BD_ADDR src,UINT16 protocol,BT_HDR * p_buf,BOOLEAN ext)172 void bta_pan_ci_rx_writebuf(UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol,
173 BT_HDR *p_buf, BOOLEAN ext)
174 {
175
176 /* copy all other params before the data */
177 bdcpy(((tBTA_PAN_DATA_PARAMS *)p_buf)->src, src);
178 bdcpy(((tBTA_PAN_DATA_PARAMS *)p_buf)->dst, dst);
179 ((tBTA_PAN_DATA_PARAMS *)p_buf)->protocol = protocol;
180 ((tBTA_PAN_DATA_PARAMS *)p_buf)->ext = ext;
181
182 p_buf->layer_specific = handle;
183 p_buf->event = BTA_PAN_CI_RX_WRITEBUF_EVT;
184 bta_sys_sendmsg(p_buf);
185 }
186
187
188
189
190 /*******************************************************************************
191 **
192 ** Function bta_pan_ci_readbuf
193 **
194 ** Description
195 **
196 **
197 ** Returns void
198 **
199 *******************************************************************************/
bta_pan_ci_readbuf(UINT16 handle,BD_ADDR src,BD_ADDR dst,UINT16 * p_protocol,BOOLEAN * p_ext,BOOLEAN * p_forward)200 BT_HDR * bta_pan_ci_readbuf(UINT16 handle, BD_ADDR src, BD_ADDR dst, UINT16* p_protocol,
201 BOOLEAN* p_ext, BOOLEAN* p_forward)
202 {
203 tBTA_PAN_SCB * p_scb;
204 BT_HDR * p_buf;
205
206 p_scb = bta_pan_scb_by_handle(handle);
207
208 p_buf = (BT_HDR *)GKI_dequeue(&p_scb->data_queue);
209
210 if(p_buf)
211 {
212 bdcpy(src,((tBTA_PAN_DATA_PARAMS *)p_buf)->src);
213 bdcpy(dst,((tBTA_PAN_DATA_PARAMS *)p_buf)->dst);
214 *p_protocol = ((tBTA_PAN_DATA_PARAMS *)p_buf)->protocol;
215 *p_ext = ((tBTA_PAN_DATA_PARAMS *)p_buf)->ext;
216 *p_forward = ((tBTA_PAN_DATA_PARAMS *)p_buf)->forward;
217 }
218
219 return p_buf;
220 }
221
222
223 /*******************************************************************************
224 **
225 ** Function bta_pan_ci_set_mfilters
226 **
227 ** Description This function is called to set multicast filters
228 **
229 **
230 ** Returns void
231 **
232 *******************************************************************************/
bta_pan_ci_set_mfilters(UINT16 handle,UINT16 num_mcast_filters,UINT8 * p_start_array,UINT8 * p_end_array)233 void bta_pan_ci_set_mfilters(UINT16 handle, UINT16 num_mcast_filters, UINT8 *p_start_array,
234 UINT8 *p_end_array)
235 {
236
237 PAN_SetMulticastFilters(handle, num_mcast_filters, p_start_array, p_end_array);
238
239 }
240
241
242 /*******************************************************************************
243 **
244 ** Function bta_pan_ci_set_mfilters
245 **
246 ** Description This function is called to set protocol filters
247 **
248 **
249 ** Returns void
250 **
251 *******************************************************************************/
bta_pan_ci_set_pfilters(UINT16 handle,UINT16 num_filters,UINT16 * p_start_array,UINT16 * p_end_array)252 void bta_pan_ci_set_pfilters(UINT16 handle, UINT16 num_filters, UINT16 *p_start_array, UINT16 *p_end_array)
253 {
254
255 PAN_SetProtocolFilters(handle, num_filters, p_start_array, p_end_array );
256
257 }
258 #else
259
bta_pan_ci_tx_ready(UINT16 handle)260 void bta_pan_ci_tx_ready(UINT16 handle)
261 {
262 UNUSED(handle);
263 }
264
bta_pan_ci_rx_ready(UINT16 handle)265 void bta_pan_ci_rx_ready(UINT16 handle)
266 {
267 UNUSED(handle);
268 }
269
bta_pan_ci_tx_flow(UINT16 handle,BOOLEAN enable)270 void bta_pan_ci_tx_flow(UINT16 handle, BOOLEAN enable)
271 {
272 UNUSED(handle);
273 UNUSED(enable);
274 }
275
bta_pan_ci_rx_writebuf(UINT16 handle,BD_ADDR src,BD_ADDR dst,UINT16 protocol,BT_HDR * p_buf,BOOLEAN ext)276 void bta_pan_ci_rx_writebuf(UINT16 handle, BD_ADDR src, BD_ADDR dst, UINT16 protocol, BT_HDR *p_buf, BOOLEAN ext)
277 {
278 UNUSED(handle);
279 UNUSED(src);
280 UNUSED(dst);
281 UNUSED(protocol);
282 UNUSED(p_buf);
283 UNUSED(ext);
284 }
285
bta_pan_ci_readbuf(UINT16 handle,BD_ADDR src,BD_ADDR dst,UINT16 * p_protocol,BOOLEAN * p_ext,BOOLEAN * p_forward)286 BT_HDR * bta_pan_ci_readbuf(UINT16 handle, BD_ADDR src, BD_ADDR dst, UINT16 *p_protocol,
287 BOOLEAN* p_ext, BOOLEAN* p_forward)
288 {
289 UNUSED(handle);
290 UNUSED(src);
291 UNUSED(dst);
292 UNUSED(p_protocol);
293 UNUSED(p_ext);
294 UNUSED(p_forward);
295 return NULL;
296 }
297
bta_pan_ci_set_pfilters(UINT16 handle,UINT16 num_filters,UINT16 * p_start_array,UINT16 * p_end_array)298 void bta_pan_ci_set_pfilters(UINT16 handle, UINT16 num_filters, UINT16 *p_start_array, UINT16 *p_end_array)
299 {
300 UNUSED(handle);
301 UNUSED(num_filters);
302 UNUSED(p_start_array);
303 UNUSED(p_end_array);
304 }
305
bta_pan_ci_set_mfilters(UINT16 handle,UINT16 num_mcast_filters,UINT8 * p_start_array,UINT8 * p_end_array)306 void bta_pan_ci_set_mfilters(UINT16 handle, UINT16 num_mcast_filters, UINT8 *p_start_array,
307 UINT8 *p_end_array)
308 {
309 UNUSED(handle);
310 UNUSED(num_mcast_filters);
311 UNUSED(p_start_array);
312 UNUSED(p_end_array);
313 }
314
315 #endif /* BTA_PAN_API */
316