15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2001-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains BNEP utility functions
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
27258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bnep_int.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
325cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
3379ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
3778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 *bnepu_init_hdr (BT_HDR *p_buf, UINT16 hdr_len, UINT8 pkt_type);
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_multicast_filter_set (tBNEP_CONN *p_bcb, UINT8 *p_filters, UINT16 len);
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_multicast_filter_rsp (tBNEP_CONN *p_bcb, UINT16 response_code);
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_find_bcb_by_cid
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches the bcb table for an entry with the
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passed CID.
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the BCB address, or NULL if not found.
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_CONN *bnepu_find_bcb_by_cid (UINT16 cid)
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_CONN     *p_bcb;
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through each connection control block */
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0, p_bcb = bnep_cb.bcb; xx < BNEP_MAX_CONNECTIONS; xx++, p_bcb++)
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_bcb->con_state != BNEP_STATE_IDLE) && (p_bcb->l2cap_cid == cid))
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_bcb);
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_find_bcb_by_bd_addr
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches the BCB table for an entry with the
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passed Bluetooth Address.
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the BCB address, or NULL if not found.
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_CONN *bnepu_find_bcb_by_bd_addr (UINT8 *p_bda)
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_CONN     *p_bcb;
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through each connection control block */
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0, p_bcb = bnep_cb.bcb; xx < BNEP_MAX_CONNECTIONS; xx++, p_bcb++)
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bcb->con_state != BNEP_STATE_IDLE)
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!memcmp ((UINT8 *)(p_bcb->rem_bda), p_bda, BD_ADDR_LEN))
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (p_bcb);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_allocate_bcb
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function allocates a new BCB.
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BCB address, or NULL if none available.
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_CONN *bnepu_allocate_bcb (BD_ADDR p_rem_bda)
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          xx;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_CONN     *p_bcb;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through each connection control block for a free one */
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0, p_bcb = bnep_cb.bcb; xx < BNEP_MAX_CONNECTIONS; xx++, p_bcb++)
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bcb->con_state == BNEP_STATE_IDLE)
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_free(p_bcb->conn_timer);
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset ((UINT8 *)p_bcb, 0, sizeof (tBNEP_CONN));
12578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            p_bcb->conn_timer = alarm_new("bnep.conn_timer");
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy ((UINT8 *)(p_bcb->rem_bda), (UINT8 *)p_rem_bda, BD_ADDR_LEN);
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->handle = xx + 1;
1291a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov            p_bcb->xmit_q = fixed_queue_new(SIZE_MAX);
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_bcb);
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, no free BCB found */
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_release_bcb
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function releases a BCB.
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_release_bcb (tBNEP_CONN *p_bcb)
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure timer is stopped */
15278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_free(p_bcb->conn_timer);
15378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    p_bcb->conn_timer = NULL;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Drop any response pointer we may be holding */
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->con_state        = BNEP_STATE_IDLE;
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->p_pending_data   = NULL;
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Free transmit queue */
1601a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    while (!fixed_queue_is_empty(p_bcb->xmit_q))
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
162abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(fixed_queue_try_dequeue(p_bcb->xmit_q));
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1641a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    fixed_queue_free(p_bcb->xmit_q, NULL);
1651a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    p_bcb->xmit_q = NULL;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_send_conn_req
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends a BNEP connection request to peer
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_send_conn_req (tBNEP_CONN *p_bcb)
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
180abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    BT_HDR  *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE);
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p, *p_start;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1832a527108d22861aa4091143c740e09235b3692c5Hemant Gupta    BNEP_TRACE_DEBUG ("%s: sending setup req with dst uuid %x",
1842a527108d22861aa4091143c740e09235b3692c5Hemant Gupta        __func__, p_bcb->dst_uuid.uu.uuid16);
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = p_start = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in BNEP frame type - filter control */
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL);
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in filter message type - set filters */
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_SETUP_CONNECTION_REQUEST_MSG);
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, p_bcb->dst_uuid.len);
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->dst_uuid.len == 2)
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_bcb->dst_uuid.uu.uuid16);
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_bcb->src_uuid.uu.uuid16);
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_bcb->dst_uuid.len == 4)
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT32_TO_BE_STREAM (p, p_bcb->dst_uuid.uu.uuid32);
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT32_TO_BE_STREAM (p, p_bcb->src_uuid.uu.uuid32);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2072a527108d22861aa4091143c740e09235b3692c5Hemant Gupta    else if (p_bcb->dst_uuid.len == 16)
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_bcb->dst_uuid.uu.uuid128, p_bcb->dst_uuid.len);
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += p_bcb->dst_uuid.len;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_bcb->src_uuid.uu.uuid128, p_bcb->dst_uuid.len);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += p_bcb->dst_uuid.len;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2142a527108d22861aa4091143c740e09235b3692c5Hemant Gupta    else
2152a527108d22861aa4091143c740e09235b3692c5Hemant Gupta    {
2162a527108d22861aa4091143c740e09235b3692c5Hemant Gupta        BNEP_TRACE_ERROR ("%s: uuid: %x, invalid length: %x",
2172a527108d22861aa4091143c740e09235b3692c5Hemant Gupta            __func__, p_bcb->dst_uuid.uu.uuid16, p_bcb->dst_uuid.len);
2182a527108d22861aa4091143c740e09235b3692c5Hemant Gupta    }
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = (UINT16)(p - p_start);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_check_send_packet (p_bcb, p_buf);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_send_conn_responce
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends a BNEP setup response to peer
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_send_conn_responce (tBNEP_CONN *p_bcb, UINT16 resp_code)
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
237abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    BT_HDR  *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE);
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
240d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP - bnep_send_conn_responce for CID: 0x%x", p_bcb->l2cap_cid);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in BNEP frame type - filter control */
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL);
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in filter message type - set filters */
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_SETUP_CONNECTION_RESPONSE_MSG);
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, resp_code);
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = 4;
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_check_send_packet (p_bcb, p_buf);
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_send_peer_our_filters
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends our filters to a peer
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_our_filters (tBNEP_CONN *p_bcb)
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
271abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    BT_HDR      *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      xx;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP sending peer our filters");
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in BNEP frame type - filter control */
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in filter message type - set filters */
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FILTER_NET_TYPE_SET_MSG);
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, (4 * p_bcb->sent_num_filters));
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < p_bcb->sent_num_filters; xx++)
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_bcb->sent_prot_filter_start[xx]);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_bcb->sent_prot_filter_end[xx]);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = 4 + (4 * p_bcb->sent_num_filters);
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_check_send_packet (p_bcb, p_buf);
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->con_flags |= BNEP_FLAGS_FILTER_RESP_PEND;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Start timer waiting for setup response */
30078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_set_on_queue(p_bcb->conn_timer, BNEP_FILTER_SET_TIMEOUT_MS,
30178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       bnep_conn_timer_timeout, p_bcb,
30278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       btu_general_alarm_queue);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_send_peer_our_multi_filters
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends our multicast filters to a peer
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_our_multi_filters (tBNEP_CONN *p_bcb)
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
317abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    BT_HDR      *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      xx;
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
321d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP sending peer our multicast filters");
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in BNEP frame type - filter control */
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in filter message type - set filters */
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FILTER_MULTI_ADDR_SET_MSG);
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, (2 * BD_ADDR_LEN * p_bcb->sent_mcast_filters));
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < p_bcb->sent_mcast_filters; xx++)
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_bcb->sent_mcast_filter_start[xx], BD_ADDR_LEN);
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += BD_ADDR_LEN;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_bcb->sent_mcast_filter_end[xx], BD_ADDR_LEN);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += BD_ADDR_LEN;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = 4 + (2 * BD_ADDR_LEN * p_bcb->sent_mcast_filters);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_check_send_packet (p_bcb, p_buf);
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->con_flags |= BNEP_FLAGS_MULTI_RESP_PEND;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Start timer waiting for setup response */
34878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_set_on_queue(p_bcb->conn_timer, BNEP_FILTER_SET_TIMEOUT_MS,
34978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       bnep_conn_timer_timeout, p_bcb,
35078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       btu_general_alarm_queue);
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_send_peer_filter_rsp
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends a filter response to a peer
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_filter_rsp (tBNEP_CONN *p_bcb, UINT16 response_code)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
365abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    BT_HDR  *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE);
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
368d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP sending filter response");
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in BNEP frame type - filter control */
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in filter message type - set filters */
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FILTER_NET_TYPE_RESPONSE_MSG);
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, response_code);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = 4;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_check_send_packet (p_bcb, p_buf);
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_send_command_not_understood
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends a BNEP command not understood message
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_send_command_not_understood (tBNEP_CONN *p_bcb, UINT8 cmd_code)
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
398abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    BT_HDR  *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
401d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP - bnep_send_command_not_understood for CID: 0x%x, cmd 0x%x", p_bcb->l2cap_cid, cmd_code);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in BNEP frame type - filter control */
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in filter message type - set filters */
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD);
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, cmd_code);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = 3;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_check_send_packet (p_bcb, p_buf);
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_check_send_packet
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function tries to send a packet to L2CAP.
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If L2CAP is flow controlled, it enqueues the
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  packet to the transmit queue
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_check_send_packet (tBNEP_CONN *p_bcb, BT_HDR *p_buf)
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
434d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP - bnepu_check_send_packet for CID: 0x%x", p_bcb->l2cap_cid);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_flags & BNEP_FLAGS_L2CAP_CONGESTED)
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4371a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        if (fixed_queue_length(p_bcb->xmit_q) >= BNEP_MAX_XMITQ_DEPTH)
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
439d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_EVENT ("BNEP - congested, dropping buf, CID: 0x%x", p_bcb->l2cap_cid);
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
441abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov            osi_free(p_buf);
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4451a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov            fixed_queue_enqueue(p_bcb->xmit_q, p_buf);
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DataWrite (p_bcb->l2cap_cid, p_buf);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_build_bnep_hdr
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function builds the BNEP header for a packet
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Extension headers are not sent yet, so there is no
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  check for that.
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_build_bnep_hdr (tBNEP_CONN *p_bcb, BT_HDR *p_buf, UINT16 protocol,
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           UINT8 *p_src_addr, UINT8 *p_dest_addr, BOOLEAN fw_ext_present)
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
46939110ec88460421618330863807804e03594ef67Zach Johnson    const controller_t *controller = controller_get_interface();
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    ext_bit, *p = (UINT8 *)NULL;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    type = BNEP_FRAME_COMPRESSED_ETHERNET;
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ext_bit = fw_ext_present ? 0x80 : 0x00;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47539110ec88460421618330863807804e03594ef67Zach Johnson    if ((p_src_addr) && (memcmp (p_src_addr, &controller->get_address()->address, BD_ADDR_LEN)))
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY;
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (p_dest_addr, p_bcb->rem_bda, BD_ADDR_LEN))
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = (type == BNEP_FRAME_COMPRESSED_ETHERNET) ? BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY : BNEP_FRAME_GENERAL_ETHERNET;
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_src_addr)
48239110ec88460421618330863807804e03594ef67Zach Johnson        p_src_addr = (UINT8 *)controller->get_address();
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (type)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FRAME_GENERAL_ETHERNET:
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = bnepu_init_hdr (p_buf, 15, (UINT8)(ext_bit | BNEP_FRAME_GENERAL_ETHERNET));
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_dest_addr, BD_ADDR_LEN);
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += BD_ADDR_LEN;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_src_addr, BD_ADDR_LEN);
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += BD_ADDR_LEN;
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FRAME_COMPRESSED_ETHERNET:
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = bnepu_init_hdr (p_buf, 3, (UINT8)(ext_bit | BNEP_FRAME_COMPRESSED_ETHERNET));
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY:
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = bnepu_init_hdr (p_buf, 9, (UINT8)(ext_bit | BNEP_FRAME_COMPRESSED_ETHERNET_SRC_ONLY));
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_src_addr, BD_ADDR_LEN);
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += BD_ADDR_LEN;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY:
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = bnepu_init_hdr (p_buf, 9, (UINT8)(ext_bit | BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY));
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p, p_dest_addr, BD_ADDR_LEN);
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += BD_ADDR_LEN;
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, protocol);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_init_hdr
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initializes the BNEP header
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to header in buffer
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 *bnepu_init_hdr (BT_HDR *p_buf, UINT16 hdr_len, UINT8 pkt_type)
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    *p = (UINT8 *)(p_buf + 1) + p_buf->offset;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if we need to make space in the buffer */
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf->offset < (hdr_len + L2CAP_MIN_OFFSET))
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16 xx, diff = BNEP_MINIMUM_OFFSET - p_buf->offset;
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p + p_buf->len - 1;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < p_buf->len; xx++, p--)
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p[diff] = *p;
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = BNEP_MINIMUM_OFFSET;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + p_buf->offset;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len    += hdr_len;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset -= hdr_len;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p             -= hdr_len;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = pkt_type;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_process_setup_conn_req
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes a peer's setup connection request
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  message. The destination UUID is verified and response sent
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Connection open indication will be given to PAN profile
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_process_setup_conn_req (tBNEP_CONN *p_bcb, UINT8 *p_setup, UINT8 len)
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
567d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP - bnep_process_setup_conn_req for CID: 0x%x", p_bcb->l2cap_cid);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_state != BNEP_STATE_CONN_SETUP &&
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bcb->con_state != BNEP_STATE_SEC_CHECKING &&
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bcb->con_state != BNEP_STATE_CONNECTED)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
573d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - setup request in bad state %d", p_bcb->con_state);
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we already initiated security check or if waiting for user responce */
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
581d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_EVENT ("BNEP - Duplicate Setup message received while doing security check");
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if peer is the originator */
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_state != BNEP_STATE_CONNECTED &&
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)) &&
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
590d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - setup request when we are originator", p_bcb->con_state);
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED);
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_state == BNEP_STATE_CONNECTED)
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy ((UINT8 *)&(p_bcb->prv_src_uuid), (UINT8 *)&(p_bcb->src_uuid), sizeof (tBT_UUID));
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy ((UINT8 *)&(p_bcb->prv_dst_uuid), (UINT8 *)&(p_bcb->dst_uuid), sizeof (tBT_UUID));
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->dst_uuid.len = p_bcb->src_uuid.len = len;
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->dst_uuid.len == 2)
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* because peer initiated connection keep src uuid as dst uuid */
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (p_bcb->src_uuid.uu.uuid16, p_setup);
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (p_bcb->dst_uuid.uu.uuid16, p_setup);
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If nothing has changed don't bother the profile */
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bcb->con_state == BNEP_STATE_CONNECTED &&
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->src_uuid.uu.uuid16 == p_bcb->prv_src_uuid.uu.uuid16 &&
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->dst_uuid.uu.uuid16 == p_bcb->prv_dst_uuid.uu.uuid16)
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_OK);
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_bcb->dst_uuid.len == 4)
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (p_bcb->src_uuid.uu.uuid32, p_setup);
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (p_bcb->dst_uuid.uu.uuid32, p_setup);
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_bcb->dst_uuid.len == 16)
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_bcb->src_uuid.uu.uuid128, p_setup, p_bcb->src_uuid.len);
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_setup += p_bcb->src_uuid.len;
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_bcb->dst_uuid.uu.uuid128, p_setup, p_bcb->dst_uuid.len);
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_setup += p_bcb->dst_uuid.len;
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
632d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - Bad UID len %d in ConnReq", p_bcb->dst_uuid.len);
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_send_conn_responce (p_bcb, BNEP_SETUP_INVALID_UUID_SIZE);
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->con_state = BNEP_STATE_SEC_CHECKING;
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->con_flags |= BNEP_FLAGS_SETUP_RCVD;
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
640d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP initiating security check for incoming call for uuid 0x%x", p_bcb->src_uuid.uu.uuid16);
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) || BNEP_DO_AUTH_FOR_ROLE_SWITCH == FALSE)
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_sec_check_complete (p_bcb->rem_bda, p_bcb, BTM_SUCCESS);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_mx_access_request (p_bcb->rem_bda, BT_PSM_BNEP, FALSE,
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               BTM_SEC_PROTO_BNEP, bnep_get_uuid32(&(p_bcb->src_uuid)),
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               &bnep_sec_check_complete, p_bcb);
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_process_setup_conn_responce
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes a peer's setup connection response
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  message. The response code is verified and
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Connection open indication will be given to PAN profile
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnep_process_setup_conn_responce (tBNEP_CONN *p_bcb, UINT8 *p_setup)
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_RESULT    resp;
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          resp_code;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
670d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP received setup responce");
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The state should be either SETUP or CONNECTED */
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_state != BNEP_STATE_CONN_SETUP)
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Should we disconnect ? */
675d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - setup response in bad state %d", p_bcb->con_state);
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we are the originator */
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
682d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - setup response when we are not originator", p_bcb->con_state);
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT16  (resp_code, p_setup);
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (resp_code)
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_SETUP_INVALID_SRC_UUID:
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        resp = BNEP_CONN_FAILED_SRC_UUID;
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_SETUP_INVALID_DEST_UUID:
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        resp = BNEP_CONN_FAILED_DST_UUID;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_SETUP_INVALID_UUID_SIZE:
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        resp = BNEP_CONN_FAILED_UUID_SIZE;
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_SETUP_CONN_NOT_ALLOWED:
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        resp = BNEP_CONN_FAILED;
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check the responce code */
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (resp_code != BNEP_SETUP_CONN_OK)
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
713d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_EVENT ("BNEP - role change response is %d", resp_code);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Restore the earlier BNEP status */
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->con_state = BNEP_STATE_CONNECTED;
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD);
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID));
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID));
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Ensure timer is stopped */
72278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(p_bcb->conn_timer);
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->re_transmits = 0;
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Tell the user if he has a callback */
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bnep_cb.p_conn_state_cb)
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, resp, TRUE);
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
733d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_ERROR ("BNEP - setup response %d is not OK", resp_code);
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_DisconnectReq (p_bcb->l2cap_cid);
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Tell the user if he has a callback */
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_bcb->con_flags & BNEP_FLAGS_IS_ORIG) && (bnep_cb.p_conn_state_cb))
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, resp, FALSE);
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bnepu_release_bcb (p_bcb);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Received successful responce */
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnep_connected (p_bcb);
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_process_control_packet
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes a peer's setup connection request
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  message. The destination UUID is verified and response sent
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Connection open indication will be given to PAN profile
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *bnep_process_control_packet (tBNEP_CONN *p_bcb, UINT8 *p, UINT16 *rem_len, BOOLEAN is_ext)
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       control_type;
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     bad_pkt = FALSE;
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      len, ext_len = 0;
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_ext)
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ext_len = *p++;
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - 1;
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    control_type = *p++;
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *rem_len = *rem_len - 1;
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
777d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP processing control packet rem_len %d, is_ext %d, ctrl_type %d", *rem_len, is_ext, control_type);
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (control_type)
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD:
782d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP Received Cmd not understood for ctl pkt type: %d", *p);
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p++;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - 1;
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_SETUP_CONNECTION_REQUEST_MSG:
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = *p++;
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*rem_len < ((2 * len) + 1))
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bad_pkt = TRUE;
792d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_ERROR ("BNEP Received Setup message with bad length");
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!is_ext)
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bnep_process_setup_conn_req (p_bcb, p, (UINT8)len);
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += (2 * len);
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - (2 * len) - 1;
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_SETUP_CONNECTION_RESPONSE_MSG:
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!is_ext)
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bnep_process_setup_conn_responce (p_bcb, p);
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += 2;
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - 2;
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FILTER_NET_TYPE_SET_MSG:
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (len, p);
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*rem_len < (len + 2))
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bad_pkt = TRUE;
813d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_ERROR ("BNEP Received Filter set message with bad length");
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_process_peer_filter_set (p_bcb, p, len);
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += len;
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - len - 2;
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FILTER_NET_TYPE_RESPONSE_MSG:
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_process_peer_filter_rsp (p_bcb, p);
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += 2;
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - 2;
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FILTER_MULTI_ADDR_SET_MSG:
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (len, p);
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*rem_len < (len + 2))
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bad_pkt = TRUE;
832d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_ERROR ("BNEP Received Multicast Filter Set message with bad length");
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_process_peer_multicast_filter_set (p_bcb, p, len);
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += len;
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - len - 2;
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BNEP_FILTER_MULTI_ADDR_RESPONSE_MSG:
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_process_multicast_filter_rsp (p_bcb, p);
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += 2;
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = *rem_len - 2;
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default :
847d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - bad ctl pkt type: %d", control_type);
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_send_command_not_understood (p_bcb, control_type);
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_ext)
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += (ext_len - 1);
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *rem_len -= (ext_len - 1);
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bad_pkt)
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
859d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - bad ctl pkt length: %d", *rem_len);
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *rem_len = 0;
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return NULL;
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p;
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_process_peer_filter_set
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes a peer's filter control
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  'set' message. The filters are stored in the BCB,
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and an appropriate filter response message sent.
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_filter_set (tBNEP_CONN *p_bcb, UINT8 *p_filters, UINT16 len)
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      num_filters = 0;
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      xx, resp_code = BNEP_FILTER_CRL_OK;
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      start, end;
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p_temp_filters;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
889d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_DEBUG ("BNEP received filter set from peer when there is no connection");
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
893d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP received filter set from peer");
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check for length not a multiple of 4 */
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len & 3)
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
897d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len);
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_send_peer_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE);
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len)
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_filters = (UINT16) (len >> 2);
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Validate filter values */
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (num_filters <= BNEP_MAX_PROT_FILTERS)
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_temp_filters = p_filters;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < num_filters; xx++)
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16  (start, p_temp_filters);
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16  (end,   p_temp_filters);
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (start > end)
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                resp_code = BNEP_FILTER_CRL_BAD_RANGE;
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        resp_code   = BNEP_FILTER_CRL_MAX_REACHED;
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (resp_code != BNEP_FILTER_CRL_OK)
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_send_peer_filter_rsp (p_bcb, resp_code);
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bnep_cb.p_filter_ind_cb)
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bnep_cb.p_filter_ind_cb) (p_bcb->handle, TRUE, 0, len, p_filters);
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->rcvd_num_filters = num_filters;
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_filters; xx++)
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16  (start, p_filters);
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16  (end,   p_filters);
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bcb->rcvd_prot_filter_start[xx] = start;
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bcb->rcvd_prot_filter_end[xx]   = end;
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_send_peer_filter_rsp (p_bcb, resp_code);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_process_peer_filter_rsp
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes a peer's filter control
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  'response' message.
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_filter_rsp (tBNEP_CONN *p_bcb, UINT8 *p_data)
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          resp_code;
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_RESULT    result;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
962d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP received filter responce");
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The state should be  CONNECTED */
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
967d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - filter response in bad state %d", p_bcb->con_state);
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we are the originator */
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_bcb->con_flags & BNEP_FLAGS_FILTER_RESP_PEND))
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
974d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - filter response when not expecting");
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure timer is stopped */
97978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_cancel(p_bcb->conn_timer);
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->con_flags &= ~BNEP_FLAGS_FILTER_RESP_PEND;
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->re_transmits = 0;
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT16  (resp_code, p_data);
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result = BNEP_SUCCESS;
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (resp_code != BNEP_FILTER_CRL_OK)
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result = BNEP_SET_FILTER_FAIL;
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bnep_cb.p_filter_ind_cb)
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bnep_cb.p_filter_ind_cb) (p_bcb->handle, FALSE, result, 0, NULL);
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_process_multicast_filter_rsp
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes multicast filter control
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  'response' message.
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_multicast_filter_rsp (tBNEP_CONN *p_bcb, UINT8 *p_data)
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          resp_code;
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_RESULT    result;
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1008d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP received multicast filter responce");
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The state should be  CONNECTED */
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1013d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - multicast filter response in bad state %d", p_bcb->con_state);
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we are the originator */
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_bcb->con_flags & BNEP_FLAGS_MULTI_RESP_PEND))
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1020d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP - multicast filter response when not expecting");
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure timer is stopped */
102578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_cancel(p_bcb->conn_timer);
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->con_flags &= ~BNEP_FLAGS_MULTI_RESP_PEND;
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->re_transmits = 0;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT16  (resp_code, p_data);
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result = BNEP_SUCCESS;
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (resp_code != BNEP_FILTER_CRL_OK)
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result = BNEP_SET_FILTER_FAIL;
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bnep_cb.p_mfilter_ind_cb)
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bnep_cb.p_mfilter_ind_cb) (p_bcb->handle, FALSE, result, 0, NULL);
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_process_peer_multicast_filter_set
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes a peer's filter control
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  'set' message. The filters are stored in the BCB,
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and an appropriate filter response message sent.
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_process_peer_multicast_filter_set (tBNEP_CONN *p_bcb, UINT8 *p_filters, UINT16 len)
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          resp_code = BNEP_FILTER_CRL_OK;
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          num_filters, xx;
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_temp_filters, null_bda[BD_ADDR_LEN] = {0,0,0,0,0,0};
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1059d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_DEBUG ("BNEP received multicast filter set from peer when there is no connection");
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len % 12)
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1065d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len);
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE);
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len > (BNEP_MAX_MULTI_FILTERS * 2 * BD_ADDR_LEN))
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1072d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_EVENT ("BNEP - Too many filters");
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_MAX_REACHED);
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    num_filters = 0;
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len)
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_filters = (UINT16) (len / 12);
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Validate filter values */
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (num_filters <= BNEP_MAX_MULTI_FILTERS)
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_temp_filters = p_filters;
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < num_filters; xx++)
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (memcmp (p_temp_filters, p_temp_filters + BD_ADDR_LEN, BD_ADDR_LEN) > 0)
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE);
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_temp_filters += (BD_ADDR_LEN * 2);
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bcb->rcvd_mcast_filters = num_filters;
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_filters; xx++)
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_bcb->rcvd_mcast_filter_start[xx], p_filters, BD_ADDR_LEN);
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_bcb->rcvd_mcast_filter_end[xx], p_filters + BD_ADDR_LEN, BD_ADDR_LEN);
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_filters += (BD_ADDR_LEN * 2);
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if any of the ranges have all zeros as both starting and ending addresses */
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((memcmp (null_bda, p_bcb->rcvd_mcast_filter_start[xx], BD_ADDR_LEN) == 0) &&
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (memcmp (null_bda, p_bcb->rcvd_mcast_filter_end[xx], BD_ADDR_LEN) == 0))
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->rcvd_mcast_filters = 0xFFFF;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1113d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP multicast filters %d", p_bcb->rcvd_mcast_filters);
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_send_peer_multicast_filter_rsp (p_bcb, resp_code);
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bnep_cb.p_mfilter_ind_cb)
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bnep_cb.p_mfilter_ind_cb) (p_bcb->handle, TRUE, 0, len, p_filters);
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnepu_send_peer_multicast_filter_rsp
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends a filter response to a peer
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bnepu_send_peer_multicast_filter_rsp (tBNEP_CONN *p_bcb, UINT16 response_code)
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1132abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    BT_HDR  *p_buf = (BT_HDR *)osi_malloc(BNEP_BUF_SIZE);
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p;
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1135d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_DEBUG ("BNEP sending multicast filter response %d", response_code);
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in BNEP frame type - filter control */
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FRAME_CONTROL);
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Put in filter message type - set filters */
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, BNEP_FILTER_MULTI_ADDR_RESPONSE_MSG);
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, response_code);
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = 4;
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bnepu_check_send_packet (p_bcb, p_buf);
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_sec_check_complete
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BTM and will be called
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  after completing the security procedures
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11658fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid bnep_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
11668fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                                    void *p_ref_data, UINT8 result)
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_CONN      *p_bcb = (tBNEP_CONN *)p_ref_data;
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          resp_code = BNEP_SETUP_CONN_OK;
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         is_role_change;
11715cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(bd_addr);
11728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    UNUSED(trasnport);
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1174d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    BNEP_TRACE_EVENT ("BNEP security callback returned result %d", result);
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_role_change = TRUE;
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_role_change = FALSE;
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if the port is still waiting for security to complete */
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->con_state != BNEP_STATE_SEC_CHECKING)
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1183d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        BNEP_TRACE_ERROR ("BNEP Connection in wrong state %d when security is completed", p_bcb->con_state);
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if it is outgoing call and result is FAILURE return security fail error */
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD))
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (result != BTM_SUCCESS)
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Tell the user that role change is failed because of security */
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bnep_cb.p_conn_state_cb)
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_SECURITY_FAIL, is_role_change);
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_bcb->con_state = BNEP_STATE_CONNECTED;
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID));
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID));
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_DisconnectReq (p_bcb->l2cap_cid);
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Tell the user if he has a callback */
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bnep_cb.p_conn_state_cb)
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_SECURITY_FAIL, is_role_change);
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bnepu_release_bcb (p_bcb);
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Transition to the next appropriate state, waiting for connection confirm. */
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bcb->con_state = BNEP_STATE_CONN_SETUP;
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_send_conn_req (p_bcb);
121878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_set_on_queue(p_bcb->conn_timer, BNEP_CONN_TIMEOUT_MS,
121978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           bnep_conn_timer_timeout, p_bcb,
122078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btu_general_alarm_queue);
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* it is an incoming call respond appropriately */
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (result != BTM_SUCCESS)
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED);
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Role change is failed because of security. Revert back to connected state */
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->con_state = BNEP_STATE_CONNECTED;
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_bcb->con_flags &= (~BNEP_FLAGS_SETUP_RCVD);
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy ((UINT8 *)&(p_bcb->src_uuid), (UINT8 *)&(p_bcb->prv_src_uuid), sizeof (tBT_UUID));
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy ((UINT8 *)&(p_bcb->dst_uuid), (UINT8 *)&(p_bcb->prv_dst_uuid), sizeof (tBT_UUID));
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectReq (p_bcb->l2cap_cid);
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnepu_release_bcb (p_bcb);
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bnep_cb.p_conn_ind_cb)
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bcb->con_state = BNEP_STATE_CONN_SETUP;
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bnep_cb.p_conn_ind_cb) (p_bcb->handle, p_bcb->rem_bda, &p_bcb->dst_uuid, &p_bcb->src_uuid, is_role_change);
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Profile didn't register connection indication call back */
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_send_conn_responce (p_bcb, resp_code);
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bnep_connected (p_bcb);
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_is_packet_allowed
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function verifies whether the protocol passes through
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the protocol filters set by the peer
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BNEP_SUCCESS          - if the protocol is allowed
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BNEP_IGNORE_CMD       - if the protocol is filtered out
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT bnep_is_packet_allowed (tBNEP_CONN *p_bcb,
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     BD_ADDR p_dest_addr,
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT16 protocol,
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     BOOLEAN fw_ext_present,
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT8 *p_data)
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bcb->rcvd_num_filters)
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16          i, proto;
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Findout the actual protocol to check for the filtering */
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        proto = protocol;
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (proto == BNEP_802_1_P_PROTOCOL)
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (fw_ext_present)
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT8       len, ext;
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* parse the extension headers and findout actual protocol */
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                do {
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    ext     = *p_data++;
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len     = *p_data++;
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_data += len;
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                } while (ext & 0x80);
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data += 2;
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (proto, p_data);
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i=0; i<p_bcb->rcvd_num_filters; i++)
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_bcb->rcvd_prot_filter_start[i] <= proto) &&
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (proto <= p_bcb->rcvd_prot_filter_end[i]))
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (i == p_bcb->rcvd_num_filters)
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1310d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_DEBUG ("Ignoring protocol 0x%x in BNEP data write", proto);
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BNEP_IGNORE_CMD;
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ckeck for multicast address filtering */
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dest_addr[0] & 0x01) &&
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bcb->rcvd_mcast_filters)
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16          i;
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if every multicast should be filtered */
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bcb->rcvd_mcast_filters != 0xFFFF)
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check if the address is mentioned in the filter range */
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < p_bcb->rcvd_mcast_filters; i++)
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((memcmp (p_bcb->rcvd_mcast_filter_start[i], p_dest_addr, BD_ADDR_LEN) <= 0) &&
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (memcmp (p_bcb->rcvd_mcast_filter_end[i], p_dest_addr, BD_ADDR_LEN) >= 0))
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** If every multicast should be filtered or the address is not in the filter range
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** drop the packet
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_bcb->rcvd_mcast_filters == 0xFFFF) || (i == p_bcb->rcvd_mcast_filters))
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1339d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            BNEP_TRACE_DEBUG ("Ignoring multicast address %x.%x.%x.%x.%x.%x in BNEP data write",
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dest_addr[0], p_dest_addr[1], p_dest_addr[2],
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dest_addr[3], p_dest_addr[4], p_dest_addr[5]);
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BNEP_IGNORE_CMD;
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BNEP_SUCCESS;
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bnep_get_uuid32
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the 32 bit equivalent of the given UUID
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          UINT32          - 32 bit equivalent of the UUID
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 bnep_get_uuid32 (tBT_UUID *src_uuid)
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32      result;
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (src_uuid->len == 2)
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ((UINT32)src_uuid->uu.uuid16);
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (src_uuid->len == 4)
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (src_uuid->uu.uuid32 & 0x0000FFFF);
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result = src_uuid->uu.uuid128[2];
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result = (result << 8) | (src_uuid->uu.uuid128[3]);
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return result;
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1373