1 /* 2 * Copyright 2019 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 #pragma once 17 18 #include <memory> 19 20 #include "common/callback.h" 21 #include "hci/address_with_type.h" 22 #include "hci/hci_packets.h" 23 #include "module.h" 24 25 namespace bluetooth { 26 namespace hci { 27 28 class PeriodicAdvertisingParameters { 29 public: 30 bool enable; 31 bool include_adi; 32 uint16_t min_interval; 33 uint16_t max_interval; 34 uint16_t properties; 35 enum AdvertisingProperty { INCLUDE_TX_POWER = 0x06 }; 36 }; 37 38 enum class AdvertiserAddressType { 39 PUBLIC, 40 RESOLVABLE_RANDOM, 41 NONRESOLVABLE_RANDOM, 42 }; 43 44 class AdvertisingConfig { 45 public: 46 std::vector<GapData> advertisement; 47 std::vector<GapData> scan_response; 48 uint16_t interval_min; 49 uint16_t interval_max; 50 AdvertisingType advertising_type; 51 AdvertiserAddressType requested_advertiser_address_type; 52 PeerAddressType peer_address_type; 53 Address peer_address; 54 uint8_t channel_map; 55 AdvertisingFilterPolicy filter_policy; 56 uint8_t tx_power; // -127 to +20 (0x7f is no preference) 57 bool connectable = false; 58 bool discoverable = false; 59 bool scannable = false; 60 bool directed = false; 61 bool high_duty_directed_connectable = false; 62 bool legacy_pdus = false; 63 bool anonymous = false; 64 bool include_tx_power = false; 65 bool use_le_coded_phy; // Primary advertisement PHY is LE Coded 66 uint8_t secondary_max_skip; // maximum advertising events to be skipped, 0x0 send AUX_ADV_IND prior ot the next event 67 SecondaryPhyType secondary_advertising_phy; 68 uint8_t sid = 0x00; 69 Enable enable_scan_request_notifications = Enable::DISABLED; 70 std::vector<GapData> periodic_data; 71 PeriodicAdvertisingParameters periodic_advertising_parameters; 72 AdvertisingConfig() = default; 73 }; 74 75 using AdvertiserId = uint8_t; 76 77 class AdvertisingCallback { 78 public: 79 enum AdvertisingStatus { 80 SUCCESS, 81 DATA_TOO_LARGE, 82 TOO_MANY_ADVERTISERS, 83 ALREADY_STARTED, 84 INTERNAL_ERROR, 85 FEATURE_UNSUPPORTED 86 }; 87 88 virtual ~AdvertisingCallback() = default; 89 virtual void OnAdvertisingSetStarted( 90 int reg_id, uint8_t advertiser_id, int8_t tx_power, AdvertisingStatus status) = 0; 91 virtual void OnAdvertisingEnabled(uint8_t advertiser_id, bool enable, uint8_t status) = 0; 92 virtual void OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) = 0; 93 virtual void OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) = 0; 94 virtual void OnAdvertisingParametersUpdated(uint8_t advertiser_id, int8_t tx_power, uint8_t status) = 0; 95 virtual void OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id, uint8_t status) = 0; 96 virtual void OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) = 0; 97 virtual void OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable, uint8_t status) = 0; 98 virtual void OnOwnAddressRead(uint8_t advertiser_id, uint8_t address_type, Address address) = 0; 99 }; 100 101 class LeAdvertisingManager : public bluetooth::Module { 102 public: 103 static constexpr AdvertiserId kInvalidId = 0xFF; 104 static constexpr uint8_t kInvalidHandle = 0xFF; 105 static constexpr uint8_t kAdvertisingSetIdMask = 0x0F; 106 static constexpr uint16_t kLeMaximumFragmentLength = 251; 107 static constexpr FragmentPreference kFragment_preference = FragmentPreference::CONTROLLER_SHOULD_NOT; 108 LeAdvertisingManager(); 109 LeAdvertisingManager(const LeAdvertisingManager&) = delete; 110 LeAdvertisingManager& operator=(const LeAdvertisingManager&) = delete; 111 112 size_t GetNumberOfAdvertisingInstances() const; 113 114 void ExtendedCreateAdvertiser( 115 int reg_id, 116 const AdvertisingConfig config, 117 common::Callback<void(Address, AddressType)> scan_callback, 118 common::Callback<void(ErrorCode, uint8_t, uint8_t)> set_terminated_callback, 119 uint16_t duration, 120 uint8_t max_extended_advertising_events, 121 os::Handler* handler); 122 123 void StartAdvertising( 124 AdvertiserId advertiser_id, 125 const AdvertisingConfig config, 126 uint16_t duration, 127 base::OnceCallback<void(uint8_t /* status */)> status_callback, 128 base::OnceCallback<void(uint8_t /* status */)> timeout_callback, 129 common::Callback<void(Address, AddressType)> scan_callback, 130 common::Callback<void(ErrorCode, uint8_t, uint8_t)> set_terminated_callback, 131 os::Handler* handler); 132 133 void GetOwnAddress(uint8_t advertiser_id); 134 135 void RegisterAdvertiser( 136 common::ContextualOnceCallback<void(uint8_t /* inst_id */, uint8_t /* status */)> callback); 137 138 void SetParameters(AdvertiserId advertiser_id, AdvertisingConfig config); 139 140 void SetData(AdvertiserId advertiser_id, bool set_scan_rsp, std::vector<GapData> data); 141 142 void EnableAdvertiser( 143 AdvertiserId advertiser_id, bool enable, uint16_t duration, uint8_t max_extended_advertising_events); 144 145 void SetPeriodicParameters(AdvertiserId advertiser_id, PeriodicAdvertisingParameters periodic_advertising_parameters); 146 147 void SetPeriodicData(AdvertiserId advertiser_id, std::vector<GapData> data); 148 149 void EnablePeriodicAdvertising(AdvertiserId advertiser_id, bool enable, bool include_adi); 150 151 void RemoveAdvertiser(AdvertiserId advertiser_id); 152 153 void RegisterAdvertisingCallback(AdvertisingCallback* advertising_callback); 154 155 static const ModuleFactory Factory; 156 157 protected: 158 void ListDependencies(ModuleList* list) const override; 159 160 void Start() override; 161 162 void Stop() override; 163 164 std::string ToString() const override; 165 166 private: 167 struct impl; 168 std::unique_ptr<impl> pimpl_; 169 }; 170 171 } // namespace hci 172 } // namespace bluetooth 173