Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17bcf30b authored by Zyan Wu's avatar Zyan Wu Committed by Cheney Ni
Browse files

Feature: send delay report once configed

As accept device, sending delay report after setconfig rsp
is sent. Do it as a second action instead of in the
bta AV subsystem.

As init device,  send delay report after setconfig rsp
is received and just before sending open req.

Add UT to test the state machine;
- As accept, it shall send delay report after it sends setconfig rsp
- As init, it shall send delay report after it receives setconfig rsp
  and before it sends open req

Also, correct delay report confirm event shall be called back

To run the test, run atest [--host] net_test_stack_avdtp

Bug: 185507179
Bug: 188367563
Tag: #feature
Test: atest --host bluetooth_test_gd
Change-Id: I9c7e9203516a5f6780d0d1effd3e472cd29b996c
Merged-In: Id0cb5bfc62b3a9296564b0e9651b30027d677f85
(cherry picked from commit 4a18e2709c29a1f4d78570a7294d80fce7ec57a9)
parent 9f6a15ae
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -826,6 +826,11 @@
#define AVDT_PROTECT_SIZE 90
#endif

/* Default sink delay value in ms. */
#ifndef AVDT_SINK_DELAY_MS
#define AVDT_SINK_DELAY_MS 300
#endif

/******************************************************************************
 *
 * PAN
+50 −0
Original line number Diff line number Diff line
@@ -507,6 +507,56 @@ cc_test {
    },
}

cc_test {
    name: "net_test_stack_avdtp",
    defaults: ["fluoride_defaults"],
    test_suites: ["device-tests"],
    host_supported: true,
    test_options: {
        unit_test: true,
    },
    include_dirs: [
        "external/libldac/inc",
        "packages/modules/Bluetooth/system",
        "packages/modules/Bluetooth/system/stack/include",
        "packages/modules/Bluetooth/system/utils/include",
    ],
    srcs: [
        "test/stack_avdtp_test.cc",
        "avdt/avdt_ad.cc",
        "avdt/avdt_api.cc",
        "avdt/avdt_ccb.cc",
        "avdt/avdt_ccb_act.cc",
        "avdt/avdt_l2c.cc",
        "avdt/avdt_scb.cc",
        "avdt/avdt_scb_act.cc",
        "test/common/mock_btu_layer.cc",
        "test/common/mock_stack_avdt_msg.cc",
        ":TestMockStackL2cap",
        ":TestMockStackAcl",
        ":TestMockStackA2dp",
        ":TestMockBta",
        ":TestMockDevice",
    ],
    shared_libs: [
        "libcrypto",
        "libcutils",
        "libprotobuf-cpp-lite",
    ],
    static_libs: [
        "libbt-common",
        "libbt-protos-lite",
        "liblog",
        "libosi",
        "libosi-AllocationTestHarness",
    ],
    sanitize: {
        address: true,
        cfi: true,
        misc_undefined: ["bounds"],
    },
}

cc_test {
    name: "net_test_stack_a2dp_native",
    defaults: ["fluoride_defaults"],
+2 −0
Original line number Diff line number Diff line
@@ -234,6 +234,7 @@ enum {
  AVDT_SCB_SND_SETCONFIG_REQ,
  AVDT_SCB_SND_SETCONFIG_REJ,
  AVDT_SCB_SND_SETCONFIG_RSP,
  AVDT_SCB_SND_SNK_DELAY_RPT_REQ,
  AVDT_SCB_SND_TC_CLOSE,
  AVDT_SCB_CB_ERR,
  AVDT_SCB_CONG_STATE,
@@ -911,6 +912,7 @@ extern void avdt_scb_snd_security_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
extern void avdt_scb_snd_setconfig_req(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
extern void avdt_scb_snd_setconfig_rej(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
extern void avdt_scb_snd_setconfig_rsp(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
extern void avdt_scb_snd_snk_delay_rpt_req(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
extern void avdt_scb_snd_tc_close(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
extern void avdt_scb_cb_err(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
extern void avdt_scb_cong_state(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data);
+2 −1
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ const tAVDT_SCB_ACTION avdt_scb_action[] = {avdt_scb_hdl_abort_cmd,
                                            avdt_scb_snd_setconfig_req,
                                            avdt_scb_snd_setconfig_rej,
                                            avdt_scb_snd_setconfig_rsp,
                                            avdt_scb_snd_snk_delay_rpt_req,
                                            avdt_scb_snd_tc_close,
                                            avdt_scb_cb_err,
                                            avdt_scb_cong_state,
@@ -158,7 +159,7 @@ const uint8_t avdt_scb_st_idle[][AVDT_SCB_NUM_COLS] = {
    /* API_GETCONFIG_RSP_EVT */
    {AVDT_SCB_IGNORE, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
    /* API_SETCONFIG_RSP_EVT */
    {AVDT_SCB_SND_SETCONFIG_RSP, AVDT_SCB_IGNORE, AVDT_SCB_CONF_ST},
    {AVDT_SCB_SND_SETCONFIG_RSP, AVDT_SCB_SND_SNK_DELAY_RPT_REQ, AVDT_SCB_CONF_ST},
    /* API_SETCONFIG_REJ_EVT */
    {AVDT_SCB_SND_SETCONFIG_REJ, AVDT_SCB_IGNORE, AVDT_SCB_IDLE_ST},
    /* API_OPEN_RSP_EVT */
+35 −0
Original line number Diff line number Diff line
@@ -642,6 +642,33 @@ void avdt_scb_hdl_setconfig_rej(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
      (tAVDT_CTRL*)&p_data->msg.hdr, p_scb->stream_config.scb_index);
}

/*******************************************************************************
 *
 * Function         avdt_scb_snd_snk_delay_rpt_req
 *
 * Description      This function sends the delay report request once it is sink
 *
 * Returns          Nothing.
 *
 ******************************************************************************/
void avdt_scb_snd_snk_delay_rpt_req(AvdtpScb* p_scb,
                                UNUSED_ATTR tAVDT_SCB_EVT* p_data) {
  if (p_scb->p_ccb == NULL) {
    return;
  }

  // In sink mode, report a fixed delay value when this device is the sink
  // side. Delay value in this function is in unit of 1/10ms.
  if (p_scb->stream_config.tsep != AVDT_TSEP_SNK) {
    return;
  }

  tAVDT_SCB_EVT evt;
  evt.apidelay.hdr.seid = p_scb->peer_seid;
  evt.apidelay.delay = AVDT_SINK_DELAY_MS * 10;
  avdt_scb_event(p_scb, AVDT_SCB_API_DELAY_RPT_REQ_EVT, &evt);
}

/*******************************************************************************
 *
 * Function         avdt_scb_hdl_setconfig_rsp
@@ -649,6 +676,10 @@ void avdt_scb_hdl_setconfig_rej(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) {
 * Description      This function sends the SCB an AVDT_SCB_API_OPEN_REQ_EVT
 *                  to initiate sending of an open command message.
 *
 *                  This function sends the SCB an AVDT_SCB_API_DELAY_RPT_REQ_EVT
 *                  to initiate sending of delay report command message only
 *                  when the endpoint takes sink role.
 *
 * Returns          Nothing.
 *
 ******************************************************************************/
@@ -660,6 +691,10 @@ void avdt_scb_hdl_setconfig_rsp(AvdtpScb* p_scb,
    /* save configuration */
    p_scb->curr_cfg = p_scb->req_cfg;

    // In sink mode, report delay value when this device initiates the connection.
    // Delay reporting is sent before open request (i.e., in configured state).
    avdt_scb_snd_snk_delay_rpt_req(p_scb, p_data);

    /* initiate open */
    single.seid = p_scb->peer_seid;
    tAVDT_SCB_EVT avdt_scb_evt;
Loading