Home | History | Annotate | Download | only in avdt
      1 /******************************************************************************
      2  *
      3  *  Copyright 2002-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This module contains the action functions associated with the stream
     22  *  control block state machine.
     23  *
     24  ******************************************************************************/
     25 
     26 #include <string.h>
     27 #include "a2dp_codec_api.h"
     28 #include "avdt_api.h"
     29 #include "avdt_int.h"
     30 #include "avdtc_api.h"
     31 #include "bt_common.h"
     32 #include "bt_target.h"
     33 #include "bt_types.h"
     34 #include "bt_utils.h"
     35 #include "btu.h"
     36 #include "osi/include/osi.h"
     37 
     38 /* This table is used to lookup the callback event that matches a particular
     39  * state machine API request event.  Note that state machine API request
     40  * events are at the beginning of the event list starting at zero, thus
     41  * allowing for this table.
     42  */
     43 const uint8_t avdt_scb_cback_evt[] = {
     44     0,                     /* API_REMOVE_EVT (no event) */
     45     AVDT_WRITE_CFM_EVT,    /* API_WRITE_REQ_EVT */
     46     0,                     /* API_GETCONFIG_REQ_EVT (no event) */
     47     0,                     /* API_DELAY_RPT_REQ_EVT (no event) */
     48     AVDT_OPEN_CFM_EVT,     /* API_SETCONFIG_REQ_EVT */
     49     AVDT_OPEN_CFM_EVT,     /* API_OPEN_REQ_EVT */
     50     AVDT_CLOSE_CFM_EVT,    /* API_CLOSE_REQ_EVT */
     51     AVDT_RECONFIG_CFM_EVT, /* API_RECONFIG_REQ_EVT */
     52     AVDT_SECURITY_CFM_EVT, /* API_SECURITY_REQ_EVT */
     53     0                      /* API_ABORT_REQ_EVT (no event) */
     54 };
     55 
     56 /*******************************************************************************
     57  *
     58  * Function         avdt_scb_gen_ssrc
     59  *
     60  * Description      This function generates a SSRC number unique to the stream.
     61  *
     62  * Returns          SSRC value.
     63  *
     64  ******************************************************************************/
     65 uint32_t avdt_scb_gen_ssrc(AvdtpScb* p_scb) {
     66   /* combine the value of the media type and codec type of the SCB */
     67   return ((uint32_t)(p_scb->stream_config.cfg.codec_info[1] |
     68                      p_scb->stream_config.cfg.codec_info[2]));
     69 }
     70 
     71 /*******************************************************************************
     72  *
     73  * Function         avdt_scb_hdl_abort_cmd
     74  *
     75  * Description      This function sends the SCB an AVDT_SCB_API_ABORT_RSP_EVT
     76  *                  to initiate sending of an abort response message.
     77  *
     78  * Returns          Nothing.
     79  *
     80  ******************************************************************************/
     81 void avdt_scb_hdl_abort_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
     82   p_scb->role = AVDT_CLOSE_ACP;
     83   avdt_scb_event(p_scb, AVDT_SCB_API_ABORT_RSP_EVT, p_data);
     84 }
     85 
     86 /*******************************************************************************
     87  *
     88  * Function         avdt_scb_hdl_abort_rsp
     89  *
     90  * Description      This function is an empty function; it serves as a
     91  *                  placeholder for a conformance API action function.
     92  *
     93  * Returns          Nothing.
     94  *
     95  ******************************************************************************/
     96 void avdt_scb_hdl_abort_rsp(UNUSED_ATTR AvdtpScb* p_scb,
     97                             UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
     98   return;
     99 }
    100 
    101 /*******************************************************************************
    102  *
    103  * Function         avdt_scb_hdl_close_cmd
    104  *
    105  * Description      This function sends the SCB an AVDT_SCB_API_CLOSE_RSP_EVT
    106  *                  to initiate sending of a close response message.
    107  *
    108  * Returns          Nothing.
    109  *
    110  ******************************************************************************/
    111 void avdt_scb_hdl_close_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    112   p_scb->role = AVDT_CLOSE_ACP;
    113   avdt_scb_event(p_scb, AVDT_SCB_API_CLOSE_RSP_EVT, p_data);
    114 }
    115 
    116 /*******************************************************************************
    117  *
    118  * Function         avdt_scb_hdl_close_rsp
    119  *
    120  * Description      This function sets the close_code variable to the error
    121  *                  code returned in the close response.
    122  *
    123  * Returns          Nothing.
    124  *
    125  ******************************************************************************/
    126 void avdt_scb_hdl_close_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    127   p_scb->close_code = p_data->msg.hdr.err_code;
    128 }
    129 
    130 /*******************************************************************************
    131  *
    132  * Function         avdt_scb_hdl_getconfig_cmd
    133  *
    134  * Description      This function retrieves the configuration parameters of
    135  *                  the SCB and sends the SCB an AVDT_SCB_API_GETCONFIG_RSP_EVT
    136  *                  to initiate sending of a get configuration response message.
    137  *
    138  * Returns          Nothing.
    139  *
    140  ******************************************************************************/
    141 void avdt_scb_hdl_getconfig_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    142   p_data->msg.svccap.p_cfg = &p_scb->curr_cfg;
    143 
    144   avdt_scb_event(p_scb, AVDT_SCB_API_GETCONFIG_RSP_EVT, p_data);
    145 }
    146 
    147 /*******************************************************************************
    148  *
    149  * Function         avdt_scb_hdl_getconfig_rsp
    150  *
    151  * Description      This function is an empty function; it serves as a
    152  *                  placeholder for a conformance API action function.
    153  *
    154  * Returns          Nothing.
    155  *
    156  ******************************************************************************/
    157 void avdt_scb_hdl_getconfig_rsp(UNUSED_ATTR AvdtpScb* p_scb,
    158                                 UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
    159   return;
    160 }
    161 
    162 /*******************************************************************************
    163  *
    164  * Function         avdt_scb_hdl_open_cmd
    165  *
    166  * Description      This function sends the SCB an AVDT_SCB_API_OPEN_RSP_EVT
    167  *                  to initiate sending of an open response message.
    168  *
    169  * Returns          Nothing.
    170  *
    171  ******************************************************************************/
    172 void avdt_scb_hdl_open_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    173   avdt_scb_event(p_scb, AVDT_SCB_API_OPEN_RSP_EVT, p_data);
    174 }
    175 
    176 /*******************************************************************************
    177  *
    178  * Function         avdt_scb_hdl_open_rej
    179  *
    180  * Description      This function calls the application callback function
    181  *                  indicating the open request has failed.  It initializes
    182  *                  certain SCB variables and sends a AVDT_CCB_UL_CLOSE_EVT
    183  *                  to the CCB.
    184  *
    185  * Returns          Nothing.
    186  *
    187  ******************************************************************************/
    188 void avdt_scb_hdl_open_rej(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    189   /* do exactly same as setconfig reject */
    190   avdt_scb_hdl_setconfig_rej(p_scb, p_data);
    191 }
    192 
    193 /*******************************************************************************
    194  *
    195  * Function         avdt_scb_hdl_open_rsp
    196  *
    197  * Description      This function calls avdt_ad_open_req() to initiate
    198  *                  connection of the transport channel for this stream.
    199  *
    200  * Returns          Nothing.
    201  *
    202  ******************************************************************************/
    203 void avdt_scb_hdl_open_rsp(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
    204   /* initiate opening of trans channels for this SEID */
    205   p_scb->role = AVDT_OPEN_INT;
    206   avdt_ad_open_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, AVDT_INT);
    207 
    208   /* start tc connect timer */
    209   alarm_set_on_mloop(p_scb->transport_channel_timer,
    210                      AVDT_SCB_TC_CONN_TIMEOUT_MS,
    211                      avdt_scb_transport_channel_timer_timeout, p_scb);
    212 }
    213 
    214 /*******************************************************************************
    215  *
    216  * Function         avdt_scb_hdl_pkt_no_frag
    217  *
    218  * Description
    219  *
    220  * Returns          Nothing.
    221  *
    222  ******************************************************************************/
    223 void avdt_scb_hdl_pkt_no_frag(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    224   uint8_t *p, *p_start;
    225   uint8_t o_v, o_p, o_x, o_cc;
    226   uint8_t m_pt;
    227   uint8_t marker;
    228   uint16_t seq;
    229   uint32_t time_stamp;
    230   uint16_t offset;
    231   uint16_t ex_len;
    232   uint8_t pad_len = 0;
    233 
    234   p = p_start = (uint8_t*)(p_data->p_pkt + 1) + p_data->p_pkt->offset;
    235 
    236   /* parse media packet header */
    237   AVDT_MSG_PRS_OCTET1(p, o_v, o_p, o_x, o_cc);
    238   AVDT_MSG_PRS_M_PT(p, m_pt, marker);
    239   BE_STREAM_TO_UINT16(seq, p);
    240   BE_STREAM_TO_UINT32(time_stamp, p);
    241   p += 4;
    242 
    243   /* skip over any csrc's in packet */
    244   p += o_cc * 4;
    245 
    246   /* check for and skip over extension header */
    247   if (o_x) {
    248     p += 2;
    249     BE_STREAM_TO_UINT16(ex_len, p);
    250     p += ex_len * 4;
    251   }
    252 
    253   /* save our new offset */
    254   offset = (uint16_t)(p - p_start);
    255 
    256   /* adjust length for any padding at end of packet */
    257   if (o_p) {
    258     /* padding length in last byte of packet */
    259     pad_len = *(p_start + p_data->p_pkt->len);
    260   }
    261 
    262   /* do sanity check */
    263   if ((offset > p_data->p_pkt->len) ||
    264       ((pad_len + offset) > p_data->p_pkt->len)) {
    265     AVDT_TRACE_WARNING("Got bad media packet");
    266     osi_free_and_reset((void**)&p_data->p_pkt);
    267   }
    268   /* adjust offset and length and send it up */
    269   else {
    270     p_data->p_pkt->len -= (offset + pad_len);
    271     p_data->p_pkt->offset += offset;
    272 
    273     if (p_scb->stream_config.p_sink_data_cback != NULL) {
    274       /* report sequence number */
    275       p_data->p_pkt->layer_specific = seq;
    276       (*p_scb->stream_config.p_sink_data_cback)(
    277           avdt_scb_to_hdl(p_scb), p_data->p_pkt, time_stamp,
    278           (uint8_t)(m_pt | (marker << 7)));
    279     } else {
    280       osi_free_and_reset((void**)&p_data->p_pkt);
    281     }
    282   }
    283 }
    284 
    285 /*******************************************************************************
    286  *
    287  * Function         avdt_scb_hdl_report
    288  *
    289  * Description
    290  *
    291  * Returns          Nothing.
    292  *
    293  ******************************************************************************/
    294 uint8_t* avdt_scb_hdl_report(AvdtpScb* p_scb, uint8_t* p, uint16_t len) {
    295   uint16_t result = AVDT_SUCCESS;
    296   uint8_t* p_start = p;
    297   uint32_t ssrc;
    298   uint8_t o_v, o_p, o_cc;
    299   AVDT_REPORT_TYPE pt;
    300   tAVDT_REPORT_DATA report;
    301 
    302   AVDT_TRACE_DEBUG("%s", __func__);
    303   if (p_scb->stream_config.p_report_cback) {
    304     /* parse report packet header */
    305     AVDT_MSG_PRS_RPT_OCTET1(p, o_v, o_p, o_cc);
    306     pt = *p++;
    307     p += 2;
    308     BE_STREAM_TO_UINT32(ssrc, p);
    309 
    310     switch (pt) {
    311       case AVDT_RTCP_PT_SR: /* the packet type - SR (Sender Report) */
    312         BE_STREAM_TO_UINT32(report.sr.ntp_sec, p);
    313         BE_STREAM_TO_UINT32(report.sr.ntp_frac, p);
    314         BE_STREAM_TO_UINT32(report.sr.rtp_time, p);
    315         BE_STREAM_TO_UINT32(report.sr.pkt_count, p);
    316         BE_STREAM_TO_UINT32(report.sr.octet_count, p);
    317         break;
    318 
    319       case AVDT_RTCP_PT_RR: /* the packet type - RR (Receiver Report) */
    320         report.rr.frag_lost = *p;
    321         BE_STREAM_TO_UINT32(report.rr.packet_lost, p);
    322         report.rr.packet_lost &= 0xFFFFFF;
    323         BE_STREAM_TO_UINT32(report.rr.seq_num_rcvd, p);
    324         BE_STREAM_TO_UINT32(report.rr.jitter, p);
    325         BE_STREAM_TO_UINT32(report.rr.lsr, p);
    326         BE_STREAM_TO_UINT32(report.rr.dlsr, p);
    327         break;
    328 
    329       case AVDT_RTCP_PT_SDES: /* the packet type - SDES (Source Description) */
    330         uint8_t sdes_type;
    331         BE_STREAM_TO_UINT8(sdes_type, p);
    332         if (sdes_type == AVDT_RTCP_SDES_CNAME) {
    333           uint8_t name_length;
    334           BE_STREAM_TO_UINT8(name_length, p);
    335           if (name_length > len - 2 || name_length > AVDT_MAX_CNAME_SIZE) {
    336             result = AVDT_BAD_PARAMS;
    337           } else {
    338             BE_STREAM_TO_ARRAY(p, &(report.cname[0]), name_length);
    339           }
    340         } else {
    341           AVDT_TRACE_WARNING(" - SDES SSRC=0x%08x sc=%d %d len=%d %s", ssrc,
    342                              o_cc, *p, *(p + 1), p + 2);
    343           result = AVDT_BUSY;
    344         }
    345         break;
    346 
    347       default:
    348         AVDT_TRACE_ERROR("Bad Report pkt - packet type: %d", pt);
    349         result = AVDT_BAD_PARAMS;
    350     }
    351 
    352     if (result == AVDT_SUCCESS)
    353       (*p_scb->stream_config.p_report_cback)(avdt_scb_to_hdl(p_scb), pt,
    354                                              &report);
    355   }
    356   p_start += len;
    357   return p_start;
    358 }
    359 
    360 /*******************************************************************************
    361  *
    362  * Function         avdt_scb_hdl_pkt
    363  *
    364  * Description
    365  *
    366  * Returns          Nothing.
    367  *
    368  ******************************************************************************/
    369 void avdt_scb_hdl_pkt(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    370   if (p_data->p_pkt->layer_specific == AVDT_CHAN_REPORT) {
    371     uint8_t* p = (uint8_t*)(p_data->p_pkt + 1) + p_data->p_pkt->offset;
    372     avdt_scb_hdl_report(p_scb, p, p_data->p_pkt->len);
    373     osi_free_and_reset((void**)&p_data->p_pkt);
    374   } else {
    375     avdt_scb_hdl_pkt_no_frag(p_scb, p_data);
    376   }
    377 }
    378 
    379 /*******************************************************************************
    380  *
    381  * Function         avdt_scb_drop_pkt
    382  *
    383  * Description      Drop an incoming media packet.  This function is called if
    384  *                  a media packet is received in any state besides streaming.
    385  *
    386  * Returns          Nothing.
    387  *
    388  ******************************************************************************/
    389 void avdt_scb_drop_pkt(UNUSED_ATTR AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    390   AVDT_TRACE_ERROR("%s dropped incoming media packet", __func__);
    391   osi_free_and_reset((void**)&p_data->p_pkt);
    392 }
    393 
    394 /*******************************************************************************
    395  *
    396  * Function         avdt_scb_hdl_reconfig_cmd
    397  *
    398  * Description      This function calls the application callback function
    399  *                  with a reconfiguration indication.
    400  *
    401  * Returns          Nothing.
    402  *
    403  ******************************************************************************/
    404 void avdt_scb_hdl_reconfig_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    405   /* if command not supported */
    406   if (p_scb->stream_config.nsc_mask & AvdtpStreamConfig::AVDT_NSC_RECONFIG) {
    407     /* send reject */
    408     p_data->msg.hdr.err_code = AVDT_ERR_NSC;
    409     p_data->msg.hdr.err_param = 0;
    410     avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_RSP_EVT, p_data);
    411   } else {
    412     /* store requested configuration */
    413     p_scb->req_cfg = *p_data->msg.reconfig_cmd.p_cfg;
    414 
    415     /* call application callback */
    416     (*p_scb->stream_config.p_avdt_ctrl_cback)(
    417         avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_RECONFIG_IND_EVT,
    418         (tAVDT_CTRL*)&p_data->msg.reconfig_cmd, p_scb->stream_config.scb_index);
    419   }
    420 }
    421 
    422 /*******************************************************************************
    423  *
    424  * Function         avdt_scb_hdl_reconfig_rsp
    425  *
    426  * Description      This function calls the application callback function
    427  *                  with a reconfiguration confirm.
    428  *
    429  * Returns          Nothing.
    430  *
    431  ******************************************************************************/
    432 void avdt_scb_hdl_reconfig_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    433   if (p_data->msg.hdr.err_code == 0) {
    434     /* store new configuration */
    435     if (p_scb->req_cfg.num_codec > 0) {
    436       p_scb->curr_cfg.num_codec = p_scb->req_cfg.num_codec;
    437       memcpy(p_scb->curr_cfg.codec_info, p_scb->req_cfg.codec_info,
    438              AVDT_CODEC_SIZE);
    439     }
    440     if (p_scb->req_cfg.num_protect > 0) {
    441       p_scb->curr_cfg.num_protect = p_scb->req_cfg.num_protect;
    442       memcpy(p_scb->curr_cfg.protect_info, p_scb->req_cfg.protect_info,
    443              AVDT_PROTECT_SIZE);
    444     }
    445   }
    446 
    447   p_data->msg.svccap.p_cfg = &p_scb->curr_cfg;
    448 
    449   /* call application callback */
    450   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    451       avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_RECONFIG_CFM_EVT,
    452       (tAVDT_CTRL*)&p_data->msg.svccap, p_scb->stream_config.scb_index);
    453 }
    454 
    455 /*******************************************************************************
    456  *
    457  * Function         avdt_scb_hdl_security_cmd
    458  *
    459  * Description      This function calls the application callback with a
    460  *                  security indication.
    461  *
    462  * Returns          Nothing.
    463  *
    464  ******************************************************************************/
    465 void avdt_scb_hdl_security_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    466   /* if command not supported */
    467   if (p_scb->stream_config.nsc_mask & AvdtpStreamConfig::AVDT_NSC_SECURITY) {
    468     /* send reject */
    469     p_data->msg.hdr.err_code = AVDT_ERR_NSC;
    470     avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_RSP_EVT, p_data);
    471   } else {
    472     /* call application callback */
    473     (*p_scb->stream_config.p_avdt_ctrl_cback)(
    474         avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_SECURITY_IND_EVT,
    475         (tAVDT_CTRL*)&p_data->msg.security_cmd, p_scb->stream_config.scb_index);
    476   }
    477 }
    478 
    479 /*******************************************************************************
    480  *
    481  * Function         avdt_scb_hdl_security_rsp
    482  *
    483  * Description      This function calls the application callback with a
    484  *                  security confirm.
    485  *
    486  * Returns          Nothing.
    487  *
    488  ******************************************************************************/
    489 void avdt_scb_hdl_security_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    490   /* call application callback */
    491   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    492       avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_SECURITY_CFM_EVT,
    493       (tAVDT_CTRL*)&p_data->msg.security_cmd, p_scb->stream_config.scb_index);
    494 }
    495 
    496 /*******************************************************************************
    497  *
    498  * Function         avdt_scb_hdl_setconfig_cmd
    499  *
    500  * Description      This function marks the SCB as in use and copies the
    501  *                  configuration and peer SEID to the SCB.  It then calls
    502  *                  the application callback with a configuration indication.
    503  *
    504  * Returns          Nothing.
    505  *
    506  ******************************************************************************/
    507 void avdt_scb_hdl_setconfig_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    508   AVDT_TRACE_DEBUG("%s: p_scb->in_use=%d p_avdt_scb=%p scb_index=%d", __func__,
    509                    p_scb->in_use, p_scb, p_scb->stream_config.scb_index);
    510 
    511   if (!p_scb->in_use) {
    512     AVDT_TRACE_DEBUG(
    513         "%s: codec: %s", __func__,
    514         A2DP_CodecInfoString(p_scb->stream_config.cfg.codec_info).c_str());
    515     AVDT_TRACE_DEBUG(
    516         "%s: codec: %s", __func__,
    517         A2DP_CodecInfoString(p_data->msg.config_cmd.p_cfg->codec_info).c_str());
    518     AvdtpSepConfig* p_cfg = p_data->msg.config_cmd.p_cfg;
    519     if (A2DP_GetCodecType(p_scb->stream_config.cfg.codec_info) ==
    520         A2DP_GetCodecType(p_cfg->codec_info)) {
    521       /* copy info to scb */
    522       AvdtpCcb* p_ccb = avdt_ccb_by_idx(p_data->msg.config_cmd.hdr.ccb_idx);
    523       if (p_scb->p_ccb != p_ccb) {
    524         AVDT_TRACE_ERROR(
    525             "%s: mismatch in AVDTP SCB/CCB state: (p_scb->p_ccb=%p != "
    526             "p_ccb=%p): "
    527             "p_scb=%p scb_handle=%d ccb_idx=%d",
    528             __func__, p_scb->p_ccb, p_ccb, p_scb, p_scb->ScbHandle(),
    529             p_data->msg.config_cmd.hdr.ccb_idx);
    530         avdt_scb_rej_not_in_use(p_scb, p_data);
    531         return;
    532       }
    533       /* set sep as in use */
    534       p_scb->in_use = true;
    535 
    536       p_scb->peer_seid = p_data->msg.config_cmd.int_seid;
    537       p_scb->req_cfg = *p_cfg;
    538       /* call app callback */
    539       /* handle of scb- which is same as sep handle of bta_av_cb.p_scb*/
    540       (*p_scb->stream_config.p_avdt_ctrl_cback)(
    541           avdt_scb_to_hdl(p_scb),
    542           p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    543           AVDT_CONFIG_IND_EVT, (tAVDT_CTRL*)&p_data->msg.config_cmd,
    544           p_scb->stream_config.scb_index);
    545     } else {
    546       p_data->msg.hdr.err_code = AVDT_ERR_UNSUP_CFG;
    547       p_data->msg.hdr.err_param = 0;
    548       avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx),
    549                         p_data->msg.hdr.sig_id, &p_data->msg);
    550     }
    551   } else {
    552     AVDT_TRACE_DEBUG("%s: calling avdt_scb_rej_in_use()", __func__);
    553     avdt_scb_rej_in_use(p_scb, p_data);
    554   }
    555 }
    556 
    557 /*******************************************************************************
    558  *
    559  * Function         avdt_scb_hdl_setconfig_rej
    560  *
    561  * Description      This function marks the SCB as not in use and calls the
    562  *                  application callback with an open confirm indicating
    563  *                  failure.
    564  *
    565  * Returns          Nothing.
    566  *
    567  ******************************************************************************/
    568 void avdt_scb_hdl_setconfig_rej(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    569   /* clear scb variables */
    570   avdt_scb_clr_vars(p_scb, p_data);
    571 
    572   /* tell ccb we're done with signaling channel */
    573   avdt_ccb_event(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx),
    574                  AVDT_CCB_UL_CLOSE_EVT, NULL);
    575 
    576   /* call application callback */
    577   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    578       avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_OPEN_CFM_EVT,
    579       (tAVDT_CTRL*)&p_data->msg.hdr, p_scb->stream_config.scb_index);
    580 }
    581 
    582 /*******************************************************************************
    583  *
    584  * Function         avdt_scb_hdl_setconfig_rsp
    585  *
    586  * Description      This function sends the SCB an AVDT_SCB_API_OPEN_REQ_EVT
    587  *                  to initiate sending of an open command message.
    588  *
    589  * Returns          Nothing.
    590  *
    591  ******************************************************************************/
    592 void avdt_scb_hdl_setconfig_rsp(AvdtpScb* p_scb,
    593                                 UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
    594   tAVDT_EVT_HDR single;
    595 
    596   if (p_scb->p_ccb != NULL) {
    597     /* save configuration */
    598     p_scb->curr_cfg = p_scb->req_cfg;
    599 
    600     /* initiate open */
    601     single.seid = p_scb->peer_seid;
    602     tAVDT_SCB_EVT avdt_scb_evt;
    603     avdt_scb_evt.msg.single = single;
    604     avdt_scb_event(p_scb, AVDT_SCB_API_OPEN_REQ_EVT, &avdt_scb_evt);
    605   }
    606 }
    607 
    608 /*******************************************************************************
    609  *
    610  * Function         avdt_scb_hdl_start_cmd
    611  *
    612  * Description      This function calls the application callback with a
    613  *                  start indication.
    614  *
    615  * Returns          Nothing.
    616  *
    617  ******************************************************************************/
    618 void avdt_scb_hdl_start_cmd(AvdtpScb* p_scb,
    619                             UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
    620   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    621       avdt_scb_to_hdl(p_scb),
    622       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    623       AVDT_START_IND_EVT, NULL, p_scb->stream_config.scb_index);
    624 }
    625 
    626 /*******************************************************************************
    627  *
    628  * Function         avdt_scb_hdl_start_rsp
    629  *
    630  * Description      This function calls the application callback with a
    631  *                  start confirm.
    632  *
    633  * Returns          Nothing.
    634  *
    635  ******************************************************************************/
    636 void avdt_scb_hdl_start_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    637   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    638       avdt_scb_to_hdl(p_scb),
    639       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    640       AVDT_START_CFM_EVT, (tAVDT_CTRL*)&p_data->msg.hdr,
    641       p_scb->stream_config.scb_index);
    642 }
    643 
    644 /*******************************************************************************
    645  *
    646  * Function         avdt_scb_hdl_suspend_cmd
    647  *
    648  * Description      This function calls the application callback with a suspend
    649  *                  indication.
    650  *
    651  * Returns          Nothing.
    652  *
    653  ******************************************************************************/
    654 void avdt_scb_hdl_suspend_cmd(AvdtpScb* p_scb,
    655                               UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
    656   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    657       avdt_scb_to_hdl(p_scb),
    658       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    659       AVDT_SUSPEND_IND_EVT, NULL, p_scb->stream_config.scb_index);
    660 }
    661 
    662 /*******************************************************************************
    663  *
    664  * Function         avdt_scb_hdl_suspend_rsp
    665  *
    666  * Description      This function calls the application callback with a suspend
    667  *                  confirm.
    668  *
    669  * Returns          Nothing.
    670  *
    671  ******************************************************************************/
    672 void avdt_scb_hdl_suspend_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    673   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    674       avdt_scb_to_hdl(p_scb),
    675       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    676       AVDT_SUSPEND_CFM_EVT, (tAVDT_CTRL*)&p_data->msg.hdr,
    677       p_scb->stream_config.scb_index);
    678 }
    679 
    680 /*******************************************************************************
    681  *
    682  * Function         avdt_scb_hdl_tc_close
    683  *
    684  * Description      This function is called when the transport channel is
    685  *                  closed.  It marks the SCB as not in use and
    686  *                  initializes certain SCB parameters.  It then sends
    687  *                  an AVDT_CCB_UL_CLOSE_EVT to the CCB if the SCB
    688  *                  initiated the close.  It then checks to see if the SCB
    689  *                  is to be removed.  If it is it deallocates the SCB.
    690  *                  Finally, it calls the application callback with a close
    691  *                  indication.
    692  *
    693  * Returns          Nothing.
    694  *
    695  ******************************************************************************/
    696 void avdt_scb_hdl_tc_close(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    697   uint8_t hdl = avdt_scb_to_hdl(p_scb);
    698   tAVDT_CTRL_CBACK* p_avdt_ctrl_cback = p_scb->stream_config.p_avdt_ctrl_cback;
    699   tAVDT_CTRL avdt_ctrl;
    700   uint8_t event;
    701   AvdtpCcb* p_ccb = p_scb->p_ccb;
    702   RawAddress remote_addr = p_ccb->peer_addr;
    703   uint8_t scb_index = p_scb->stream_config.scb_index;
    704 
    705   /* set up hdr */
    706   avdt_ctrl.hdr.err_code = p_scb->close_code;
    707 
    708   /* clear sep variables */
    709   avdt_scb_clr_vars(p_scb, p_data);
    710   p_scb->media_seq = 0;
    711   p_scb->cong = false;
    712 
    713   /* free pkt we're holding, if any */
    714   osi_free_and_reset((void**)&p_scb->p_pkt);
    715 
    716   alarm_cancel(p_scb->transport_channel_timer);
    717 
    718   if ((p_scb->role == AVDT_CLOSE_INT) || (p_scb->role == AVDT_OPEN_INT)) {
    719     /* tell ccb we're done with signaling channel */
    720     avdt_ccb_event(p_ccb, AVDT_CCB_UL_CLOSE_EVT, NULL);
    721   }
    722   event =
    723       (p_scb->role == AVDT_CLOSE_INT) ? AVDT_CLOSE_CFM_EVT : AVDT_CLOSE_IND_EVT;
    724   p_scb->role = AVDT_CLOSE_ACP;
    725 
    726   if (p_scb->remove) {
    727     avdt_scb_dealloc(p_scb, NULL);
    728   }
    729 
    730   /* call app callback */
    731   (*p_avdt_ctrl_cback)(hdl, remote_addr, event, &avdt_ctrl, scb_index);
    732 }
    733 
    734 /*******************************************************************************
    735  *
    736  * Function         avdt_scb_snd_delay_rpt_req
    737  *
    738  * Description      This function calls the application callback with a delay
    739  *                  report.
    740  *
    741  * Returns          Nothing.
    742  *
    743  ******************************************************************************/
    744 void avdt_scb_snd_delay_rpt_req(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    745   avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_DELAY_RPT,
    746                     (tAVDT_MSG*)&p_data->apidelay);
    747 }
    748 
    749 /*******************************************************************************
    750  *
    751  * Function         avdt_scb_hdl_delay_rpt_cmd
    752  *
    753  * Description      This function calls the application callback with a delay
    754  *                  report.
    755  *
    756  * Returns          Nothing.
    757  *
    758  ******************************************************************************/
    759 void avdt_scb_hdl_delay_rpt_cmd(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    760   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    761       avdt_scb_to_hdl(p_scb),
    762       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    763       AVDT_DELAY_REPORT_EVT, (tAVDT_CTRL*)&p_data->msg.hdr,
    764       p_scb->stream_config.scb_index);
    765 
    766   if (p_scb->p_ccb)
    767     avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_DELAY_RPT, &p_data->msg);
    768   else
    769     avdt_scb_rej_not_in_use(p_scb, p_data);
    770 }
    771 
    772 /*******************************************************************************
    773  *
    774  * Function         avdt_scb_hdl_delay_rpt_rsp
    775  *
    776  * Description      This function calls the application callback with a delay
    777  *                  report.
    778  *
    779  * Returns          Nothing.
    780  *
    781  ******************************************************************************/
    782 void avdt_scb_hdl_delay_rpt_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    783   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    784       avdt_scb_to_hdl(p_scb),
    785       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    786       AVDT_DELAY_REPORT_CFM_EVT, (tAVDT_CTRL*)&p_data->msg.hdr,
    787       p_scb->stream_config.scb_index);
    788 }
    789 
    790 /*******************************************************************************
    791  *
    792  * Function         avdt_scb_hdl_tc_close_sto
    793  *
    794  * Description      This function is called when a channel is closed in OPEN
    795  *                  state.  Check the channel type and process accordingly.
    796  *
    797  * Returns          Nothing.
    798  *
    799  ******************************************************************************/
    800 void avdt_scb_hdl_tc_close_sto(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    801   tAVDT_CTRL avdt_ctrl;
    802   /* AVDT_CHAN_SIG does not visit this action */
    803   if (p_data && p_data->close.type != AVDT_CHAN_MEDIA) {
    804     /* it's reporting or recovery channel,
    805      * the channel close in open state means the peer does not support it */
    806     if (p_data->close.old_tc_state == AVDT_AD_ST_OPEN) {
    807       avdt_ctrl.hdr.err_code = 0;
    808       avdt_ctrl.hdr.err_param = 0;
    809       /* call app callback */
    810       (*p_scb->stream_config.p_avdt_ctrl_cback)(
    811           avdt_scb_to_hdl(p_scb),
    812           p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    813           AVDT_REPORT_DISCONN_EVT, &avdt_ctrl, p_scb->stream_config.scb_index);
    814     }
    815   } else {
    816     /* must be in OPEN state. need to go back to idle */
    817     avdt_scb_event(p_scb, AVDT_SCB_MSG_ABORT_RSP_EVT, NULL);
    818     avdt_scb_hdl_tc_close(p_scb, p_data);
    819   }
    820 }
    821 
    822 /*******************************************************************************
    823  *
    824  * Function         avdt_scb_hdl_tc_open
    825  *
    826  * Description      This function is called when the transport channel is
    827  *                  opened while in the opening state.  It calls the
    828  *                  application callback with an open indication or open
    829  *                  confirm depending on who initiated the open procedure.
    830  *
    831  * Returns          Nothing.
    832  *
    833  ******************************************************************************/
    834 void avdt_scb_hdl_tc_open(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    835   uint8_t event;
    836   uint8_t role;
    837 
    838   alarm_cancel(p_scb->transport_channel_timer);
    839 
    840   event =
    841       (p_scb->role == AVDT_OPEN_INT) ? AVDT_OPEN_CFM_EVT : AVDT_OPEN_IND_EVT;
    842   p_data->open.hdr.err_code = 0;
    843 
    844   AVDT_TRACE_DEBUG("%s: psc_mask: cfg: 0x%x, req:0x%x, cur: 0x%x", __func__,
    845                    p_scb->stream_config.cfg.psc_mask, p_scb->req_cfg.psc_mask,
    846                    p_scb->curr_cfg.psc_mask);
    847   if (p_scb->curr_cfg.psc_mask & AVDT_PSC_REPORT) {
    848     /* open the reporting channel, if both devices support it */
    849     role = (p_scb->role == AVDT_OPEN_INT) ? AVDT_INT : AVDT_ACP;
    850     avdt_ad_open_req(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb, role);
    851   }
    852 
    853   /* call app callback */
    854   (*p_scb->stream_config.p_avdt_ctrl_cback)(
    855       avdt_scb_to_hdl(p_scb),
    856       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty, event,
    857       (tAVDT_CTRL*)&p_data->open, p_scb->stream_config.scb_index);
    858 }
    859 
    860 /*******************************************************************************
    861  *
    862  * Function         avdt_scb_hdl_tc_open_sto
    863  *
    864  * Description      This function is called when the transport channel is
    865  *                  opened while in the opening state.  It calls the
    866  *                  application callback with an open indication or open
    867  *                  confirm depending on who initiated the open procedure.
    868  *
    869  * Returns          Nothing.
    870  *
    871  ******************************************************************************/
    872 void avdt_scb_hdl_tc_open_sto(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    873   tAVDT_CTRL avdt_ctrl;
    874   /* open reporting channel here, when it is implemented */
    875 
    876   /* call app callback */
    877   if (p_data->open.hdr.err_code == AVDT_CHAN_REPORT) {
    878     avdt_ctrl.hdr.err_code = 0;
    879     avdt_ctrl.hdr.err_param = 1;
    880     (*p_scb->stream_config.p_avdt_ctrl_cback)(
    881         avdt_scb_to_hdl(p_scb),
    882         p_scb->p_ccb ? p_scb->p_ccb->peer_addr : RawAddress::kEmpty,
    883         AVDT_REPORT_CONN_EVT, &avdt_ctrl, p_scb->stream_config.scb_index);
    884   }
    885 }
    886 
    887 /*******************************************************************************
    888  *
    889  * Function         avdt_scb_hdl_write_req
    890  *
    891  * Description      This function frees the media packet currently stored in
    892  *                  the SCB, if any.  Then it builds a new media packet from
    893  *                  with the passed in buffer and stores it in the SCB.
    894  *
    895  * Returns          Nothing.
    896  *
    897  ******************************************************************************/
    898 void avdt_scb_hdl_write_req(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
    899   uint8_t* p;
    900   uint32_t ssrc;
    901   bool add_rtp_header = !(p_data->apiwrite.opt & AVDT_DATA_OPT_NO_RTP);
    902 
    903   /* free packet we're holding, if any; to be replaced with new */
    904   if (p_scb->p_pkt != NULL) {
    905     /* this shouldn't be happening */
    906     AVDT_TRACE_WARNING("Dropped media packet; congested");
    907   }
    908   osi_free_and_reset((void**)&p_scb->p_pkt);
    909 
    910   /* Recompute only if the RTP header wasn't disabled by the API */
    911   if (add_rtp_header) {
    912     bool is_content_protection = (p_scb->curr_cfg.num_protect > 0);
    913     add_rtp_header =
    914         A2DP_UsesRtpHeader(is_content_protection, p_scb->curr_cfg.codec_info);
    915   }
    916 
    917   /* Build a media packet, and add an RTP header if required. */
    918   if (add_rtp_header) {
    919     ssrc = avdt_scb_gen_ssrc(p_scb);
    920 
    921     p_data->apiwrite.p_buf->len += AVDT_MEDIA_HDR_SIZE;
    922     p_data->apiwrite.p_buf->offset -= AVDT_MEDIA_HDR_SIZE;
    923     p_scb->media_seq++;
    924     p = (uint8_t*)(p_data->apiwrite.p_buf + 1) + p_data->apiwrite.p_buf->offset;
    925 
    926     UINT8_TO_BE_STREAM(p, AVDT_MEDIA_OCTET1);
    927     UINT8_TO_BE_STREAM(p, p_data->apiwrite.m_pt);
    928     UINT16_TO_BE_STREAM(p, p_scb->media_seq);
    929     UINT32_TO_BE_STREAM(p, p_data->apiwrite.time_stamp);
    930     UINT32_TO_BE_STREAM(p, ssrc);
    931   }
    932 
    933   /* store it */
    934   p_scb->p_pkt = p_data->apiwrite.p_buf;
    935 }
    936 
    937 /*******************************************************************************
    938  *
    939  * Function         avdt_scb_snd_abort_req
    940  *
    941  * Description      This function sends an abort command message.
    942  *
    943  * Returns          Nothing.
    944  *
    945  ******************************************************************************/
    946 void avdt_scb_snd_abort_req(AvdtpScb* p_scb,
    947                             UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
    948   tAVDT_EVT_HDR hdr;
    949 
    950   AVDT_TRACE_DEBUG("%s: p_scb->p_ccb=%p", __func__, p_scb->p_ccb);
    951 
    952   if (p_scb->p_ccb != NULL) {
    953     p_scb->role = AVDT_CLOSE_INT;
    954 
    955     hdr.seid = p_scb->peer_seid;
    956 
    957     tAVDT_MSG avdt_msg;
    958     avdt_msg.hdr = hdr;
    959     avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_ABORT, &avdt_msg);
    960   }
    961 }
    962 
    963 /*******************************************************************************
    964  *
    965  * Function         avdt_scb_snd_abort_rsp
    966  *
    967  * Description      This function sends an abort response message.
    968  *
    969  * Returns          Nothing.
    970  *
    971  ******************************************************************************/
    972 void avdt_scb_snd_abort_rsp(UNUSED_ATTR AvdtpScb* p_scb,
    973                             tAVDT_SCB_EVT* p_data) {
    974   avdt_msg_send_rsp(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx), AVDT_SIG_ABORT,
    975                     &p_data->msg);
    976 }
    977 
    978 /*******************************************************************************
    979  *
    980  * Function         avdt_scb_snd_close_req
    981  *
    982  * Description      This function sends a close command message.
    983  *
    984  * Returns          Nothing.
    985  *
    986  ******************************************************************************/
    987 void avdt_scb_snd_close_req(AvdtpScb* p_scb,
    988                             UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
    989   tAVDT_EVT_HDR hdr;
    990 
    991   p_scb->role = AVDT_CLOSE_INT;
    992 
    993   hdr.seid = p_scb->peer_seid;
    994 
    995   tAVDT_MSG avdt_msg;
    996   avdt_msg.hdr = hdr;
    997   avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_CLOSE, &avdt_msg);
    998 }
    999 
   1000 /*******************************************************************************
   1001  *
   1002  * Function         avdt_scb_snd_stream_close
   1003  *
   1004  * Description      This function sends a close command message.
   1005  *
   1006  * Returns          Nothing.
   1007  *
   1008  ******************************************************************************/
   1009 void avdt_scb_snd_stream_close(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1010   osi_free_and_reset((void**)&p_scb->p_pkt);
   1011   avdt_scb_snd_close_req(p_scb, p_data);
   1012 }
   1013 
   1014 /*******************************************************************************
   1015  *
   1016  * Function         avdt_scb_snd_close_rsp
   1017  *
   1018  * Description      This function sends a close response message.
   1019  *
   1020  * Returns          Nothing.
   1021  *
   1022  ******************************************************************************/
   1023 void avdt_scb_snd_close_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1024   avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_CLOSE, &p_data->msg);
   1025 }
   1026 
   1027 /*******************************************************************************
   1028  *
   1029  * Function         avdt_scb_snd_getconfig_req
   1030  *
   1031  * Description      This function sends a get configuration command message.
   1032  *
   1033  * Returns          Nothing.
   1034  *
   1035  ******************************************************************************/
   1036 void avdt_scb_snd_getconfig_req(AvdtpScb* p_scb,
   1037                                 UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1038   tAVDT_EVT_HDR hdr;
   1039 
   1040   hdr.seid = p_scb->peer_seid;
   1041 
   1042   tAVDT_MSG avdt_msg;
   1043   avdt_msg.hdr = hdr;
   1044   avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_GETCONFIG, &avdt_msg);
   1045 }
   1046 
   1047 /*******************************************************************************
   1048  *
   1049  * Function         avdt_scb_snd_getconfig_rsp
   1050  *
   1051  * Description      This function sends a get configuration response message.
   1052  *
   1053  * Returns          Nothing.
   1054  *
   1055  ******************************************************************************/
   1056 void avdt_scb_snd_getconfig_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1057   avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_GETCONFIG, &p_data->msg);
   1058 }
   1059 
   1060 /*******************************************************************************
   1061  *
   1062  * Function         avdt_scb_snd_open_req
   1063  *
   1064  * Description      This function sends an open command message.
   1065  *
   1066  * Returns          Nothing.
   1067  *
   1068  ******************************************************************************/
   1069 void avdt_scb_snd_open_req(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1070   tAVDT_EVT_HDR hdr;
   1071 
   1072   hdr.seid = p_scb->peer_seid;
   1073 
   1074   tAVDT_MSG avdt_msg;
   1075   avdt_msg.hdr = hdr;
   1076   avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_OPEN, &avdt_msg);
   1077 }
   1078 
   1079 /*******************************************************************************
   1080  *
   1081  * Function         avdt_scb_snd_open_rsp
   1082  *
   1083  * Description      This function sends an open response message.  It also
   1084  *                  calls avdt_ad_open_req() to accept a transport channel
   1085  *                  connection.
   1086  *
   1087  * Returns          Nothing.
   1088  *
   1089  ******************************************************************************/
   1090 void avdt_scb_snd_open_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1091   /* notify adaption that we're waiting for transport channel open */
   1092   p_scb->role = AVDT_OPEN_ACP;
   1093   avdt_ad_open_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, AVDT_ACP);
   1094 
   1095   /* send response */
   1096   avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_OPEN, &p_data->msg);
   1097 
   1098   alarm_set_on_mloop(p_scb->transport_channel_timer,
   1099                      AVDT_SCB_TC_CONN_TIMEOUT_MS,
   1100                      avdt_scb_transport_channel_timer_timeout, p_scb);
   1101 }
   1102 
   1103 /*******************************************************************************
   1104  *
   1105  * Function         avdt_scb_snd_reconfig_req
   1106  *
   1107  * Description      This function stores the configuration parameters in the
   1108  *                  SCB and sends a reconfiguration command message.
   1109  *
   1110  * Returns          Nothing.
   1111  *
   1112  ******************************************************************************/
   1113 void avdt_scb_snd_reconfig_req(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1114   AVDT_TRACE_DEBUG("%s: p_scb->peer_seid=%d p_data->msg.hdr.seid=%d", __func__,
   1115                    p_scb->peer_seid, p_data->msg.hdr.seid);
   1116   AVDT_TRACE_DEBUG(
   1117       "%s: codec: %s", __func__,
   1118       A2DP_CodecInfoString(p_data->msg.config_cmd.p_cfg->codec_info).c_str());
   1119 
   1120   p_scb->req_cfg = *p_data->msg.config_cmd.p_cfg;
   1121   p_data->msg.hdr.seid = p_scb->peer_seid;
   1122   avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_RECONFIG, &p_data->msg);
   1123 }
   1124 
   1125 /*******************************************************************************
   1126  *
   1127  * Function         avdt_scb_snd_reconfig_rsp
   1128  *
   1129  * Description      This function stores the configuration parameters in the
   1130  *                  SCB and sends a reconfiguration response message.
   1131  *
   1132  * Returns          Nothing.
   1133  *
   1134  ******************************************************************************/
   1135 void avdt_scb_snd_reconfig_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1136   if (p_data->msg.hdr.err_code == 0) {
   1137     /* store new configuration */
   1138     if (p_scb->req_cfg.num_codec > 0) {
   1139       p_scb->curr_cfg.num_codec = p_scb->req_cfg.num_codec;
   1140       memcpy(p_scb->curr_cfg.codec_info, p_scb->req_cfg.codec_info,
   1141              AVDT_CODEC_SIZE);
   1142     }
   1143     if (p_scb->req_cfg.num_protect > 0) {
   1144       p_scb->curr_cfg.num_protect = p_scb->req_cfg.num_protect;
   1145       memcpy(p_scb->curr_cfg.protect_info, p_scb->req_cfg.protect_info,
   1146              AVDT_PROTECT_SIZE);
   1147     }
   1148 
   1149     /* send response */
   1150     avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_RECONFIG, &p_data->msg);
   1151   } else {
   1152     /* send reject */
   1153     avdt_msg_send_rej(p_scb->p_ccb, AVDT_SIG_RECONFIG, &p_data->msg);
   1154   }
   1155 }
   1156 
   1157 /*******************************************************************************
   1158  *
   1159  * Function         avdt_scb_snd_security_req
   1160  *
   1161  * Description      This function sends a security command message.
   1162  *
   1163  * Returns          Nothing.
   1164  *
   1165  ******************************************************************************/
   1166 void avdt_scb_snd_security_req(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1167   p_data->msg.hdr.seid = p_scb->peer_seid;
   1168   avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_SECURITY, &p_data->msg);
   1169 }
   1170 
   1171 /*******************************************************************************
   1172  *
   1173  * Function         avdt_scb_snd_security_rsp
   1174  *
   1175  * Description      This function sends a security response message.
   1176  *
   1177  * Returns          Nothing.
   1178  *
   1179  ******************************************************************************/
   1180 void avdt_scb_snd_security_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1181   if (p_data->msg.hdr.err_code == 0) {
   1182     avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_SECURITY, &p_data->msg);
   1183   } else {
   1184     avdt_msg_send_rej(p_scb->p_ccb, AVDT_SIG_SECURITY, &p_data->msg);
   1185   }
   1186 }
   1187 
   1188 /*******************************************************************************
   1189  *
   1190  * Function         avdt_scb_snd_setconfig_rej
   1191  *
   1192  * Description      This function marks the SCB as not in use and sends a
   1193  *                  set configuration reject message.
   1194  *
   1195  * Returns          Nothing.
   1196  *
   1197  ******************************************************************************/
   1198 void avdt_scb_snd_setconfig_rej(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1199   if (p_scb->p_ccb != NULL) {
   1200     avdt_msg_send_rej(p_scb->p_ccb, AVDT_SIG_SETCONFIG, &p_data->msg);
   1201 
   1202     /* clear scb variables */
   1203     avdt_scb_clr_vars(p_scb, p_data);
   1204   }
   1205 }
   1206 
   1207 /*******************************************************************************
   1208  *
   1209  * Function         avdt_scb_snd_setconfig_req
   1210  *
   1211  * Description      This function marks the SCB as in use and copies the
   1212  *                  configuration parameters to the SCB.  Then the function
   1213  *                  sends a set configuration command message and initiates
   1214  *                  opening of the signaling channel.
   1215  *
   1216  * Returns          Nothing.
   1217  *
   1218  ******************************************************************************/
   1219 void avdt_scb_snd_setconfig_req(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1220   AvdtpSepConfig *p_req, *p_cfg;
   1221 
   1222   AVDT_TRACE_DEBUG(
   1223       "%s: codec: %s", __func__,
   1224       A2DP_CodecInfoString(p_data->msg.config_cmd.p_cfg->codec_info).c_str());
   1225 
   1226   /* copy API parameters to scb, set scb as in use */
   1227 
   1228   AvdtpCcb* p_ccb = avdt_ccb_by_idx(p_data->msg.config_cmd.hdr.ccb_idx);
   1229   if (p_scb->p_ccb != p_ccb) {
   1230     AVDT_TRACE_ERROR(
   1231         "%s: mismatch in AVDTP SCB/CCB state: (p_scb->p_ccb=%p != p_ccb=%p): "
   1232         "p_scb=%p scb_handle=%d ccb_idx=%d",
   1233         __func__, p_scb->p_ccb, p_ccb, p_scb, p_scb->ScbHandle(),
   1234         p_data->msg.config_cmd.hdr.ccb_idx);
   1235     avdt_scb_rej_not_in_use(p_scb, p_data);
   1236     return;
   1237   }
   1238   p_scb->in_use = true;
   1239   p_scb->peer_seid = p_data->msg.config_cmd.hdr.seid;
   1240   p_req = p_data->msg.config_cmd.p_cfg;
   1241   p_cfg = &p_scb->stream_config.cfg;
   1242   p_scb->req_cfg = *p_data->msg.config_cmd.p_cfg;
   1243 
   1244   avdt_msg_send_cmd(p_scb->p_ccb, p_scb, AVDT_SIG_SETCONFIG, &p_data->msg);
   1245 
   1246   /* tell ccb to open channel */
   1247   avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_UL_OPEN_EVT, NULL);
   1248 }
   1249 
   1250 /*******************************************************************************
   1251  *
   1252  * Function         avdt_scb_snd_setconfig_rsp
   1253  *
   1254  * Description      This function copies the requested configuration into the
   1255  *                  current configuration and sends a set configuration
   1256  *                  response message.
   1257  *
   1258  * Returns          Nothing.
   1259  *
   1260  ******************************************************************************/
   1261 void avdt_scb_snd_setconfig_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1262   if (p_scb->p_ccb != NULL) {
   1263     p_scb->curr_cfg = p_scb->req_cfg;
   1264 
   1265     avdt_msg_send_rsp(p_scb->p_ccb, AVDT_SIG_SETCONFIG, &p_data->msg);
   1266   }
   1267 }
   1268 
   1269 /*******************************************************************************
   1270  *
   1271  * Function         avdt_scb_snd_tc_close
   1272  *
   1273  * Description      This function calls avdt_ad_close_req() to close the
   1274  *                  transport channel for this SCB.
   1275  *
   1276  * Returns          Nothing.
   1277  *
   1278  ******************************************************************************/
   1279 void avdt_scb_snd_tc_close(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1280   if (p_scb->curr_cfg.psc_mask & AVDT_PSC_REPORT)
   1281     avdt_ad_close_req(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb);
   1282   avdt_ad_close_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb);
   1283 }
   1284 
   1285 /*******************************************************************************
   1286  *
   1287  * Function         avdt_scb_cb_err
   1288  *
   1289  * Description      This function calls the application callback function
   1290  *                  indicating an error.
   1291  *
   1292  * Returns          Nothing.
   1293  *
   1294  ******************************************************************************/
   1295 void avdt_scb_cb_err(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1296   tAVDT_CTRL avdt_ctrl;
   1297 
   1298   /* set error code and parameter */
   1299   avdt_ctrl.hdr.err_code = AVDT_ERR_BAD_STATE;
   1300   avdt_ctrl.hdr.err_param = 0;
   1301 
   1302   /* call callback, using lookup table to get callback event */
   1303   (*p_scb->stream_config.p_avdt_ctrl_cback)(
   1304       avdt_scb_to_hdl(p_scb), RawAddress::kEmpty,
   1305       avdt_scb_cback_evt[p_scb->curr_evt], &avdt_ctrl,
   1306       p_scb->stream_config.scb_index);
   1307 }
   1308 
   1309 /*******************************************************************************
   1310  *
   1311  * Function         avdt_scb_cong_state
   1312  *
   1313  * Description      This function sets the congestion state of the SCB media
   1314  *                  transport channel.
   1315  *
   1316  * Returns          Nothing.
   1317  *
   1318  ******************************************************************************/
   1319 void avdt_scb_cong_state(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1320   p_scb->cong = p_data->llcong;
   1321 }
   1322 
   1323 /*******************************************************************************
   1324  *
   1325  * Function         avdt_scb_rej_state
   1326  *
   1327  * Description      This function sends a reject message to the peer indicating
   1328  *                  incorrect state for the received command message.
   1329  *
   1330  * Returns          Nothing.
   1331  *
   1332  ******************************************************************************/
   1333 void avdt_scb_rej_state(UNUSED_ATTR AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1334   p_data->msg.hdr.err_code = AVDT_ERR_BAD_STATE;
   1335   p_data->msg.hdr.err_param = 0;
   1336   avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx),
   1337                     p_data->msg.hdr.sig_id, &p_data->msg);
   1338 }
   1339 
   1340 /*******************************************************************************
   1341  *
   1342  * Function         avdt_scb_rej_in_use
   1343  *
   1344  * Description      This function sends a reject message to the peer indicating
   1345  *                  the stream is in use.
   1346  *
   1347  * Returns          Nothing.
   1348  *
   1349  ******************************************************************************/
   1350 void avdt_scb_rej_in_use(UNUSED_ATTR AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1351   p_data->msg.hdr.err_code = AVDT_ERR_IN_USE;
   1352   p_data->msg.hdr.err_param = 0;
   1353   avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx),
   1354                     p_data->msg.hdr.sig_id, &p_data->msg);
   1355 }
   1356 
   1357 /*******************************************************************************
   1358  *
   1359  * Function         avdt_scb_rej_not_in_use
   1360  *
   1361  * Description      This function sends a reject message to the peer indicating
   1362  *                  the stream is in use.
   1363  *
   1364  * Returns          Nothing.
   1365  *
   1366  ******************************************************************************/
   1367 void avdt_scb_rej_not_in_use(UNUSED_ATTR AvdtpScb* p_scb,
   1368                              tAVDT_SCB_EVT* p_data) {
   1369   p_data->msg.hdr.err_code = AVDT_ERR_NOT_IN_USE;
   1370   p_data->msg.hdr.err_param = 0;
   1371   avdt_msg_send_rej(avdt_ccb_by_idx(p_data->msg.hdr.ccb_idx),
   1372                     p_data->msg.hdr.sig_id, &p_data->msg);
   1373 }
   1374 
   1375 /*******************************************************************************
   1376  *
   1377  * Function         avdt_scb_set_remove
   1378  *
   1379  * Description      This function marks an SCB to be removed.
   1380  *
   1381  * Returns          Nothing.
   1382  *
   1383  ******************************************************************************/
   1384 void avdt_scb_set_remove(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1385   p_scb->remove = true;
   1386 }
   1387 
   1388 /*******************************************************************************
   1389  *
   1390  * Function         avdt_scb_free_pkt
   1391  *
   1392  * Description      This function frees the media packet passed in.
   1393  *
   1394  * Returns          Nothing.
   1395  *
   1396  ******************************************************************************/
   1397 void avdt_scb_free_pkt(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
   1398   tAVDT_CTRL avdt_ctrl;
   1399 
   1400   /* set error code and parameter */
   1401   avdt_ctrl.hdr.err_code = AVDT_ERR_BAD_STATE;
   1402   avdt_ctrl.hdr.err_param = 0;
   1403 
   1404   osi_free_and_reset((void**)&p_data->apiwrite.p_buf);
   1405 
   1406   AVDT_TRACE_WARNING("Dropped media packet");
   1407 
   1408   /* we need to call callback to keep data flow going */
   1409   (*p_scb->stream_config.p_avdt_ctrl_cback)(
   1410       avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_WRITE_CFM_EVT,
   1411       &avdt_ctrl, p_scb->stream_config.scb_index);
   1412 }
   1413 
   1414 /*******************************************************************************
   1415  *
   1416  * Function         avdt_scb_clr_pkt
   1417  *
   1418  * Description      This function frees the media packet stored in the SCB.
   1419  *
   1420  * Returns          Nothing.
   1421  *
   1422  ******************************************************************************/
   1423 void avdt_scb_clr_pkt(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1424   tAVDT_CTRL avdt_ctrl;
   1425   AvdtpCcb* p_ccb;
   1426   uint8_t tcid;
   1427   uint16_t lcid;
   1428 
   1429   /* set error code and parameter */
   1430   avdt_ctrl.hdr.err_code = AVDT_ERR_BAD_STATE;
   1431   avdt_ctrl.hdr.err_param = 0;
   1432   /* flush the media data queued at L2CAP */
   1433   p_ccb = p_scb->p_ccb;
   1434   if (p_ccb != NULL) {
   1435     /* get tcid from type, scb */
   1436     tcid = avdt_ad_type_to_tcid(AVDT_CHAN_MEDIA, p_scb);
   1437 
   1438     lcid = avdtp_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid;
   1439     L2CA_FlushChannel(lcid, L2CAP_FLUSH_CHANS_ALL);
   1440   }
   1441 
   1442   if (p_scb->p_pkt != NULL) {
   1443     osi_free_and_reset((void**)&p_scb->p_pkt);
   1444 
   1445     AVDT_TRACE_DEBUG("Dropped stored media packet");
   1446 
   1447     /* we need to call callback to keep data flow going */
   1448     (*p_scb->stream_config.p_avdt_ctrl_cback)(
   1449         avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_WRITE_CFM_EVT,
   1450         &avdt_ctrl, p_scb->stream_config.scb_index);
   1451   }
   1452 }
   1453 
   1454 /*******************************************************************************
   1455  *
   1456  * Function         avdt_scb_chk_snd_pkt
   1457  *
   1458  * Description      This function checks if the SCB is congested, and if not
   1459  *                  congested it sends a stored media packet, if any.  After it
   1460  *                  sends the packet it calls the application callback function
   1461  *                  with a write confirm.
   1462  *
   1463  * Returns          Nothing.
   1464  *
   1465  ******************************************************************************/
   1466 void avdt_scb_chk_snd_pkt(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1467   tAVDT_CTRL avdt_ctrl;
   1468   BT_HDR* p_pkt;
   1469 
   1470   avdt_ctrl.hdr.err_code = 0;
   1471 
   1472   if (!p_scb->cong) {
   1473     if (p_scb->p_pkt != NULL) {
   1474       p_pkt = p_scb->p_pkt;
   1475       p_scb->p_pkt = NULL;
   1476       avdt_ad_write_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, p_pkt);
   1477 
   1478       (*p_scb->stream_config.p_avdt_ctrl_cback)(
   1479           avdt_scb_to_hdl(p_scb), RawAddress::kEmpty, AVDT_WRITE_CFM_EVT,
   1480           &avdt_ctrl, p_scb->stream_config.scb_index);
   1481     }
   1482   }
   1483 }
   1484 
   1485 /*******************************************************************************
   1486  *
   1487  * Function         avdt_scb_transport_channel_timer
   1488  *
   1489  * Description      This function is called to start a timer when the peer
   1490  *                  initiates closing of the stream.  The timer verifies that
   1491  *                  the peer disconnects the transport channel.
   1492  *
   1493  * Returns          Nothing.
   1494  *
   1495  ******************************************************************************/
   1496 void avdt_scb_transport_channel_timer(AvdtpScb* p_scb,
   1497                                       UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1498   alarm_set_on_mloop(p_scb->transport_channel_timer,
   1499                      AVDT_SCB_TC_DISC_TIMEOUT_MS,
   1500                      avdt_scb_transport_channel_timer_timeout, p_scb);
   1501 }
   1502 
   1503 /*******************************************************************************
   1504  *
   1505  * Function         avdt_scb_clr_vars
   1506  *
   1507  * Description      This function initializes certain SCB variables.
   1508  *
   1509  * Returns          Nothing.
   1510  *
   1511  ******************************************************************************/
   1512 void avdt_scb_clr_vars(AvdtpScb* p_scb, UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
   1513   p_scb->in_use = false;
   1514   p_scb->peer_seid = 0;
   1515 }
   1516