• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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