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