15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2002-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 module contains functions for parsing and building AVDTP signaling
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  messages.  It also contains functions called by the SCB or CCB state
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  machines for sending command, response, and reject messages.  It also
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  contains a function that processes incoming messages and dispatches them
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  to the appropriate SCB or CCB.
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "data_types.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
325cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdtc_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_int.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** constants
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* mask of all psc values */
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define AVDT_MSG_PSC_MASK   (AVDT_PSC_TRANS | AVDT_PSC_REPORT | AVDT_PSC_DELAY_RPT | \
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             AVDT_PSC_RECOV | AVDT_PSC_HDRCMP | AVDT_PSC_MUX)
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define AVDT_PSC_PROTECT    (1<<4)  /* Content Protection */
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define AVDT_PSC_CODEC      (1<<7)  /* codec */
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type definitions
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for message building functions */
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef void (*tAVDT_MSG_BLD)(UINT8 **p, tAVDT_MSG *p_msg);
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for message parsing functions */
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef UINT8 (*tAVDT_MSG_PRS)(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** local function declarations
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_none(UINT8 **p, tAVDT_MSG *p_msg);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_single(UINT8 **p, tAVDT_MSG *p_msg);
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_setconfig_cmd(UINT8 **p, tAVDT_MSG *p_msg);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_reconfig_cmd(UINT8 **p, tAVDT_MSG *p_msg);
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_multi(UINT8 **p, tAVDT_MSG *p_msg);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_security_cmd(UINT8 **p, tAVDT_MSG *p_msg);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_discover_rsp(UINT8 **p, tAVDT_MSG *p_msg);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_svccap(UINT8 **p, tAVDT_MSG *p_msg);
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_security_rsp(UINT8 **p, tAVDT_MSG *p_msg);
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_all_svccap(UINT8 **p, tAVDT_MSG *p_msg);
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_delay_rpt(UINT8 **p, tAVDT_MSG *p_msg);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_none(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_single(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_setconfig_cmd(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_reconfig_cmd(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_multi(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_security_cmd(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_discover_rsp(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_svccap(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_all_svccap(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_security_rsp(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_delay_rpt (tAVDT_MSG *p_msg, UINT8 *p, UINT16 len);
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** constants
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* table of information element minimum lengths used for parsing */
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 avdt_msg_ie_len_min[] = {
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                              /* unused */
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_TRANS_MIN,             /* media transport */
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_REPORT_MIN,            /* reporting */
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_RECOV_MIN,             /* recovery */
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_PROTECT_MIN,           /* content protection */
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_HDRCMP_MIN,            /* header compression */
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_MUX_MIN,               /* multiplexing */
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_CODEC_MIN,             /* codec */
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_DELAY_RPT_MIN          /* delay report */
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* table of information element minimum lengths used for parsing */
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 avdt_msg_ie_len_max[] = {
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                              /* unused */
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_TRANS_MAX,             /* media transport */
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_REPORT_MAX,            /* reporting */
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_RECOV_MAX,             /* recovery */
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_PROTECT_MAX,           /* content protection */
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_HDRCMP_MAX,            /* header compression */
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_MUX_MAX,               /* multiplexing */
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_CODEC_MAX,             /* codec */
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_DELAY_RPT_MAX          /* delay report */
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* table of error codes used when decoding information elements */
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 avdt_msg_ie_err[] = {
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                              /* unused */
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_MEDIA_TRANS,           /* media transport */
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_LENGTH,                /* reporting */
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_RECOV_FMT,             /* recovery */
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_CP_FMT,                /* content protection */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_ROHC_FMT,              /* header compression */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_MUX_FMT,               /* multiplexing */
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_SERVICE,               /* codec */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_ERR_SERVICE                /* delay report ?? */
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* table of packet type minimum lengths */
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8 avdt_msg_pkt_type_len[] = {
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_TYPE_SINGLE,
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_TYPE_START,
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_TYPE_CONT,
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_LEN_TYPE_END
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* function table for building command messages */
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tAVDT_MSG_BLD avdt_msg_bld_cmd[] = {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* discover */
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_single,          /* get capabilities */
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_setconfig_cmd,   /* set configuration */
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_single,          /* get configuration */
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_reconfig_cmd,    /* reconfigure */
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_single,          /* open */
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_multi,           /* start */
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_single,          /* close */
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_multi,           /* suspend */
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_single,          /* abort */
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_security_cmd,    /* security control */
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_single,          /* get all capabilities */
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_delay_rpt        /* delay report */
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* function table for building response messages */
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tAVDT_MSG_BLD avdt_msg_bld_rsp[] = {
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_discover_rsp,    /* discover */
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_svccap,          /* get capabilities */
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* set configuration */
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_all_svccap,      /* get configuration */
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* reconfigure */
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* open */
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* start */
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* close */
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* suspend */
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none,            /* abort */
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_security_rsp,    /* security control */
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_all_svccap,      /* get all capabilities */
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_none             /* delay report */
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* function table for parsing command messages */
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tAVDT_MSG_PRS avdt_msg_prs_cmd[] = {
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* discover */
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_single,          /* get capabilities */
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_setconfig_cmd,   /* set configuration */
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_single,          /* get configuration */
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_reconfig_cmd,    /* reconfigure */
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_single,          /* open */
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_multi,           /* start */
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_single,          /* close */
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_multi,           /* suspend */
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_single,          /* abort */
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_security_cmd,    /* security control */
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_single,          /* get all capabilities */
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_delay_rpt        /* delay report */
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* function table for parsing response messages */
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tAVDT_MSG_PRS avdt_msg_prs_rsp[] = {
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_discover_rsp,    /* discover */
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_svccap,          /* get capabilities */
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* set configuration */
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_all_svccap,      /* get configuration */
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* reconfigure */
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* open */
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* start */
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* close */
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* suspend */
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none,            /* abort */
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_security_rsp,    /* security control */
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_all_svccap,      /* get all capabilities */
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_prs_none             /* delay report */
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* command message-to-event lookup table */
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 avdt_msg_cmd_2_evt[] = {
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_DISCOVER_CMD_EVT + AVDT_CCB_MKR,   /* discover */
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_GETCAP_CMD_EVT + AVDT_CCB_MKR,     /* get capabilities */
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_SETCONFIG_CMD_EVT,                 /* set configuration */
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_GETCONFIG_CMD_EVT,                 /* get configuration */
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_RECONFIG_CMD_EVT,                  /* reconfigure */
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_OPEN_CMD_EVT,                      /* open */
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_START_CMD_EVT + AVDT_CCB_MKR,      /* start */
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_CLOSE_CMD_EVT,                     /* close */
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_SUSPEND_CMD_EVT + AVDT_CCB_MKR,    /* suspend */
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_ABORT_CMD_EVT,                     /* abort */
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_SECURITY_CMD_EVT,                  /* security control */
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_GETCAP_CMD_EVT + AVDT_CCB_MKR,     /* get all capabilities */
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_DELAY_RPT_CMD_EVT                  /* delay report */
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* response message-to-event lookup table */
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 avdt_msg_rsp_2_evt[] = {
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_DISCOVER_RSP_EVT + AVDT_CCB_MKR,   /* discover */
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_GETCAP_RSP_EVT + AVDT_CCB_MKR,     /* get capabilities */
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_SETCONFIG_RSP_EVT,                 /* set configuration */
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_GETCONFIG_RSP_EVT,                 /* get configuration */
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_RECONFIG_RSP_EVT,                  /* reconfigure */
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_OPEN_RSP_EVT,                      /* open */
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_START_RSP_EVT + AVDT_CCB_MKR,      /* start */
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_CLOSE_RSP_EVT,                     /* close */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_SUSPEND_RSP_EVT + AVDT_CCB_MKR,    /* suspend */
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_ABORT_RSP_EVT,                     /* abort */
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_SECURITY_RSP_EVT,                  /* security control */
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_GETCAP_RSP_EVT + AVDT_CCB_MKR,     /* get all capabilities */
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_DELAY_RPT_RSP_EVT                  /* delay report */
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* reject message-to-event lookup table */
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 avdt_msg_rej_2_evt[] = {
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_DISCOVER_RSP_EVT + AVDT_CCB_MKR,   /* discover */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_GETCAP_RSP_EVT + AVDT_CCB_MKR,     /* get capabilities */
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_SETCONFIG_REJ_EVT,                 /* set configuration */
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_GETCONFIG_RSP_EVT,                 /* get configuration */
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_RECONFIG_RSP_EVT,                  /* reconfigure */
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_OPEN_REJ_EVT,                      /* open */
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_START_RSP_EVT + AVDT_CCB_MKR,      /* start */
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_CLOSE_RSP_EVT,                     /* close */
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_SUSPEND_RSP_EVT + AVDT_CCB_MKR,    /* suspend */
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_ABORT_RSP_EVT,                     /* abort */
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_SCB_MSG_SECURITY_RSP_EVT,                  /* security control */
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_CCB_MSG_GETCAP_RSP_EVT + AVDT_CCB_MKR,     /* get all capabilities */
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0                                               /* delay report */
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** Function         avdt_msg_bld_cfg
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function builds the configuration parameters contained
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in a command or response message.
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_cfg(UINT8 **p, tAVDT_CFG *p_cfg)
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 len;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for now, just build media transport, codec, and content protection, and multiplexing */
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* media transport */
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->psc_mask & AVDT_PSC_TRANS)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = AVDT_CAT_TRANS;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = 0; /* length */
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_REPORTING == TRUE
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* reporting transport */
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->psc_mask & AVDT_PSC_REPORT)
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = AVDT_CAT_REPORT;
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = 0; /* length */
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* codec */
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->num_codec != 0)
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = AVDT_CAT_CODEC;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = p_cfg->codec_info[0] + 1;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( len > AVDT_CODEC_SIZE )
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len = AVDT_CODEC_SIZE;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(*p, p_cfg->codec_info, len);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p += len;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* content protection */
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->num_protect != 0)
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = AVDT_CAT_PROTECT;
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = p_cfg->protect_info[0] + 1;
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( len > AVDT_PROTECT_SIZE )
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len = AVDT_PROTECT_SIZE;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(*p, p_cfg->protect_info, len);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p += len;
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* multiplexing */
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->psc_mask & AVDT_PSC_MUX)
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = AVDT_CAT_MUX;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* length */
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cfg->psc_mask & AVDT_PSC_RECOV)
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = 7; /* frag (1) + media + report + recovery */
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_cfg->psc_mask & AVDT_PSC_REPORT)
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = 5; /* frag (1) + media + report */
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = 3; /* frag (1) + media */
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* allow fragmentation */
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_cfg->mux_mask & AVDT_MUX_FRAG)
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = 0x80;
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = 0;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* media transport session */
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = p_cfg->mux_tsid_media<<3; /* TSID */
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = p_cfg->mux_tcid_media<<3; /* TCID */
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cfg->psc_mask & AVDT_PSC_RECOV)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reporting transport session */
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = p_cfg->mux_tsid_report<<3; /* TSID */
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = p_cfg->mux_tcid_report<<3; /* TCID */
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* recovery transport session */
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = p_cfg->mux_tsid_recov<<3; /* TSID */
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = p_cfg->mux_tcid_recov<<3; /* TCID */
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_cfg->psc_mask & AVDT_PSC_REPORT)
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* reporting transport session */
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = p_cfg->mux_tsid_report<<3; /* TSID */
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(*p)++ = p_cfg->mux_tcid_report<<3; /* TCID */
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* delay report */
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->psc_mask & AVDT_PSC_DELAY_RPT)
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = AVDT_CAT_DELAY_RPT;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(*p)++ = 0; /* length */
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_none
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds an empty message.
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_none(UINT8 **p, tAVDT_MSG *p_msg)
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3775cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p);
3785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_msg);
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_single
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a message containing
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a single SEID.
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_single(UINT8 **p, tAVDT_MSG *p_msg)
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_BLD_SEID(*p, p_msg->single.seid);
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_setconfig_cmd
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a set configuration
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_setconfig_cmd(UINT8 **p, tAVDT_MSG *p_msg)
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_BLD_SEID(*p, p_msg->config_cmd.hdr.seid);
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_BLD_SEID(*p, p_msg->config_cmd.int_seid);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_cfg(p, p_msg->config_cmd.p_cfg);
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_reconfig_cmd
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a reconfiguration
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_reconfig_cmd(UINT8 **p, tAVDT_MSG *p_msg)
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_BLD_SEID(*p, p_msg->reconfig_cmd.hdr.seid);
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* force psc mask zero to build only codec and security */
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->reconfig_cmd.p_cfg->psc_mask = 0;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_cfg(p, p_msg->reconfig_cmd.p_cfg);
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_multi
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a message containing
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  multiple SEID's.
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_multi(UINT8 **p, tAVDT_MSG *p_msg)
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_msg->multi.num_seps; i++)
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_BLD_SEID(*p, p_msg->multi.seid_list[i]);
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_security_cmd
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a security
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_security_cmd(UINT8 **p, tAVDT_MSG *p_msg)
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_BLD_SEID(*p, p_msg->security_cmd.hdr.seid);
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(*p, p_msg->security_cmd.p_data, p_msg->security_cmd.len);
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p += p_msg->security_cmd.len;
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_delay_rpt
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a delay report
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_delay_rpt(UINT8 **p, tAVDT_MSG *p_msg)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_BLD_SEID(*p, p_msg->delay_rpt_cmd.hdr.seid);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM(*p, p_msg->delay_rpt_cmd.delay);
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_discover_rsp
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a discover
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  response message.
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_discover_rsp(UINT8 **p, tAVDT_MSG *p_msg)
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_msg->discover_rsp.num_seps; i++)
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* build discover rsp info */
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_BLD_DISC(*p, p_msg->discover_rsp.p_sep_info[i].seid,
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_msg->discover_rsp.p_sep_info[i].in_use,
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_msg->discover_rsp.p_sep_info[i].media_type,
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_msg->discover_rsp.p_sep_info[i].tsep);
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_svccap
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a message containing
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service capabilities parameters.
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_svccap(UINT8 **p, tAVDT_MSG *p_msg)
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_CFG cfg;
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* make sure the delay report category is not reported */
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (&cfg, p_msg->svccap.p_cfg, sizeof(tAVDT_CFG));
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cfg.psc_mask &= ~AVDT_PSC_DELAY_RPT;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_cfg(p, &cfg);
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_all_svccap
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a message containing
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service capabilities parameters.
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_all_svccap(UINT8 **p, tAVDT_MSG *p_msg)
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_msg_bld_cfg(p, p_msg->svccap.p_cfg);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_bld_security_rsp
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message building function builds a security
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  response message.
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void avdt_msg_bld_security_rsp(UINT8 **p, tAVDT_MSG *p_msg)
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(*p, p_msg->security_rsp.p_data, p_msg->security_rsp.len);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p += p_msg->security_rsp.len;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_cfg
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses the configuration
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  parameters field of a message.
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error, and element that failed
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in p_elem.
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_cfg(tAVDT_CFG *p_cfg, UINT8 *p, UINT16 len, UINT8* p_elem, UINT8 sig_id)
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_end;
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   elem = 0;
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   elem_len;
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   tmp;
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   err = 0;
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   protect_offset = 0;
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cfg)
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
592158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVDT_TRACE_ERROR ("not expecting this cfg");
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return AVDT_ERR_BAD_STATE;
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->psc_mask = 0;
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->num_codec = 0;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->num_protect = 0;
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->mux_mask = 0;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* while there is still data to parse */
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_end = p + len;
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while ((p < p_end) && (err == 0))
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* verify overall length */
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_end - p) < AVDT_LEN_CFG_MIN)
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_PAYLOAD;
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get and verify info elem id, length */
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        elem = *p++;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        elem_len = *p++;
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((elem == 0) || (elem > AVDT_CAT_MAX_CUR))
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this may not be really bad.
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * It may be a service category that is too new for us.
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * allow these to be parsed without reporting an error.
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * If this is a "capability" (as in GetCapRsp & GetConfigRsp), this is filtered out.
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * If this is a Configuration (as in SetConfigCmd & ReconfigCmd),
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             *    this will be marked as an error in the caller of this function */
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((sig_id == AVDT_SIG_SETCONFIG) || (sig_id == AVDT_SIG_RECONFIG))
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Cannot accept unknown category. */
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                err = AVDT_ERR_CATEGORY;
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else    /* GETCAP or GET_ALLCAP */
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Skip unknown categories. */
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += elem_len;
636158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati                AVDT_TRACE_DEBUG("skipping unknown service category=%d len: %d", elem, elem_len);
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                continue;
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((elem_len > avdt_msg_ie_len_max[elem]) ||
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (elem_len < avdt_msg_ie_len_min[elem]))
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = avdt_msg_ie_err[elem];
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add element to psc mask, but mask out codec or protect */
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cfg->psc_mask |= (1 << elem);
650158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVDT_TRACE_DEBUG("elem=%d elem_len: %d psc_mask=0x%x", elem, elem_len, p_cfg->psc_mask);
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* parse individual information elements with additional parameters */
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (elem)
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case AVDT_CAT_RECOV:
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->recov_type = *p++;
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->recov_mrws = *p++;
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->recov_mnmp = *p++;
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_cfg->recov_type != AVDT_RECOV_RFC2733)
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    err = AVDT_ERR_RECOV_TYPE;
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if ((p_cfg->recov_mrws < AVDT_RECOV_MRWS_MIN) ||
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         (p_cfg->recov_mrws > AVDT_RECOV_MRWS_MAX) ||
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         (p_cfg->recov_mnmp < AVDT_RECOV_MNMP_MIN) ||
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         (p_cfg->recov_mnmp > AVDT_RECOV_MNMP_MAX))
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    err = AVDT_ERR_RECOV_FMT;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case AVDT_CAT_PROTECT:
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->psc_mask &= ~AVDT_PSC_PROTECT;
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((elem_len + protect_offset) < AVDT_PROTECT_SIZE)
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->num_protect++;
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->protect_info[protect_offset] = elem_len;
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    protect_offset++;
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memcpy(&p_cfg->protect_info[protect_offset], p, elem_len);
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    protect_offset += elem_len;
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += elem_len;
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case AVDT_CAT_HDRCMP:
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->hdrcmp_mask = *p++;
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if AVDT_MULTIPLEXING == TRUE
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case AVDT_CAT_MUX:
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* verify length */
692158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati                AVDT_TRACE_WARNING("psc_mask=0x%x elem_len=%d", p_cfg->psc_mask, elem_len);
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if( ((0 == (p_cfg->psc_mask & (AVDT_PSC_RECOV|AVDT_PSC_REPORT))) && (elem_len != 3))
6942fc1a9aa23e50db07aafcff3c9f5efd509e04336Kim Schulz                    || (((p_cfg->psc_mask & AVDT_PSC_REPORT) && !(p_cfg->psc_mask & AVDT_PSC_RECOV))
6952fc1a9aa23e50db07aafcff3c9f5efd509e04336Kim Schulz                    && (elem_len != 5))
6962fc1a9aa23e50db07aafcff3c9f5efd509e04336Kim Schulz                    || ((!(p_cfg->psc_mask & AVDT_PSC_REPORT) && (p_cfg->psc_mask & AVDT_PSC_RECOV))
6972fc1a9aa23e50db07aafcff3c9f5efd509e04336Kim Schulz                    && (elem_len != 5))
6982fc1a9aa23e50db07aafcff3c9f5efd509e04336Kim Schulz                    || (((p_cfg->psc_mask & AVDT_PSC_REPORT) && (p_cfg->psc_mask & AVDT_PSC_RECOV))
6992fc1a9aa23e50db07aafcff3c9f5efd509e04336Kim Schulz                    && (elem_len != 7)) )
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    err = AVDT_ERR_MUX_FMT;
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* parse fragmentation */
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->mux_mask = *p++ & (UINT8)AVDT_MUX_FRAG;
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* parse TSIDs and TCIDs */
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(--elem_len)
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->mux_tsid_media = (*p++)>>3;
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(--elem_len)
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->mux_tcid_media = (*p++)>>3;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(--elem_len)
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->mux_tsid_report = (*p++)>>3;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(--elem_len)
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->mux_tcid_report = (*p++)>>3;
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(--elem_len)
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->mux_tsid_recov = (*p++)>>3;
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(--elem_len)
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cfg->mux_tcid_recov = (*p++)>>3;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case AVDT_CAT_CODEC:
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->psc_mask &= ~AVDT_PSC_CODEC;
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                tmp = elem_len;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (elem_len >= AVDT_CODEC_SIZE)
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    tmp = AVDT_CODEC_SIZE - 1;
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->num_codec++;
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cfg->codec_info[0] = elem_len;
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&p_cfg->codec_info[1], p, tmp);
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += elem_len;
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case AVDT_CAT_DELAY_RPT:
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += elem_len;
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        } /* switch */
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } /* while ! err, !end*/
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_elem = elem;
763158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati    AVDT_TRACE_DEBUG("err=0x%x, elem:0x%x psc_mask=0x%x", err, elem, p_cfg->psc_mask);
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_none
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a message with no parameters.
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_none(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_msg);
7825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p);
7835cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(len);
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_single
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a message with a
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  single SEID.
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_single(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       err = 0;
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify len */
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len != AVDT_LEN_SINGLE)
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = AVDT_ERR_LENGTH;
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SEID(p, p_msg->single.seid);
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (avdt_scb_by_hdl(p_msg->single.seid) == NULL)
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_SEID;
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_setconfig_cmd
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a set configuration
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_setconfig_cmd(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       err = 0;
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->hdr.err_param = 0;
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify len */
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len < AVDT_LEN_SETCONFIG_MIN)
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = AVDT_ERR_LENGTH;
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get seids */
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SEID(p, p_msg->config_cmd.hdr.seid);
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (avdt_scb_by_hdl(p_msg->config_cmd.hdr.seid) == NULL)
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_SEID;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SEID(p, p_msg->config_cmd.int_seid);
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg->config_cmd.int_seid < AVDT_SEID_MIN) ||
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_msg->config_cmd.int_seid > AVDT_SEID_MAX))
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_SEID;
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!err)
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* parse configuration parameters */
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len -= 2;
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = avdt_msg_prs_cfg(p_msg->config_cmd.p_cfg, p, len, &p_msg->hdr.err_param, AVDT_SIG_SETCONFIG);
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!err)
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* verify protocol service capabilities are supported */
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((p_msg->config_cmd.p_cfg->psc_mask & (~AVDT_PSC)) != 0) ||
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_msg->config_cmd.p_cfg->num_codec == 0))
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                err = AVDT_ERR_INVALID_CAP;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_reconfig_cmd
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a reconfiguration
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_reconfig_cmd(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       err = 0;
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->hdr.err_param = 0;
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify len */
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len < AVDT_LEN_RECONFIG_MIN)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = AVDT_ERR_LENGTH;
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get seid */
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SEID(p, p_msg->reconfig_cmd.hdr.seid);
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (avdt_scb_by_hdl(p_msg->reconfig_cmd.hdr.seid) == NULL)
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_SEID;
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* parse config parameters */
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len--;
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = avdt_msg_prs_cfg(p_msg->config_cmd.p_cfg, p, len, &p_msg->hdr.err_param, AVDT_SIG_RECONFIG);
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* verify no protocol service capabilities in parameters */
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!err)
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
917158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati                AVDT_TRACE_DEBUG("avdt_msg_prs_reconfig_cmd psc_mask=0x%x/0x%x", p_msg->config_cmd.p_cfg->psc_mask, AVDT_MSG_PSC_MASK);
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_msg->config_cmd.p_cfg->psc_mask != 0) ||
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_msg->config_cmd.p_cfg->num_codec == 0 && p_msg->config_cmd.p_cfg->num_protect == 0))
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    err = AVDT_ERR_INVALID_CAP;
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_multi
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a message containing
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  multiple SEID's.
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_multi(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   err = 0;
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->hdr.err_param = 0;
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify len */
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len < AVDT_LEN_MULTI_MIN || (len > AVDT_NUM_SEPS))
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = AVDT_ERR_LENGTH;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get and verify all seps */
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < len; i++)
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            AVDT_MSG_PRS_SEID(p, p_msg->multi.seid_list[i]);
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (avdt_scb_by_hdl(p_msg->multi.seid_list[i]) == NULL)
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                err = AVDT_ERR_SEID;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->hdr.err_param = p_msg->multi.seid_list[i];
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->multi.num_seps = (UINT8)i;
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_security_cmd
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a security
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_security_cmd(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       err = 0;
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify len */
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len < AVDT_LEN_SECURITY_MIN)
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = AVDT_ERR_LENGTH;
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get seid */
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SEID(p, p_msg->security_cmd.hdr.seid);
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (avdt_scb_by_hdl(p_msg->security_cmd.hdr.seid) == NULL)
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_SEID;
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->security_cmd.p_data = p;
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->security_cmd.len = len - 1;
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_discover_rsp
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a discover
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  response message.
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_discover_rsp(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   err = 0;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* determine number of seps; seps in msg is len/2, but set to minimum
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** of seps app has supplied memory for and seps in msg
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->discover_rsp.num_seps > (len / 2))
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->discover_rsp.num_seps = (len / 2);
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse out sep info */
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_msg->discover_rsp.num_seps; i++)
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* parse discover rsp info */
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_DISC(p, p_msg->discover_rsp.p_sep_info[i].seid,
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_msg->discover_rsp.p_sep_info[i].in_use,
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_msg->discover_rsp.p_sep_info[i].media_type,
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_msg->discover_rsp.p_sep_info[i].tsep);
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* verify that seid is valid */
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg->discover_rsp.p_sep_info[i].seid < AVDT_SEID_MIN) ||
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_msg->discover_rsp.p_sep_info[i].seid > AVDT_SEID_MAX))
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_SEID;
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_svccap
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a message containing
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service capabilities parameters.
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_svccap(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse parameters */
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   err = avdt_msg_prs_cfg(p_msg->svccap.p_cfg, p, len, &p_msg->hdr.err_param, AVDT_SIG_GETCAP);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->svccap.p_cfg)
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->svccap.p_cfg->psc_mask &= AVDT_LEG_PSC;
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (err);
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_all_svccap
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a message containing
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service capabilities parameters.
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_all_svccap(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   err = avdt_msg_prs_cfg(p_msg->svccap.p_cfg, p, len, &p_msg->hdr.err_param, AVDT_SIG_GET_ALLCAP);
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->svccap.p_cfg)
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->svccap.p_cfg->psc_mask &= AVDT_MSG_PSC_MASK;
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (err);
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_security_rsp
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parsing a security
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  response message.
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_security_rsp(tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->security_rsp.p_data = p;
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->security_rsp.len = len;
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_rej
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_rej(tAVDT_MSG *p_msg, UINT8 *p, UINT8 sig)
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((sig == AVDT_SIG_SETCONFIG) || (sig == AVDT_SIG_RECONFIG))
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.err_param = *p++;
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.err_code = *p;
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if ((sig == AVDT_SIG_START) || (sig == AVDT_SIG_SUSPEND))
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SEID(p, p_msg->hdr.err_param);
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.err_code = *p;
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.err_code = *p;
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_prs_delay_rpt
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This message parsing function parses a security
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command message.
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Error code or zero if no error.
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 avdt_msg_prs_delay_rpt (tAVDT_MSG *p_msg, UINT8 *p, UINT16 len)
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       err = 0;
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify len */
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len != AVDT_LEN_DELAY_RPT)
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1164158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVDT_TRACE_WARNING("avdt_msg_prs_delay_rpt expected len: %u  got: %u", AVDT_LEN_DELAY_RPT, len);
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = AVDT_ERR_LENGTH;
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get seid */
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SEID (p, p_msg->delay_rpt_cmd.hdr.seid);
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (avdt_scb_by_hdl(p_msg->delay_rpt_cmd.hdr.seid) == NULL)
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = AVDT_ERR_SEID;
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_msg->delay_rpt_cmd.delay, p);
1179158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVDT_TRACE_DEBUG("avdt_msg_prs_delay_rpt delay: %u", p_msg->delay_rpt_cmd.delay);
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_send
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send, and if necessary fragment the next message.
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Congested state; TRUE if CCB congested, FALSE if not.
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN avdt_msg_send(tAVDT_CCB *p_ccb, BT_HDR *p_msg)
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          curr_msg_len;
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           pkt_type;
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           hdr_len;
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_TC_TBL    *p_tbl;
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *p_buf;
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p;
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           label;
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           msg;
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           sig;
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           nosp = 0;       /* number of subsequent packets */
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* look up transport channel table entry to get peer mtu */
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl = avdt_ad_tc_tbl_by_type(AVDT_CHAN_SIG, p_ccb, NULL);
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set the current message if there is a message passed in */
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg != NULL)
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_curr_msg = p_msg;
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* store copy of curr_msg->len */
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    curr_msg_len = p_ccb->p_curr_msg->len;
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* while not congested and we haven't sent it all */
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while ((!p_ccb->cong) && (p_ccb->p_curr_msg != NULL))
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check what kind of message we've got here; we are using the offset
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** to indicate that a message is being fragmented
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if message isn't being fragmented and it fits in mtu */
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb->p_curr_msg->offset == AVDT_MSG_OFFSET) &&
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_ccb->p_curr_msg->len <= p_tbl->peer_mtu - AVDT_LEN_TYPE_SINGLE))
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pkt_type = AVDT_PKT_TYPE_SINGLE;
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hdr_len = AVDT_LEN_TYPE_SINGLE;
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf = p_ccb->p_curr_msg;
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if message isn't being fragmented and it doesn't fit in mtu */
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((p_ccb->p_curr_msg->offset == AVDT_MSG_OFFSET) &&
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (p_ccb->p_curr_msg->len > p_tbl->peer_mtu - AVDT_LEN_TYPE_SINGLE))
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pkt_type = AVDT_PKT_TYPE_START;
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hdr_len = AVDT_LEN_TYPE_START;
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            nosp = (p_ccb->p_curr_msg->len + AVDT_LEN_TYPE_START - p_tbl->peer_mtu) /
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   (p_tbl->peer_mtu - 1) + 2;
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* get a new buffer for fragment we are sending */
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID)) == NULL)
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* do we even want to try and recover from this? could do so
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                by setting retransmission timer */
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return TRUE;
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* copy portion of data from current message to new buffer */
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->offset = L2CAP_MIN_OFFSET + hdr_len;
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->len = p_tbl->peer_mtu - hdr_len;
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy((UINT8 *)(p_buf + 1) + p_buf->offset,
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   (UINT8 *)(p_ccb->p_curr_msg + 1) + p_ccb->p_curr_msg->offset, p_buf->len);
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if message is being fragmented and remaining bytes don't fit in mtu */
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((p_ccb->p_curr_msg->offset > AVDT_MSG_OFFSET) &&
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (p_ccb->p_curr_msg->len > (p_tbl->peer_mtu - AVDT_LEN_TYPE_CONT)))
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pkt_type = AVDT_PKT_TYPE_CONT;
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hdr_len = AVDT_LEN_TYPE_CONT;
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* get a new buffer for fragment we are sending */
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID)) == NULL)
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* do we even want to try and recover from this? could do so
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                by setting retransmission timer */
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return TRUE;
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* copy portion of data from current message to new buffer */
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->offset = L2CAP_MIN_OFFSET + hdr_len;
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->len = p_tbl->peer_mtu - hdr_len;
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy((UINT8 *)(p_buf + 1) + p_buf->offset,
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   (UINT8 *)(p_ccb->p_curr_msg + 1) + p_ccb->p_curr_msg->offset, p_buf->len);
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if message is being fragmented and remaining bytes do fit in mtu */
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pkt_type = AVDT_PKT_TYPE_END;
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hdr_len = AVDT_LEN_TYPE_END;
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf = p_ccb->p_curr_msg;
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* label, sig id, msg type are in hdr of p_curr_msg */
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        label = AVDT_LAYERSPEC_LABEL(p_ccb->p_curr_msg->layer_specific);
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg = AVDT_LAYERSPEC_MSG(p_ccb->p_curr_msg->layer_specific);
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sig = (UINT8) p_ccb->p_curr_msg->event;
1292158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVDT_TRACE_DEBUG("avdt_msg_send label:%d, msg:%d, sig:%d", label, msg, sig);
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* keep track of how much of msg we've sent */
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        curr_msg_len -= p_buf->len;
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (curr_msg_len == 0)
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* entire message sent; mark as finished */
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->p_curr_msg = NULL;
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start timer here for commands */
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (msg == AVDT_MSG_TYPE_CMD)
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if retransmit timeout set to zero, sig doesn't use retransmit */
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((sig == AVDT_SIG_DISCOVER) || (sig == AVDT_SIG_GETCAP) ||
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (sig == AVDT_SIG_SECURITY) || (avdt_cb.rcb.ret_tout == 0))
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btu_start_timer(&p_ccb->timer_entry, BTU_TTYPE_AVDT_CCB_RSP, avdt_cb.rcb.sig_tout);
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (sig != AVDT_SIG_DELAY_RPT)
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btu_start_timer(&p_ccb->timer_entry, BTU_TTYPE_AVDT_CCB_RET, avdt_cb.rcb.ret_tout);
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* message being fragmented and not completely sent */
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->p_curr_msg->len -= p_buf->len;
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->p_curr_msg->offset += p_buf->len;
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set up to build header */
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len += hdr_len;
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset -= hdr_len;
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1) + p_buf->offset;
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* build header */
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_BLD_HDR(p, label, pkt_type, msg);
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pkt_type == AVDT_PKT_TYPE_START)
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            AVDT_MSG_BLD_NOSP(p, nosp);
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((pkt_type == AVDT_PKT_TYPE_START) || (pkt_type == AVDT_PKT_TYPE_SINGLE))
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            AVDT_MSG_BLD_SIG(p, sig);
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send msg buffer down */
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ad_write_req(AVDT_CHAN_SIG, p_ccb, NULL, p_buf);
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_ccb->cong);
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_asmbl
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Reassemble incoming message.
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to reassembled message;  NULL if no message
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  available.
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *avdt_msg_asmbl(tAVDT_CCB *p_ccb, BT_HDR *p_buf)
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p;
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   pkt_type;
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *p_ret;
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  buf_len;
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse the message header */
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + p_buf->offset;
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_PRS_PKT_TYPE(p, pkt_type);
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* quick sanity check on length */
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf->len < avdt_msg_pkt_type_len[pkt_type])
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(p_buf);
1371158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVDT_TRACE_WARNING("Bad length during reassembly");
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ret = NULL;
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* single packet */
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (pkt_type == AVDT_PKT_TYPE_SINGLE)
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if reassembly in progress drop message and process new single */
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rx_msg != NULL)
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(p_ccb->p_rx_msg);
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->p_rx_msg = NULL;
1382158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVDT_TRACE_WARNING("Got single during reassembly");
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ret = p_buf;
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start packet */
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (pkt_type == AVDT_PKT_TYPE_START)
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if reassembly in progress drop message and process new single */
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rx_msg != NULL)
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(p_ccb->p_rx_msg);
1393158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVDT_TRACE_WARNING("Got start during reassembly");
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_rx_msg = p_buf;
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* copy first header byte over nosp */
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *(p + 1) = *p;
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set offset to point to where to copy next */
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_rx_msg->offset += p_ccb->p_rx_msg->len;
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* adjust length for packet header */
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_rx_msg->len -= 1;
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ret = NULL;
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* continue or end */
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if no reassembly in progress drop message */
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_rx_msg == NULL)
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(p_buf);
1415158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVDT_TRACE_WARNING("Pkt type=%d out of order", pkt_type);
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ret = NULL;
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* get size of buffer holding assembled message */
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            buf_len = GKI_get_buf_size(p_ccb->p_rx_msg) - sizeof(BT_HDR);
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* adjust offset and len of fragment for header byte */
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->offset += AVDT_LEN_TYPE_CONT;
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->len -= AVDT_LEN_TYPE_CONT;
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* verify length */
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_ccb->p_rx_msg->offset + p_buf->len) > buf_len)
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* won't fit; free everything */
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf(p_ccb->p_rx_msg);
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->p_rx_msg = NULL;
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf(p_buf);
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ret = NULL;
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* copy contents of p_buf to p_rx_msg */
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy((UINT8 *)(p_ccb->p_rx_msg + 1) + p_ccb->p_rx_msg->offset,
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       (UINT8 *)(p_buf + 1) + p_buf->offset, p_buf->len);
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (pkt_type == AVDT_PKT_TYPE_END)
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->p_rx_msg->offset -= p_ccb->p_rx_msg->len;
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->p_rx_msg->len += p_buf->len;
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ret = p_ccb->p_rx_msg;
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->p_rx_msg = NULL;
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->p_rx_msg->offset += p_buf->len;
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ccb->p_rx_msg->len += p_buf->len;
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_ret = NULL;
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf(p_buf);
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ret;
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_send_cmd
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a command message.  The
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sig_id parameter indicates the message type, p_params
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  points to the message parameters, if any.  It gets a buffer
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the AVDTP command pool, executes the message building
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  function for this message type.  It then queues the message
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in the command queue for this CCB.
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_msg_send_cmd(tAVDT_CCB *p_ccb, void *p_scb, UINT8 sig_id, tAVDT_MSG *p_params)
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf;
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p_start;
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get a buffer */
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf == NULL)
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1487158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVDT_TRACE_ERROR("avdt_msg_send_cmd out of buffer!!");
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up gki buf pointer and offset */
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = AVDT_MSG_OFFSET;
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_start = p = (UINT8 *)(p_buf + 1) + p_buf->offset;
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* execute parameter building function to build message */
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*avdt_msg_bld_cmd[sig_id - 1])(&p, p_params);
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set len */
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = (UINT16) (p - p_start);
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* now store scb hdls, if any, in buf */
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb != NULL)
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)(p_buf + 1);
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* for start and suspend, p_scb points to array of handles */
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((sig_id == AVDT_SIG_START) || (sig_id == AVDT_SIG_SUSPEND))
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p, (UINT8 *) p_scb, p_buf->len);
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* for all others, p_scb points to scb as usual */
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p = avdt_scb_to_hdl((tAVDT_SCB *) p_scb);
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stash sig, label, and message type in buf */
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = sig_id;
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_BLD_LAYERSPEC(p_buf->layer_specific, AVDT_MSG_TYPE_CMD, p_ccb->label);
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* increment label */
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->label = (p_ccb->label + 1) % 16;
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* queue message and trigger ccb to send it */
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue(&p_ccb->cmd_q, p_buf);
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_event(p_ccb, AVDT_CCB_SENDMSG_EVT, NULL);
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_send_rsp
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a response message.  The
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sig_id parameter indicates the message type, p_params
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  points to the message parameters, if any.  It gets a buffer
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the AVDTP command pool, executes the message building
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  function for this message type.  It then queues the message
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  in the response queue for this CCB.
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_msg_send_rsp(tAVDT_CCB *p_ccb, UINT8 sig_id, tAVDT_MSG *p_params)
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf;
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p_start;
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get a buffer */
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf == NULL) return;
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up gki buf pointer and offset */
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = AVDT_MSG_OFFSET;
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_start = p = (UINT8 *)(p_buf + 1) + p_buf->offset;
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* execute parameter building function to build message */
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*avdt_msg_bld_rsp[sig_id - 1])(&p, p_params);
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set length */
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = (UINT16) (p - p_start);
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stash sig, label, and message type in buf */
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = sig_id;
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_BLD_LAYERSPEC(p_buf->layer_specific, AVDT_MSG_TYPE_RSP, p_params->hdr.label);
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* queue message and trigger ccb to send it */
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue(&p_ccb->rsp_q, p_buf);
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_event(p_ccb, AVDT_CCB_SENDMSG_EVT, NULL);
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_send_rej
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a reject message.  The
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sig_id parameter indicates the message type.  It gets
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a buffer from the AVDTP command pool and builds the
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  message based on the message type and the error code.
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It then queues the message in the response queue for
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  this CCB.
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_msg_send_rej(tAVDT_CCB *p_ccb, UINT8 sig_id, tAVDT_MSG *p_params)
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf;
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p_start;
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get a buffer */
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf == NULL) return;
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up gki buf pointer and offset */
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = AVDT_MSG_OFFSET;
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_start = p = (UINT8 *)(p_buf + 1) + p_buf->offset;
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if sig id included, build into message */
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sig_id != AVDT_SIG_NONE)
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if this sig has a parameter, add the parameter */
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((sig_id == AVDT_SIG_SETCONFIG) ||
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (sig_id == AVDT_SIG_RECONFIG))
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            AVDT_MSG_BLD_PARAM(p, p_params->hdr.err_param);
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((sig_id == AVDT_SIG_START) ||
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (sig_id == AVDT_SIG_SUSPEND))
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            AVDT_MSG_BLD_SEID(p, p_params->hdr.err_param);
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add the error code */
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_BLD_ERR(p, p_params->hdr.err_code);
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1623158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati    AVDT_TRACE_DEBUG("avdt_msg_send_rej");
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* calculate length */
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = (UINT16) (p - p_start);
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stash sig, label, and message type in buf */
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = sig_id;
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_BLD_LAYERSPEC(p_buf->layer_specific, AVDT_MSG_TYPE_REJ, p_params->hdr.label);
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* queue message and trigger ccb to send it */
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue(&p_ccb->rsp_q, p_buf);
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_event(p_ccb, AVDT_CCB_SENDMSG_EVT, NULL);
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_send_grej
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send a general reject message.  The
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sig_id parameter indicates the message type.  It gets
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a buffer from the AVDTP command pool and builds the
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  message based on the message type and the error code.
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It then queues the message in the response queue for
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  this CCB.
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_msg_send_grej(tAVDT_CCB *p_ccb, UINT8 sig_id, tAVDT_MSG *p_params)
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf;
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p_start;
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get a buffer */
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf == NULL) return;
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up gki buf pointer and offset */
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = AVDT_MSG_OFFSET;
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_start = p = (UINT8 *)(p_buf + 1) + p_buf->offset;
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* calculate length */
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = (UINT16) (p - p_start);
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stash sig, label, and message type in buf */
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = sig_id;
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_BLD_LAYERSPEC(p_buf->layer_specific, AVDT_MSG_TYPE_GRJ, p_params->hdr.label);
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //p_buf->event = 0;
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //AVDT_BLD_LAYERSPEC(p_buf->layer_specific, 0, p_params->hdr.label);
1674158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati    AVDT_TRACE_DEBUG("avdt_msg_send_grej");
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* queue message and trigger ccb to send it */
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue(&p_ccb->rsp_q, p_buf);
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    avdt_ccb_event(p_ccb, AVDT_CCB_SENDMSG_EVT, NULL);
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         avdt_msg_ind
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the adaption layer when an
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  incoming message is received on the signaling channel.
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It parses the message and sends an event to the appropriate
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  SCB or CCB for the message.
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avdt_msg_ind(tAVDT_CCB *p_ccb, BT_HDR *p_buf)
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_SCB   *p_scb;
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     ok = TRUE;
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     handle_rsp = FALSE;
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     gen_rej = FALSE;
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       label;
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       pkt_type;
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       msg_type;
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       sig = 0;
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_MSG   msg;
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tAVDT_CFG   cfg;
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       err;
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       evt = 0;
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       scb_hdl;
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* reassemble message; if no message available (we received a fragment) return */
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = avdt_msg_asmbl(p_ccb, p_buf)) == NULL)
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)(p_buf + 1) + p_buf->offset;
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse the message header */
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    AVDT_MSG_PRS_HDR(p, label, pkt_type, msg_type);
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1722158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati    /* AVDT_TRACE_DEBUG("msg_type=%d", msg_type); */
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up label and ccb_idx in message hdr */
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.hdr.label = label;
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb);
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* verify msg type */
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (msg_type == AVDT_MSG_TYPE_GRJ)
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1730158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati        AVDT_TRACE_WARNING("Dropping msg msg_type=%d", msg_type);
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ok = FALSE;
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check for general reject */
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if ((msg_type == AVDT_MSG_TYPE_REJ) && (p_buf->len == AVDT_LEN_GEN_REJ))
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gen_rej = TRUE;
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_curr_cmd != NULL)
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.hdr.sig_id = sig = (UINT8) p_ccb->p_curr_cmd->event;
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt = avdt_msg_rej_2_evt[sig - 1];
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.hdr.err_code = AVDT_ERR_NSC;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.hdr.err_param = 0;
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* not a general reject */
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get and verify signal */
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AVDT_MSG_PRS_SIG(p, sig);
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.hdr.sig_id = sig;
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((sig == 0) || (sig > AVDT_SIG_MAX))
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1752158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVDT_TRACE_WARNING("Dropping msg sig=%d msg_type:%d", sig, msg_type);
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ok = FALSE;
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send a general reject */
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (msg_type == AVDT_MSG_TYPE_CMD)
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                avdt_msg_send_grej(p_ccb, sig, &msg);
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ok && !gen_rej)
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* skip over header (msg length already verified during reassembly) */
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len -= AVDT_LEN_TYPE_SINGLE;
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set up to parse message */
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((msg_type == AVDT_MSG_TYPE_RSP) && (sig == AVDT_SIG_DISCOVER))
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* parse discover rsp message to struct supplied by app */
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.discover_rsp.p_sep_info = (tAVDT_SEP_INFO *) p_ccb->p_proc_data;
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.discover_rsp.num_seps = p_ccb->proc_param;
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((msg_type == AVDT_MSG_TYPE_RSP) &&
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((sig == AVDT_SIG_GETCAP) || (sig == AVDT_SIG_GET_ALLCAP)))
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* parse discover rsp message to struct supplied by app */
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.svccap.p_cfg = (tAVDT_CFG *) p_ccb->p_proc_data;
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((msg_type == AVDT_MSG_TYPE_RSP) && (sig == AVDT_SIG_GETCONFIG))
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* parse get config rsp message to struct allocated locally */
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.svccap.p_cfg = &cfg;
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((msg_type == AVDT_MSG_TYPE_CMD) && (sig == AVDT_SIG_SETCONFIG))
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* parse config cmd message to struct allocated locally */
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.config_cmd.p_cfg = &cfg;
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((msg_type == AVDT_MSG_TYPE_CMD) && (sig == AVDT_SIG_RECONFIG))
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* parse reconfig cmd message to struct allocated locally */
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.reconfig_cmd.p_cfg = &cfg;
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* parse message; while we're at it map message sig to event */
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (msg_type == AVDT_MSG_TYPE_CMD)
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.hdr.err_code = err = (*avdt_msg_prs_cmd[sig - 1])(&msg, p, p_buf->len);
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt = avdt_msg_cmd_2_evt[sig - 1];
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (msg_type == AVDT_MSG_TYPE_RSP)
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            msg.hdr.err_code = err = (*avdt_msg_prs_rsp[sig - 1])(&msg, p, p_buf->len);
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt = avdt_msg_rsp_2_evt[sig - 1];
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* msg_type == AVDT_MSG_TYPE_REJ */
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err = avdt_msg_prs_rej(&msg, p, sig);
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt = avdt_msg_rej_2_evt[sig - 1];
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if parsing failed */
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (err != 0)
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1817158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati            AVDT_TRACE_WARNING("Parsing failed sig=%d err=0x%x", sig, err);
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if its a rsp or rej, drop it; if its a cmd, send a rej;
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** note special case for abort; never send abort reject
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ok = FALSE;
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((msg_type == AVDT_MSG_TYPE_CMD) && (sig != AVDT_SIG_ABORT))
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                avdt_msg_send_rej(p_ccb, sig, &msg);
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if its a rsp or rej, check sent cmd to see if we're waiting for
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the rsp or rej.  If we didn't send a cmd for it, drop it.  If
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** it does match a cmd, stop timer for the cmd.
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ok)
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((msg_type == AVDT_MSG_TYPE_RSP) || (msg_type == AVDT_MSG_TYPE_REJ))
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_ccb->p_curr_cmd != NULL) &&
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_ccb->p_curr_cmd->event == sig) &&
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (AVDT_LAYERSPEC_LABEL(p_ccb->p_curr_cmd->layer_specific) == label))
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* stop timer */
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btu_stop_timer(&p_ccb->timer_entry);
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* clear retransmission count */
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb->ret_count = 0;
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* later in this function handle ccb event */
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                handle_rsp = TRUE;
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ok = FALSE;
1854158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati                AVDT_TRACE_WARNING("Cmd not found for rsp sig=%d label=%d", sig, label);
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ok)
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if it's a ccb event send to ccb */
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (evt & AVDT_CCB_MKR)
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            avdt_ccb_event(p_ccb, (UINT8)(evt & ~AVDT_CCB_MKR), (tAVDT_CCB_EVT *) &msg);
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if it's a scb event */
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Scb events always have a single seid.  For cmd, get seid from
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** message.  For rej and rsp, get seid from p_curr_cmd.
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (msg_type == AVDT_MSG_TYPE_CMD)
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                scb_hdl = msg.single.seid;
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                scb_hdl = *((UINT8 *)(p_ccb->p_curr_cmd + 1));
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Map seid to the scb and send it the event.  For cmd, seid has
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** already been verified by parsing function.
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (evt && (p_scb = avdt_scb_by_hdl(scb_hdl)) != NULL)
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                avdt_scb_event(p_scb, evt, (tAVDT_SCB_EVT *) &msg);
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free message buffer */
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_freebuf(p_buf);
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if its a rsp or rej, send event to ccb to free associated
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** cmd msg buffer and handle cmd queue
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (handle_rsp)
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        avdt_ccb_event(p_ccb, AVDT_CCB_RCVRSP_EVT, NULL);
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1902