Home | History | Annotate | Download | only in rootcanal
      1 //
      2 // Copyright 2017 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 // http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #define LOG_TAG "android.hardware.bluetooth (at) 1.0.sim"
     18 
     19 #include "bluetooth_hci.h"
     20 
     21 #include <base/logging.h>
     22 #include <string.h>
     23 #include <utils/Log.h>
     24 
     25 #include "acl_packet.h"
     26 #include "event_packet.h"
     27 #include "hci_internals.h"
     28 #include "sco_packet.h"
     29 
     30 namespace android {
     31 namespace hardware {
     32 namespace bluetooth {
     33 namespace V1_0 {
     34 namespace sim {
     35 
     36 using android::hardware::hidl_vec;
     37 using test_vendor_lib::AclPacket;
     38 using test_vendor_lib::AsyncManager;
     39 using test_vendor_lib::AsyncTaskId;
     40 using test_vendor_lib::CommandPacket;
     41 using test_vendor_lib::DualModeController;
     42 using test_vendor_lib::EventPacket;
     43 using test_vendor_lib::ScoPacket;
     44 using test_vendor_lib::TaskCallback;
     45 using test_vendor_lib::TestChannelTransport;
     46 
     47 class BluetoothDeathRecipient : public hidl_death_recipient {
     48  public:
     49   BluetoothDeathRecipient(const sp<IBluetoothHci> hci) : mHci(hci) {}
     50 
     51   virtual void serviceDied(
     52       uint64_t /* cookie */,
     53       const wp<::android::hidl::base::V1_0::IBase>& /* who */) {
     54     ALOGE("BluetoothDeathRecipient::serviceDied - Bluetooth service died");
     55     has_died_ = true;
     56     mHci->close();
     57   }
     58   sp<IBluetoothHci> mHci;
     59   bool getHasDied() const { return has_died_; }
     60   void setHasDied(bool has_died) { has_died_ = has_died; }
     61 
     62  private:
     63   bool has_died_;
     64 };
     65 
     66 BluetoothHci::BluetoothHci()
     67     : death_recipient_(new BluetoothDeathRecipient(this)) {}
     68 
     69 Return<void> BluetoothHci::initialize(const sp<IBluetoothHciCallbacks>& cb) {
     70   ALOGI("%s", __func__);
     71 
     72   if (cb == nullptr) {
     73     ALOGE("cb == nullptr! -> Unable to call initializationComplete(ERR)");
     74     return Void();
     75   }
     76 
     77   death_recipient_->setHasDied(false);
     78   cb->linkToDeath(death_recipient_, 0);
     79 
     80   test_channel_transport_.RegisterCommandHandler(
     81       [this](const std::string& name, const std::vector<std::string>& args) {
     82         async_manager_.ExecAsync(
     83             std::chrono::milliseconds(0), [this, name, args]() {
     84               controller_.HandleTestChannelCommand(name, args);
     85             });
     86       });
     87 
     88   controller_.RegisterEventChannel([cb](std::unique_ptr<EventPacket> event) {
     89     size_t header_bytes = event->GetHeaderSize();
     90     size_t payload_bytes = event->GetPayloadSize();
     91     hidl_vec<uint8_t> hci_event;
     92     hci_event.resize(header_bytes + payload_bytes);
     93     memcpy(hci_event.data(), event->GetHeader().data(), header_bytes);
     94     memcpy(hci_event.data() + header_bytes, event->GetPayload().data(),
     95            payload_bytes);
     96 
     97     cb->hciEventReceived(hci_event);
     98   });
     99 
    100   controller_.RegisterAclChannel([cb](std::unique_ptr<AclPacket> packet) {
    101     std::vector<uint8_t> acl_vector = packet->GetPacket();
    102     hidl_vec<uint8_t> acl_packet = acl_vector;
    103 
    104     cb->aclDataReceived(acl_packet);
    105   });
    106 
    107   controller_.RegisterScoChannel([cb](std::unique_ptr<ScoPacket> packet) {
    108     size_t header_bytes = packet->GetHeaderSize();
    109     size_t payload_bytes = packet->GetPayloadSize();
    110     hidl_vec<uint8_t> sco_packet;
    111     sco_packet.resize(header_bytes + payload_bytes);
    112     memcpy(sco_packet.data(), packet->GetHeader().data(), header_bytes);
    113     memcpy(sco_packet.data() + header_bytes, packet->GetPayload().data(),
    114            payload_bytes);
    115 
    116     cb->scoDataReceived(sco_packet);
    117   });
    118 
    119   controller_.RegisterTaskScheduler(
    120       [this](std::chrono::milliseconds delay, const TaskCallback& task) {
    121         return async_manager_.ExecAsync(delay, task);
    122       });
    123 
    124   controller_.RegisterPeriodicTaskScheduler(
    125       [this](std::chrono::milliseconds delay, std::chrono::milliseconds period,
    126              const TaskCallback& task) {
    127         return async_manager_.ExecAsyncPeriodically(delay, period, task);
    128       });
    129 
    130   controller_.RegisterTaskCancel(
    131       [this](AsyncTaskId task) { async_manager_.CancelAsyncTask(task); });
    132 
    133   SetUpTestChannel(6111);
    134 
    135   unlink_cb_ = [cb](sp<BluetoothDeathRecipient>& death_recipient) {
    136     if (death_recipient->getHasDied())
    137       ALOGI("Skipping unlink call, service died.");
    138     else
    139       cb->unlinkToDeath(death_recipient);
    140   };
    141 
    142   cb->initializationComplete(Status::SUCCESS);
    143   return Void();
    144 }
    145 
    146 Return<void> BluetoothHci::close() {
    147   ALOGI("%s", __func__);
    148   return Void();
    149 }
    150 
    151 Return<void> BluetoothHci::sendHciCommand(const hidl_vec<uint8_t>& packet) {
    152   async_manager_.ExecAsync(std::chrono::milliseconds(0), [this, packet]() {
    153     uint16_t opcode = packet[0] | (packet[1] << 8);
    154     std::unique_ptr<CommandPacket> command =
    155         std::unique_ptr<CommandPacket>(new CommandPacket(opcode));
    156     for (size_t i = 3; i < packet.size(); i++)
    157       command->AddPayloadOctets1(packet[i]);
    158 
    159     controller_.HandleCommand(std::move(command));
    160   });
    161   return Void();
    162 }
    163 
    164 Return<void> BluetoothHci::sendAclData(const hidl_vec<uint8_t>& packet) {
    165   async_manager_.ExecAsync(std::chrono::milliseconds(0), [this, packet]() {
    166     uint16_t channel = (packet[0] | (packet[1] << 8)) & 0xfff;
    167     AclPacket::PacketBoundaryFlags boundary_flags =
    168         static_cast<AclPacket::PacketBoundaryFlags>((packet[1] & 0x30) >> 4);
    169     AclPacket::BroadcastFlags broadcast_flags =
    170         static_cast<AclPacket::BroadcastFlags>((packet[1] & 0xC0) >> 6);
    171 
    172     std::unique_ptr<AclPacket> acl = std::unique_ptr<AclPacket>(
    173         new AclPacket(channel, boundary_flags, broadcast_flags));
    174     for (size_t i = 4; i < packet.size(); i++)
    175       acl->AddPayloadOctets1(packet[i]);
    176 
    177     controller_.HandleAcl(std::move(acl));
    178   });
    179   return Void();
    180 }
    181 
    182 Return<void> BluetoothHci::sendScoData(const hidl_vec<uint8_t>& packet) {
    183   async_manager_.ExecAsync(std::chrono::milliseconds(0), [this, packet]() {
    184     uint16_t channel = (packet[0] | (packet[1] << 8)) & 0xfff;
    185     ScoPacket::PacketStatusFlags packet_status =
    186         static_cast<ScoPacket::PacketStatusFlags>((packet[1] & 0x30) >> 4);
    187     std::unique_ptr<ScoPacket> sco =
    188         std::unique_ptr<ScoPacket>(new ScoPacket(channel, packet_status));
    189     for (size_t i = 3; i < packet.size(); i++)
    190       sco->AddPayloadOctets1(packet[i]);
    191 
    192     controller_.HandleSco(std::move(sco));
    193   });
    194   return Void();
    195 }
    196 
    197 void BluetoothHci::SetUpTestChannel(int port) {
    198   int socket_fd = test_channel_transport_.SetUp(port);
    199 
    200   if (socket_fd == -1) {
    201     ALOGE("Test channel SetUp(%d) failed.", port);
    202     return;
    203   }
    204 
    205   ALOGI("Test channel SetUp() successful");
    206   async_manager_.WatchFdForNonBlockingReads(socket_fd, [this](int socket_fd) {
    207     int conn_fd = test_channel_transport_.Accept(socket_fd);
    208     if (conn_fd < 0) {
    209       ALOGE("Error watching test channel fd.");
    210       return;
    211     }
    212     ALOGI("Test channel connection accepted.");
    213     async_manager_.WatchFdForNonBlockingReads(conn_fd, [this](int conn_fd) {
    214       test_channel_transport_.OnCommandReady(conn_fd, [this, conn_fd]() {
    215         async_manager_.StopWatchingFileDescriptor(conn_fd);
    216       });
    217     });
    218   });
    219 }
    220 
    221 /* Fallback to shared library if there is no service. */
    222 IBluetoothHci* HIDL_FETCH_IBluetoothHci(const char* /* name */) {
    223   return new BluetoothHci();
    224 }
    225 
    226 }  // namespace gce
    227 }  // namespace V1_0
    228 }  // namespace bluetooth
    229 }  // namespace hardware
    230 }  // namespace android
    231