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