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