16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Copyright (C) 2001-2012 Broadcom Corporation
46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Licensed under the Apache License, Version 2.0 (the "License");
66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  you may not use this file except in compliance with the License.
76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  You may obtain a copy of the License at:
86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  http://www.apache.org/licenses/LICENSE-2.0
106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Unless required by applicable law or agreed to in writing, software
126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  distributed under the License is distributed on an "AS IS" BASIS,
136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  See the License for the specific language governing permissions and
156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  limitations under the License.
166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  This file contains the BNEP API code
226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h>
26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bnep_api.h"
27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bnep_int.h"
28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_Init
32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function initializes the BNEP unit. It should be called
34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  before accessing any other APIs to initialize the control block
35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid BNEP_Init (void)
40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset (&bnep_cb, 0, sizeof (tBNEP_CB));
42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(BNEP_INITIAL_TRACE_LEVEL)
44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.trace_level = BNEP_INITIAL_TRACE_LEVEL;
45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.trace_level = BT_TRACE_LEVEL_NONE;    /* No traces */
47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Start a timer to read our BD address */
50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btu_start_timer (&bnep_cb.bnep_tle, BTU_TTYPE_BNEP, 2);
51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_Register
57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by the upper layer to register
59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  its callbacks with BNEP
60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      p_reg_info - contains all callback function pointers
626ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BNEP_SUCCESS        if registered successfully
65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_FAILURE        if connection state callback is missing
66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
68e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_Register (tBNEP_REGISTER *p_reg_info)
69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* There should be connection state call back registered */
71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!p_reg_info) || (!(p_reg_info->p_conn_state_cb)))
72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BNEP_SECURITY_FAIL;
73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_conn_ind_cb       = p_reg_info->p_conn_ind_cb;
75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_conn_state_cb     = p_reg_info->p_conn_state_cb;
76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_data_ind_cb       = p_reg_info->p_data_ind_cb;
77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_data_buf_cb       = p_reg_info->p_data_buf_cb;
78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_filter_ind_cb     = p_reg_info->p_filter_ind_cb;
79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_mfilter_ind_cb    = p_reg_info->p_mfilter_ind_cb;
80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_tx_data_flow_cb   = p_reg_info->p_tx_data_flow_cb;
816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (bnep_register_with_l2cap ())
83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BNEP_SECURITY_FAIL;
84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.profile_registered  = TRUE;
868e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy    BTM_GetLocalDeviceAddr (bnep_cb.my_bda);
87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BNEP_SUCCESS;
88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_Deregister
94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by the upper layer to de-register
96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  its callbacks.
97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      void
996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid BNEP_Deregister (void)
105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Clear all the call backs registered */
107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_conn_ind_cb       = NULL;
108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_conn_state_cb     = NULL;
109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_data_ind_cb       = NULL;
110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_data_buf_cb       = NULL;
111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_filter_ind_cb     = NULL;
112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.p_mfilter_ind_cb    = NULL;
113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_cb.profile_registered  = FALSE;
115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    L2CA_Deregister (BT_PSM_BNEP);
116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_Connect
122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function creates a BNEP connection to a remote
124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  device.
125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      p_rem_addr  - BD_ADDR of the peer
127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  src_uuid    - source uuid for the connection
128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  dst_uuid    - destination uuid for the connection
129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_handle    - pointer to return the handle for the connection
130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BNEP_SUCCESS                if connection started
132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_NO_RESOURCES           if no resources
133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
135e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_Connect (BD_ADDR p_rem_bda,
136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           tBT_UUID *src_uuid,
137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           tBT_UUID *dst_uuid,
138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           UINT16 *p_handle)
139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16          cid;
141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN      *p_bcb = bnepu_find_bcb_by_bd_addr (p_rem_bda);
142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BNEP_TRACE_API6 ("BNEP_Connect()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     p_rem_bda[0], p_rem_bda[1], p_rem_bda[2],
145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     p_rem_bda[3], p_rem_bda[4], p_rem_bda[5]);
146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!bnep_cb.profile_registered)
148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BNEP_WRONG_STATE;
149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Both source and destination UUID lengths should be same */
151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (src_uuid->len != dst_uuid->len)
152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BNEP_CONN_FAILED_UUID_SIZE;
153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (!defined (BNEP_SUPPORTS_ALL_UUID_LENGTHS) || BNEP_SUPPORTS_ALL_UUID_LENGTHS == FALSE)
155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (src_uuid->len != 2)
156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BNEP_CONN_FAILED_UUID_SIZE;
157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_bcb)
160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p_bcb = bnepu_allocate_bcb (p_rem_bda)) == NULL)
162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (BNEP_NO_RESOURCES);
163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else if (p_bcb->con_state != BNEP_STATE_CONNECTED)
165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return BNEP_WRONG_STATE;
166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Backup current UUID values to restore if role change fails */
169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy ((UINT8 *)&(p_bcb->prv_src_uuid), (UINT8 *)&(p_bcb->src_uuid), sizeof (tBT_UUID));
170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy ((UINT8 *)&(p_bcb->prv_dst_uuid), (UINT8 *)&(p_bcb->dst_uuid), sizeof (tBT_UUID));
171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* We are the originator of this connection */
174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb->con_flags |= BNEP_FLAGS_IS_ORIG;
175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)src_uuid, sizeof (tBT_UUID));
177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)dst_uuid, sizeof (tBT_UUID));
178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_bcb->con_state == BNEP_STATE_CONNECTED)
180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Transition to the next appropriate state, waiting for connection confirm. */
182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_bcb->con_state = BNEP_STATE_SEC_CHECKING;
183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BNEP_TRACE_API1 ("BNEP initiating security procedures for src uuid 0x%x",
185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_bcb->src_uuid.uu.uuid16);
186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) && BNEP_DO_AUTH_FOR_ROLE_SWITCH == TRUE)
188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_sec_mx_access_request (p_bcb->rem_bda, BT_PSM_BNEP, TRUE,
189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   BTM_SEC_PROTO_BNEP,
190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   bnep_get_uuid32(src_uuid),
191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   &bnep_sec_check_complete, p_bcb);
192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bnep_sec_check_complete (p_bcb->rem_bda, p_bcb, BTM_SUCCESS);
194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Transition to the next appropriate state, waiting for connection confirm. */
200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_bcb->con_state = BNEP_STATE_CONN_START;
201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((cid = L2CA_ConnectReq (BT_PSM_BNEP, p_bcb->rem_bda)) != 0)
203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_bcb->l2cap_cid = cid;
205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BNEP_TRACE_ERROR0 ("BNEP - Originate failed");
210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (bnep_cb.p_conn_state_cb)
211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE);
212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bnepu_release_bcb (p_bcb);
213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return BNEP_CONN_FAILED;
214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Start timer waiting for connect */
217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT);
218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    *p_handle = p_bcb->handle;
221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SUCCESS);
222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_ConnectResp
228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called in responce to connection indication
2306ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      handle  - handle given in the connection indication
233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  resp    - responce for the connection indication
234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BNEP_SUCCESS                if connection started
236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_WRONG_HANDLE           if the connection is not found
237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_WRONG_STATE            if the responce is not expected
238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
240e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_ConnectResp (UINT16 handle, tBNEP_RESULT resp)
241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN      *p_bcb;
243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16          resp_code = BNEP_SETUP_CONN_OK;
244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!handle) || (handle > BNEP_MAX_CONNECTIONS))
246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb = &(bnep_cb.bcb[handle - 1]);
249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_bcb->con_state != BNEP_STATE_CONN_SETUP ||
251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)))
252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_STATE);
253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BNEP_TRACE_API2 ("BNEP_ConnectResp()  for handle %d, responce %d", handle, resp);
255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Form appropriate responce based on profile responce */
257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if      (resp == BNEP_CONN_FAILED_SRC_UUID)   resp_code = BNEP_SETUP_INVALID_SRC_UUID;
258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else if (resp == BNEP_CONN_FAILED_DST_UUID)   resp_code = BNEP_SETUP_INVALID_DEST_UUID;
259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else if (resp == BNEP_CONN_FAILED_UUID_SIZE)  resp_code = BNEP_SETUP_INVALID_UUID_SIZE;
260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else if (resp == BNEP_SUCCESS)                resp_code = BNEP_SETUP_CONN_OK;
261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else                                          resp_code = BNEP_SETUP_CONN_NOT_ALLOWED;
262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnep_send_conn_responce (p_bcb, resp_code);
264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD);
265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (resp == BNEP_SUCCESS)
267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bnep_connected (p_bcb);
268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Restore the original parameters */
271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_bcb->con_state = BNEP_STATE_CONNECTED;
272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD);
273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID));
275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID));
276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Process remaining part of the setup message (extension headers) */
279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_bcb->p_pending_data)
280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        UINT8   extension_present = TRUE, *p, ext_type;
282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        UINT16  rem_len;
283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        rem_len = p_bcb->p_pending_data->len;
285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p       = (UINT8 *)(p_bcb->p_pending_data + 1) + p_bcb->p_pending_data->offset;
286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        while (extension_present && p && rem_len)
287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ext_type = *p++;
289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            extension_present = ext_type >> 7;
290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ext_type &= 0x7F;
291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if unknown extension present stop processing */
293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (ext_type)
294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                break;
295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p = bnep_process_control_packet (p_bcb, p, &rem_len, TRUE);
297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_bcb->p_pending_data);
300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_bcb->p_pending_data = NULL;
301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SUCCESS);
303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_Disconnect
309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to close the specified connection.
311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      handle   - handle of the connection
313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BNEP_SUCCESS                if connection is disconnected
315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_WRONG_HANDLE           if no connection is not found
316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
318e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_Disconnect (UINT16 handle)
319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN      *p_bcb;
321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!handle) || (handle > BNEP_MAX_CONNECTIONS))
323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb = &(bnep_cb.bcb[handle - 1]);
326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_bcb->con_state == BNEP_STATE_IDLE)
328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BNEP_TRACE_API1 ("BNEP_Disconnect()  for handle %d", handle);
331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    L2CA_DisconnectReq (p_bcb->l2cap_cid);
333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnepu_release_bcb (p_bcb);
335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SUCCESS);
337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_WriteBuf
343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sends data in a GKI buffer on BNEP connection
345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      handle       - handle of the connection to write
347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_dest_addr  - BD_ADDR/Ethernet addr of the destination
348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_buf        - pointer to address of buffer with data
349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  protocol     - protocol type of the packet
350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_src_addr   - (optional) BD_ADDR/ethernet address of the source
351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                 (should be NULL if it is local BD Addr)
352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  fw_ext_present - forwarded extensions present
353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns:         BNEP_WRONG_HANDLE       - if passed handle is not valid
355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_MTU_EXCEDED        - If the data length is greater than MTU
356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_IGNORE_CMD         - If the packet is filtered out
357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_Q_SIZE_EXCEEDED    - If the Tx Q is full
358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_SUCCESS            - If written successfully
359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
361e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_WriteBuf (UINT16 handle,
362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            UINT8 *p_dest_addr,
363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            BT_HDR *p_buf,
364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            UINT16 protocol,
365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            UINT8 *p_src_addr,
366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            BOOLEAN fw_ext_present)
367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN      *p_bcb;
369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8           *p_data;
370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!handle) || (handle > BNEP_MAX_CONNECTIONS))
372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_buf);
374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb = &(bnep_cb.bcb[handle - 1]);
378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check MTU size */
379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_buf->len > BNEP_MTU_SIZE)
380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", p_buf->len, BNEP_MTU_SIZE);
382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_buf);
383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_MTU_EXCEDED);
384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check if the packet should be filtered out */
387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_data = (UINT8 *)(p_buf + 1) + p_buf->offset;
388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (bnep_is_packet_allowed (p_bcb, p_dest_addr, protocol, fw_ext_present, p_data) != BNEP_SUCCESS)
389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /*
391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        ** If packet is filtered and ext headers are present
392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        ** drop the data and forward the ext headers
393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        */
394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (fw_ext_present)
395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT8       ext, length;
397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT16      org_len, new_len;
398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* parse the extension headers and findout the new packet len */
399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            org_len = p_buf->len;
400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            new_len = 0;
401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            do {
402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                ext     = *p_data++;
404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                length  = *p_data++;
405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_data += length;
406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                new_len += (length + 2);
408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (new_len > org_len)
410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    GKI_freebuf (p_buf);
412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    return BNEP_IGNORE_CMD;
413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            } while (ext & 0x80);
416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (protocol != BNEP_802_1_P_PROTOCOL)
418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                protocol = 0;
419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                new_len += 4;
422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_data[2] = 0;
423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_data[3] = 0;
424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_buf->len  = new_len;
426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            GKI_freebuf (p_buf);
430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return BNEP_IGNORE_CMD;
431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check transmit queue */
435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_bcb->xmit_q.count >= BNEP_MAX_XMITQ_DEPTH)
436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_buf);
438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_Q_SIZE_EXCEEDED);
439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Build the BNEP header */
442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnepu_build_bnep_hdr (p_bcb, p_buf, protocol, p_src_addr, p_dest_addr, fw_ext_present);
443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Send the data or queue it up */
445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnepu_check_send_packet (p_bcb, p_buf);
446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SUCCESS);
448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_Write
454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sends data over a BNEP connection
456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      handle       - handle of the connection to write
458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_dest_addr  - BD_ADDR/Ethernet addr of the destination
459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_data       - pointer to data start
460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  protocol     - protocol type of the packet
461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_src_addr   - (optional) BD_ADDR/ethernet address of the source
462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                 (should be NULL if it is local BD Addr)
463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  fw_ext_present - forwarded extensions present
464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns:         BNEP_WRONG_HANDLE       - if passed handle is not valid
466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_MTU_EXCEDED        - If the data length is greater than MTU
467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_IGNORE_CMD         - If the packet is filtered out
468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_Q_SIZE_EXCEEDED    - If the Tx Q is full
469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_NO_RESOURCES       - If not able to allocate a buffer
470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_SUCCESS            - If written successfully
471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
473e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT  BNEP_Write (UINT16 handle,
474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          UINT8 *p_dest_addr,
475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          UINT8 *p_data,
476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          UINT16 len,
477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          UINT16 protocol,
478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          UINT8 *p_src_addr,
479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          BOOLEAN fw_ext_present)
480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BT_HDR       *p_buf;
482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN   *p_bcb;
483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8        *p;
484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check MTU size. Consider the possibility of having extension headers */
486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (len > BNEP_MTU_SIZE)
487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", len, BNEP_MTU_SIZE);
489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_MTU_EXCEDED);
490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!handle) || (handle > BNEP_MAX_CONNECTIONS))
493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb = &(bnep_cb.bcb[handle - 1]);
496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check if the packet should be filtered out */
498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (bnep_is_packet_allowed (p_bcb, p_dest_addr, protocol, fw_ext_present, p_data) != BNEP_SUCCESS)
499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /*
501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        ** If packet is filtered and ext headers are present
502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        ** drop the data and forward the ext headers
503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        */
504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (fw_ext_present)
505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT8       ext, length;
507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT16      org_len, new_len;
508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* parse the extension headers and findout the new packet len */
509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            org_len = len;
510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            new_len = 0;
511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p       = p_data;
512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            do {
513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                ext     = *p_data++;
515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                length  = *p_data++;
516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_data += length;
517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                new_len += (length + 2);
519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (new_len > org_len)
521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    return BNEP_IGNORE_CMD;
522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            } while (ext & 0x80);
524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (protocol != BNEP_802_1_P_PROTOCOL)
526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                protocol = 0;
527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                new_len += 4;
530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_data[2] = 0;
531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_data[3] = 0;
532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            len         = new_len;
534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_data      = p;
535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return BNEP_IGNORE_CMD;
538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check transmit queue */
541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_bcb->xmit_q.count >= BNEP_MAX_XMITQ_DEPTH)
542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_Q_SIZE_EXCEEDED);
543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Get a buffer to copy teh data into */
545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BNEP_TRACE_ERROR0 ("BNEP_Write() not able to get buffer");
548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_NO_RESOURCES);
549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_buf->len = len;
552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_buf->offset = BNEP_MINIMUM_OFFSET;
553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p = (UINT8 *)(p_buf + 1) + BNEP_MINIMUM_OFFSET;
554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy (p, p_data, len);
556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Build the BNEP header */
558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnepu_build_bnep_hdr (p_bcb, p_buf, protocol, p_src_addr, p_dest_addr, fw_ext_present);
559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Send the data or queue it up */
561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnepu_check_send_packet (p_bcb, p_buf);
562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SUCCESS);
564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_SetProtocolFilters
570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sets the protocol filters on peer device
572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      handle        - Handle for the connection
574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  num_filters   - total number of filter ranges
575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_start_array - Array of beginings of all protocol ranges
576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_end_array   - Array of ends of all protocol ranges
577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BNEP_WRONG_HANDLE           - if the connection handle is not valid
579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_SET_FILTER_FAIL        - if the connection is in wrong state
580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_TOO_MANY_FILTERS       - if too many filters
581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_SUCCESS                - if request sent successfully
582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
584e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_SetProtocolFilters (UINT16 handle,
585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                      UINT16 num_filters,
586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                      UINT16 *p_start_array,
587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                      UINT16 *p_end_array)
588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE)
590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16          xx;
591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN     *p_bcb;
592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!handle) || (handle > BNEP_MAX_CONNECTIONS))
594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb = &(bnep_cb.bcb[handle - 1]);
597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check the connection state */
599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_STATE);
602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Validate the parameters */
604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (num_filters && (!p_start_array || !p_end_array))
605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_SET_FILTER_FAIL);
606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (num_filters > BNEP_MAX_PROT_FILTERS)
608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_TOO_MANY_FILTERS);
609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Fill the filter values in connnection block */
611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < num_filters; xx++)
612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_bcb->sent_prot_filter_start[xx] = *p_start_array++;
614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_bcb->sent_prot_filter_end[xx]   = *p_end_array++;
615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb->sent_num_filters = num_filters;
618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnepu_send_peer_our_filters (p_bcb);
620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SUCCESS);
622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SET_FILTER_FAIL);
624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_SetMulticastFilters
631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sets the filters for multicast addresses for BNEP.
633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters:      handle        - Handle for the connection
635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  num_filters   - total number of filter ranges
636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_start_array - Pointer to sequence of beginings of all
637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                         multicast address ranges
638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_end_array   - Pointer to sequence of ends of all
639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                         multicast address ranges
640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BNEP_WRONG_HANDLE           - if the connection handle is not valid
642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_SET_FILTER_FAIL        - if the connection is in wrong state
643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_TOO_MANY_FILTERS       - if too many filters
644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_SUCCESS                - if request sent successfully
645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
647e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_SetMulticastFilters (UINT16 handle,
648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                       UINT16 num_filters,
649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                       UINT8 *p_start_array,
650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                       UINT8 *p_end_array)
651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE)
653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16          xx;
654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN     *p_bcb;
655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!handle) || (handle > BNEP_MAX_CONNECTIONS))
657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb = &(bnep_cb.bcb[handle - 1]);
660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Check the connection state */
662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_STATE);
665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Validate the parameters */
667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (num_filters && (!p_start_array || !p_end_array))
668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_SET_FILTER_FAIL);
669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (num_filters > BNEP_MAX_MULTI_FILTERS)
671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_TOO_MANY_FILTERS);
672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Fill the multicast filter values in connnection block */
674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < num_filters; xx++)
675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy (p_bcb->sent_mcast_filter_start[xx], p_start_array, BD_ADDR_LEN);
677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy (p_bcb->sent_mcast_filter_end[xx], p_end_array, BD_ADDR_LEN);
678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_start_array += BD_ADDR_LEN;
680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_end_array   += BD_ADDR_LEN;
681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb->sent_mcast_filters = num_filters;
684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bnepu_send_peer_our_multi_filters (p_bcb);
686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SUCCESS);
688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_SET_FILTER_FAIL);
690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_GetMyBdAddr
697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function returns a pointer to the local device BD address.
699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  If the BD address has not been read yet, it returns NULL.
700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          the BD address
702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
704e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 *BNEP_GetMyBdAddr (void)
705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (bnep_cb.got_my_bd_addr)
707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (bnep_cb.my_bda);
708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (NULL);
710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_SetTraceLevel
715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sets the trace level for BNEP. If called with
717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  a value of 0xFF, it simply reads the current trace level.
718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          the new (current) trace level
720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
722e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 BNEP_SetTraceLevel (UINT8 new_level)
723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (new_level != 0xFF)
725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        bnep_cb.trace_level = new_level;
726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (bnep_cb.trace_level);
728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BNEP_GetStatus
734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function gets the status information for BNEP connection
736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BNEP_SUCCESS            - if the status is available
738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_NO_RESOURCES       - if no structure is passed for output
739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_WRONG_HANDLE       - if the handle is invalid
740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BNEP_WRONG_STATE        - if not in connected state
741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
743e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBNEP_RESULT BNEP_GetStatus (UINT16 handle, tBNEP_STATUS *p_status)
744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (BNEP_SUPPORTS_STATUS_API) && BNEP_SUPPORTS_STATUS_API == TRUE)
746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBNEP_CONN     *p_bcb;
747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!p_status)
749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BNEP_NO_RESOURCES;
750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((!handle) || (handle > BNEP_MAX_CONNECTIONS))
752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BNEP_WRONG_HANDLE);
753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_bcb = &(bnep_cb.bcb[handle - 1]);
755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset (p_status, 0, sizeof (tBNEP_STATUS));
757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BNEP_WRONG_STATE;
760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Read the status parameters from the connection control block */
762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->con_status            = BNEP_STATUS_CONNECTED;
763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->l2cap_cid             = p_bcb->l2cap_cid;
764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->rem_mtu_size          = p_bcb->rem_mtu_size;
765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->xmit_q_depth          = p_bcb->xmit_q.count;
766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->sent_num_filters      = p_bcb->sent_num_filters;
767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->sent_mcast_filters    = p_bcb->sent_mcast_filters;
768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->rcvd_num_filters      = p_bcb->rcvd_num_filters;
769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_status->rcvd_mcast_filters    = p_bcb->rcvd_mcast_filters;
770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy (p_status->rem_bda, p_bcb->rem_bda, BD_ADDR_LEN);
772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy (&(p_status->src_uuid), &(p_bcb->src_uuid), sizeof (tBT_UUID));
773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy (&(p_status->dst_uuid), &(p_bcb->dst_uuid), sizeof (tBT_UUID));
774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BNEP_SUCCESS;
776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BNEP_IGNORE_CMD);
778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
782