• 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 
17 #pragma once
18 
19 #include <memory>
20 #include <unordered_map>
21 
22 #include "hci/acl_manager.h"
23 #include "l2cap/classic/dynamic_channel_configuration_option.h"
24 #include "l2cap/classic/internal/dynamic_channel_service_manager_impl.h"
25 #include "l2cap/classic/internal/fixed_channel_impl.h"
26 #include "l2cap/classic/internal/fixed_channel_service_manager_impl.h"
27 #include "l2cap/internal/data_pipeline_manager.h"
28 #include "l2cap/internal/dynamic_channel_allocator.h"
29 #include "l2cap/internal/dynamic_channel_impl.h"
30 #include "l2cap/internal/fixed_channel_allocator.h"
31 #include "l2cap/internal/ilink.h"
32 #include "l2cap/internal/parameter_provider.h"
33 #include "os/alarm.h"
34 #include "os/handler.h"
35 #include "signalling_manager.h"
36 
37 namespace bluetooth {
38 namespace l2cap {
39 namespace classic {
40 namespace internal {
41 
42 class Link : public l2cap::internal::ILink, public hci::ConnectionManagementCallbacks {
43  public:
44   Link(os::Handler* l2cap_handler, std::unique_ptr<hci::AclConnection> acl_connection,
45        l2cap::internal::ParameterProvider* parameter_provider,
46        DynamicChannelServiceManagerImpl* dynamic_service_manager,
47        FixedChannelServiceManagerImpl* fixed_service_manager);
48   ~Link();
49 
GetDevice()50   hci::AddressWithType GetDevice() override {
51     return {acl_connection_->GetAddress(), acl_connection_->GetAddressType()};
52   }
53 
54   struct PendingDynamicChannelConnection {
55     os::Handler* handler_;
56     DynamicChannelManager::OnConnectionOpenCallback on_open_callback_;
57     DynamicChannelManager::OnConnectionFailureCallback on_fail_callback_;
58     classic::DynamicChannelConfigurationOption configuration_;
59   };
60 
61   struct PendingAuthenticateDynamicChannelConnection {
62     Psm psm_;
63     Cid cid_;
64     PendingDynamicChannelConnection pending_dynamic_channel_connection_;
65   };
66 
67   // ACL methods
68 
69   virtual void OnAclDisconnected(hci::ErrorCode status);
70 
71   virtual void Disconnect();
72 
73   virtual void Encrypt();
74 
75   virtual void Authenticate();
76 
77   virtual bool IsAuthenticated() const;
78 
79   virtual void ReadRemoteVersionInformation();
80 
81   virtual void ReadRemoteSupportedFeatures();
82 
83   virtual void ReadRemoteExtendedFeatures();
84 
85   virtual void ReadClockOffset();
86 
87   // FixedChannel methods
88 
89   std::shared_ptr<FixedChannelImpl> AllocateFixedChannel(Cid cid, SecurityPolicy security_policy);
90 
91   virtual bool IsFixedChannelAllocated(Cid cid);
92 
93   // DynamicChannel methods
94 
95   virtual Cid ReserveDynamicChannel();
96 
97   virtual void SendConnectionRequest(Psm psm, Cid local_cid);
98   virtual void SendConnectionRequest(Psm psm, Cid local_cid,
99                                      PendingDynamicChannelConnection pending_dynamic_channel_connection);
100 
101   // Invoked by signalling manager to indicate an outgoing connection request failed and link shall free resources
102   virtual void OnOutgoingConnectionRequestFail(Cid local_cid);
103 
104   virtual void SendInformationRequest(InformationRequestInfoType type);
105 
106   virtual void SendDisconnectionRequest(Cid local_cid, Cid remote_cid) override;
107 
108   virtual std::shared_ptr<l2cap::internal::DynamicChannelImpl> AllocateDynamicChannel(Psm psm, Cid remote_cid,
109                                                                                       SecurityPolicy security_policy);
110 
111   virtual std::shared_ptr<l2cap::internal::DynamicChannelImpl> AllocateReservedDynamicChannel(
112       Cid reserved_cid, Psm psm, Cid remote_cid, SecurityPolicy security_policy);
113 
114   virtual classic::DynamicChannelConfigurationOption GetConfigurationForInitialConfiguration(Cid cid);
115 
116   virtual void FreeDynamicChannel(Cid cid);
117 
118   // Check how many channels are acquired or in use, if zero, start tear down timer, if non-zero, cancel tear down timer
119   virtual void RefreshRefCount();
120 
121   virtual void NotifyChannelCreation(Cid cid, std::unique_ptr<DynamicChannel> channel);
122   virtual void NotifyChannelFail(Cid cid, DynamicChannelManager::ConnectionResult result);
123 
124   // Information received from signaling channel
125   virtual void SetRemoteConnectionlessMtu(Mtu mtu);
126   virtual Mtu GetRemoteConnectionlessMtu() const;
127   virtual void SetRemoteSupportsErtm(bool supported);
128   virtual bool GetRemoteSupportsErtm() const;
129   virtual void SetRemoteSupportsFcs(bool supported);
130   virtual bool GetRemoteSupportsFcs() const;
131 
ToString()132   virtual std::string ToString() {
133     return GetDevice().ToString();
134   }
135 
SendLeCredit(Cid local_cid,uint16_t credit)136   void SendLeCredit(Cid local_cid, uint16_t credit) override {}
137 
138   void AddChannelPendingingAuthentication(PendingAuthenticateDynamicChannelConnection pending_channel);
139 
140   // ConnectionManagementCallbacks
141   virtual void OnConnectionPacketTypeChanged(uint16_t packet_type) override;
142   virtual void OnAuthenticationComplete() override;
143   virtual void OnEncryptionChange(hci::EncryptionEnabled enabled) override;
144   virtual void OnChangeConnectionLinkKeyComplete() override;
145   virtual void OnReadClockOffsetComplete(uint16_t clock_offset) override;
146   virtual void OnModeChange(hci::Mode current_mode, uint16_t interval) override;
147   virtual void OnQosSetupComplete(hci::ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth,
148                                   uint32_t latency, uint32_t delay_variation) override;
149   virtual void OnFlowSpecificationComplete(hci::FlowDirection flow_direction, hci::ServiceType service_type,
150                                            uint32_t token_rate, uint32_t token_bucket_size, uint32_t peak_bandwidth,
151                                            uint32_t access_latency) override;
152   virtual void OnFlushOccurred() override;
153   virtual void OnRoleDiscoveryComplete(hci::Role current_role) override;
154   virtual void OnReadLinkPolicySettingsComplete(uint16_t link_policy_settings) override;
155   virtual void OnReadAutomaticFlushTimeoutComplete(uint16_t flush_timeout) override;
156   virtual void OnReadTransmitPowerLevelComplete(uint8_t transmit_power_level) override;
157   virtual void OnReadLinkSupervisionTimeoutComplete(uint16_t link_supervision_timeout) override;
158   virtual void OnReadFailedContactCounterComplete(uint16_t failed_contact_counter) override;
159   virtual void OnReadLinkQualityComplete(uint8_t link_quality) override;
160   virtual void OnReadAfhChannelMapComplete(hci::AfhMode afh_mode, std::array<uint8_t, 10> afh_channel_map) override;
161   virtual void OnReadRssiComplete(uint8_t rssi) override;
162   virtual void OnReadClockComplete(uint32_t clock, uint16_t accuracy) override;
163 
164  private:
165   os::Handler* l2cap_handler_;
166   l2cap::internal::FixedChannelAllocator<FixedChannelImpl, Link> fixed_channel_allocator_{this, l2cap_handler_};
167   l2cap::internal::DynamicChannelAllocator dynamic_channel_allocator_{this, l2cap_handler_};
168   std::unique_ptr<hci::AclConnection> acl_connection_;
169   l2cap::internal::DataPipelineManager data_pipeline_manager_;
170   l2cap::internal::ParameterProvider* parameter_provider_;
171   DynamicChannelServiceManagerImpl* dynamic_service_manager_;
172   FixedChannelServiceManagerImpl* fixed_service_manager_;
173   ClassicSignallingManager signalling_manager_;
174   std::unordered_map<Cid, PendingDynamicChannelConnection> local_cid_to_pending_dynamic_channel_connection_map_;
175   os::Alarm link_idle_disconnect_alarm_{l2cap_handler_};
176   Mtu remote_connectionless_mtu_ = kMinimumClassicMtu;
177   bool remote_supports_ertm_ = false;
178   bool remote_supports_fcs_ = false;
179   hci::EncryptionEnabled encryption_enabled_ = hci::EncryptionEnabled::OFF;
180   std::list<Link::PendingAuthenticateDynamicChannelConnection> pending_channel_list_;
181   DISALLOW_COPY_AND_ASSIGN(Link);
182 };
183 
184 }  // namespace internal
185 }  // namespace classic
186 }  // namespace l2cap
187 }  // namespace bluetooth
188