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