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

Commit e538c759 authored by Łukasz Rymanowski's avatar Łukasz Rymanowski Committed by Gerrit Code Review
Browse files

Merge changes Id82a7d59,Ia7e7c3bd

* changes:
  leaudio: Use Long Write to CP if value is bigger than MTU
  leaudio: Require MTU highier or equal 64 as per BAP spec
parents 5ac56f18 aa1e6490
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -2041,6 +2041,21 @@ class LeAudioClientImpl : public LeAudioClient {
      return;
      return;
    }
    }


    /**
     * BAP 1.01. 3.6.1
     * ATT and EATT transport requirements
     * The Unicast Client shall support a minimum ATT_MTU of 64 octets for one
     * Unenhanced ATT bearer, or for at least one Enhanced ATT bearer if the
     * Unicast Client supports Enhanced ATT bearers.
     *
     */
    if (mtu < 64) {
      LOG_ERROR("Device %s MTU is too low (%d). Disconnecting from LE Audio",
                ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_), mtu);
      Disconnect(leAudioDevice->address_);
      return;
    }

    leAudioDevice->mtu_ = mtu;
    leAudioDevice->mtu_ = mtu;
  }
  }


+28 −25
Original line number Original line Diff line number Diff line
@@ -761,6 +761,26 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    }
    }
  }
  }


  static void WriteToControlPoint(LeAudioDevice* leAudioDevice,
                                  std::vector<uint8_t> value) {
    tGATT_WRITE_TYPE write_type = GATT_WRITE_NO_RSP;

    if (value.size() > (leAudioDevice->mtu_ - 3)) {
      LOG_WARN("%s, using long write procedure (%d > %d)",
               ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_),
               static_cast<int>(value.size()), (leAudioDevice->mtu_ - 3));

      /* Note, that this type is actually LONG WRITE.
       * Meaning all the Prepare Writes plus Execute is handled in the stack
       */
      write_type = GATT_WRITE_PREPARE;
    }

    BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
                                      leAudioDevice->ctp_hdls_.val_hdl, value,
                                      write_type, NULL, NULL);
  }

  static void RemoveDataPathByCisHandle(LeAudioDevice* leAudioDevice,
  static void RemoveDataPathByCisHandle(LeAudioDevice* leAudioDevice,
                                        uint16_t cis_conn_hdl) {
                                        uint16_t cis_conn_hdl) {
    auto ases_pair = leAudioDevice->GetAsesByCisConnHdl(cis_conn_hdl);
    auto ases_pair = leAudioDevice->GetAsesByCisConnHdl(cis_conn_hdl);
@@ -931,9 +951,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {


      le_audio::client_parser::ascs::PrepareAseCtpAudioReceiverStopReady(ids,
      le_audio::client_parser::ascs::PrepareAseCtpAudioReceiverStopReady(ids,
                                                                         value);
                                                                         value);
      BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
      WriteToControlPoint(leAudioDevice, value);
                                        leAudioDevice->ctp_hdls_.val_hdl, value,
                                        GATT_WRITE_NO_RSP, NULL, NULL);
    }
    }


    /* Tear down CIS's data paths within the group */
    /* Tear down CIS's data paths within the group */
@@ -1595,9 +1613,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {


    std::vector<uint8_t> value;
    std::vector<uint8_t> value;
    le_audio::client_parser::ascs::PrepareAseCtpCodecConfig(confs, value);
    le_audio::client_parser::ascs::PrepareAseCtpCodecConfig(confs, value);
    BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
    WriteToControlPoint(leAudioDevice, value);
                                      leAudioDevice->ctp_hdls_.val_hdl, value,
                                      GATT_WRITE_NO_RSP, NULL, NULL);
  }
  }


  void AseStateMachineProcessCodecConfigured(
  void AseStateMachineProcessCodecConfigured(
@@ -2051,9 +2067,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
             ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_));
             ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_));
    le_audio::client_parser::ascs::PrepareAseCtpEnable(confs, value);
    le_audio::client_parser::ascs::PrepareAseCtpEnable(confs, value);


    BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
    WriteToControlPoint(leAudioDevice, value);
                                      leAudioDevice->ctp_hdls_.val_hdl, value,
                                      GATT_WRITE_NO_RSP, NULL, NULL);
  }
  }


  GroupStreamStatus PrepareAndSendDisableToTheGroup(LeAudioDeviceGroup* group) {
  GroupStreamStatus PrepareAndSendDisableToTheGroup(LeAudioDeviceGroup* group) {
@@ -2091,9 +2105,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    std::vector<uint8_t> value;
    std::vector<uint8_t> value;
    le_audio::client_parser::ascs::PrepareAseCtpDisable(ids, value);
    le_audio::client_parser::ascs::PrepareAseCtpDisable(ids, value);


    BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
    WriteToControlPoint(leAudioDevice, value);
                                      leAudioDevice->ctp_hdls_.val_hdl, value,
                                      GATT_WRITE_NO_RSP, NULL, NULL);
  }
  }


  GroupStreamStatus PrepareAndSendReleaseToTheGroup(LeAudioDeviceGroup* group) {
  GroupStreamStatus PrepareAndSendReleaseToTheGroup(LeAudioDeviceGroup* group) {
@@ -2131,9 +2143,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    std::vector<uint8_t> value;
    std::vector<uint8_t> value;
    le_audio::client_parser::ascs::PrepareAseCtpRelease(ids, value);
    le_audio::client_parser::ascs::PrepareAseCtpRelease(ids, value);


    BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
    WriteToControlPoint(leAudioDevice, value);
                                      leAudioDevice->ctp_hdls_.val_hdl, value,
                                      GATT_WRITE_NO_RSP, NULL, NULL);
  }
  }


  void PrepareAndSendConfigQos(LeAudioDeviceGroup* group,
  void PrepareAndSendConfigQos(LeAudioDeviceGroup* group,
@@ -2202,9 +2212,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
             ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_));
             ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_));
    std::vector<uint8_t> value;
    std::vector<uint8_t> value;
    le_audio::client_parser::ascs::PrepareAseCtpConfigQos(confs, value);
    le_audio::client_parser::ascs::PrepareAseCtpConfigQos(confs, value);
    BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
    WriteToControlPoint(leAudioDevice, value);
                                      leAudioDevice->ctp_hdls_.val_hdl, value,
                                      GATT_WRITE_NO_RSP, NULL, NULL);
  }
  }


  void PrepareAndSendUpdateMetadata(
  void PrepareAndSendUpdateMetadata(
@@ -2260,9 +2268,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
      std::vector<uint8_t> value;
      std::vector<uint8_t> value;
      le_audio::client_parser::ascs::PrepareAseCtpUpdateMetadata(confs, value);
      le_audio::client_parser::ascs::PrepareAseCtpUpdateMetadata(confs, value);


      BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
      WriteToControlPoint(leAudioDevice, value);
                                        leAudioDevice->ctp_hdls_.val_hdl, value,
                                        GATT_WRITE_NO_RSP, NULL, NULL);
    }
    }
  }
  }


@@ -2282,10 +2288,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
      le_audio::client_parser::ascs::PrepareAseCtpAudioReceiverStartReady(
      le_audio::client_parser::ascs::PrepareAseCtpAudioReceiverStartReady(
          ids, value);
          ids, value);


      BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
      WriteToControlPoint(leAudioDevice, value);
                                        leAudioDevice->ctp_hdls_.val_hdl, value,
                                        GATT_WRITE_NO_RSP, NULL, NULL);

      return;
      return;
    }
    }
  }
  }