blob: 2c6c1b86a7e9b8962610f4a4a09bece272fa8c05 [file] [log] [blame]
Chris Manton4eb56312019-08-13 14:45:06 -07001/*
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
Jack Heb5360fb2019-08-19 18:16:33 -070019#include <memory>
Chris Manton6230a6f2019-11-13 18:37:33 -080020#include <unordered_map>
Jack Heb5360fb2019-08-19 18:16:33 -070021
22#include "hci/acl_manager.h"
Hansong Zhanga6312532019-11-19 14:01:36 -080023#include "l2cap/classic/dynamic_channel_configuration_option.h"
Jack Heff38d892019-10-03 17:11:07 -070024#include "l2cap/classic/internal/dynamic_channel_allocator.h"
25#include "l2cap/classic/internal/dynamic_channel_impl.h"
Hansong Zhangcd0c3192019-09-20 15:50:42 -070026#include "l2cap/classic/internal/dynamic_channel_service_manager_impl.h"
Jack Heff38d892019-10-03 17:11:07 -070027#include "l2cap/classic/internal/fixed_channel_impl.h"
Hansong Zhangcd0c3192019-09-20 15:50:42 -070028#include "l2cap/classic/internal/fixed_channel_service_manager_impl.h"
Jack He580337d2019-10-01 20:44:04 -070029#include "l2cap/internal/fixed_channel_allocator.h"
Jack He6a9b4662019-08-20 22:07:26 -070030#include "l2cap/internal/parameter_provider.h"
Hansong Zhangb0960762019-11-14 17:57:10 -080031#include "l2cap/internal/receiver.h"
Jack Heb5360fb2019-08-19 18:16:33 -070032#include "l2cap/internal/scheduler.h"
Jack He6a9b4662019-08-20 22:07:26 -070033#include "os/alarm.h"
Hansong Zhangcd0c3192019-09-20 15:50:42 -070034#include "os/handler.h"
35#include "signalling_manager.h"
Jack Heb5360fb2019-08-19 18:16:33 -070036
Chris Manton4eb56312019-08-13 14:45:06 -070037namespace bluetooth {
38namespace l2cap {
Jack Heff38d892019-10-03 17:11:07 -070039namespace classic {
Jack Heb5360fb2019-08-19 18:16:33 -070040namespace internal {
41
Jack Heff38d892019-10-03 17:11:07 -070042class Link {
Jack Heb5360fb2019-08-19 18:16:33 -070043 public:
Jack Heff38d892019-10-03 17:11:07 -070044 Link(os::Handler* l2cap_handler, std::unique_ptr<hci::AclConnection> acl_connection,
Hansong Zhangcd0c3192019-09-20 15:50:42 -070045 std::unique_ptr<l2cap::internal::Scheduler> scheduler, l2cap::internal::ParameterProvider* parameter_provider,
46 DynamicChannelServiceManagerImpl* dynamic_service_manager,
47 FixedChannelServiceManagerImpl* fixed_service_manager);
Jack Heb5360fb2019-08-19 18:16:33 -070048
Jack Heff38d892019-10-03 17:11:07 -070049 virtual ~Link() = default;
Jack He6a9b4662019-08-20 22:07:26 -070050
Hansong Zhang80bbfc32019-09-10 16:12:05 -070051 virtual hci::Address GetDevice() {
Jack He6a9b4662019-08-20 22:07:26 -070052 return acl_connection_->GetAddress();
53 }
54
Chris Manton6230a6f2019-11-13 18:37:33 -080055 struct PendingDynamicChannelConnection {
56 os::Handler* handler_;
57 DynamicChannelManager::OnConnectionOpenCallback on_open_callback_;
58 DynamicChannelManager::OnConnectionFailureCallback on_fail_callback_;
Hansong Zhanga6312532019-11-19 14:01:36 -080059 classic::DynamicChannelConfigurationOption configuration_;
Chris Manton6230a6f2019-11-13 18:37:33 -080060 };
61
Jack He6a9b4662019-08-20 22:07:26 -070062 // ACL methods
63
Hansong Zhang80bbfc32019-09-10 16:12:05 -070064 virtual void OnAclDisconnected(hci::ErrorCode status);
Jack He6a9b4662019-08-20 22:07:26 -070065
Hansong Zhang80bbfc32019-09-10 16:12:05 -070066 virtual void Disconnect();
Jack He6a9b4662019-08-20 22:07:26 -070067
Jack Heff38d892019-10-03 17:11:07 -070068 // FixedChannel methods
Jack He6a9b4662019-08-20 22:07:26 -070069
Hansong Zhang213fc7c2019-11-14 14:56:08 -080070 std::shared_ptr<FixedChannelImpl> AllocateFixedChannel(Cid cid, SecurityPolicy security_policy);
Jack He6a9b4662019-08-20 22:07:26 -070071
Hansong Zhang80bbfc32019-09-10 16:12:05 -070072 virtual bool IsFixedChannelAllocated(Cid cid);
73
Hansong Zhangcd0c3192019-09-20 15:50:42 -070074 // DynamicChannel methods
75
Hansong Zhangd1b6c9b2019-10-22 16:11:53 -070076 virtual Cid ReserveDynamicChannel();
77
Hansong Zhangcd0c3192019-09-20 15:50:42 -070078 virtual void SendConnectionRequest(Psm psm, Cid local_cid);
Chris Manton6230a6f2019-11-13 18:37:33 -080079 virtual void SendConnectionRequest(Psm psm, Cid local_cid,
80 PendingDynamicChannelConnection pending_dynamic_channel_connection);
Hansong Zhangcd0c3192019-09-20 15:50:42 -070081
Chris Manton24809602019-10-31 14:36:02 -070082 virtual void SendInformationRequest(InformationRequestInfoType type);
83
Hansong Zhangcd0c3192019-09-20 15:50:42 -070084 virtual void SendDisconnectionRequest(Cid local_cid, Cid remote_cid);
Hansong Zhang80bbfc32019-09-10 16:12:05 -070085
Jack Heff38d892019-10-03 17:11:07 -070086 virtual std::shared_ptr<DynamicChannelImpl> AllocateDynamicChannel(Psm psm, Cid remote_cid,
87 SecurityPolicy security_policy);
Hansong Zhang80bbfc32019-09-10 16:12:05 -070088
Hansong Zhangd1b6c9b2019-10-22 16:11:53 -070089 virtual std::shared_ptr<DynamicChannelImpl> AllocateReservedDynamicChannel(Cid reserved_cid, Psm psm, Cid remote_cid,
90 SecurityPolicy security_policy);
91
Hansong Zhanga6312532019-11-19 14:01:36 -080092 virtual classic::DynamicChannelConfigurationOption GetConfigurationForInitialConfiguration(Cid cid);
Hansong Zhangb0960762019-11-14 17:57:10 -080093
Hansong Zhang80bbfc32019-09-10 16:12:05 -070094 virtual void FreeDynamicChannel(Cid cid);
Jack He6a9b4662019-08-20 22:07:26 -070095
96 // Check how many channels are acquired or in use, if zero, start tear down timer, if non-zero, cancel tear down timer
Hansong Zhang80bbfc32019-09-10 16:12:05 -070097 virtual void RefreshRefCount();
Jack Heb5360fb2019-08-19 18:16:33 -070098
Chris Manton6230a6f2019-11-13 18:37:33 -080099 virtual void NotifyChannelCreation(Cid cid, std::unique_ptr<DynamicChannel> channel);
100 virtual void NotifyChannelFail(Cid cid);
101
Hansong Zhang70fb4642019-11-20 17:33:06 -0800102 // Information received from signalling channel
103 virtual void SetRemoteConnectionlessMtu(Mtu mtu);
104 virtual Mtu GetRemoteConnectionlessMtu() const;
105 virtual void SetRemoteSupportsErtm(bool supported);
106 virtual bool GetRemoteSupportsErtm() const;
107 virtual void SetRemoteSupportsFcs(bool supported);
108 virtual bool GetRemoteSupportsFcs() const;
109
Jack Heb5360fb2019-08-19 18:16:33 -0700110 private:
Jack He6a9b4662019-08-20 22:07:26 -0700111 os::Handler* l2cap_handler_;
Jack Heff38d892019-10-03 17:11:07 -0700112 l2cap::internal::FixedChannelAllocator<FixedChannelImpl, Link> fixed_channel_allocator_{this, l2cap_handler_};
113 DynamicChannelAllocator dynamic_channel_allocator_{this, l2cap_handler_};
Jack Heb5360fb2019-08-19 18:16:33 -0700114 std::unique_ptr<hci::AclConnection> acl_connection_;
Jack Heff38d892019-10-03 17:11:07 -0700115 std::unique_ptr<l2cap::internal::Scheduler> scheduler_;
Hansong Zhangb0960762019-11-14 17:57:10 -0800116 l2cap::internal::Receiver receiver_;
Jack Heff38d892019-10-03 17:11:07 -0700117 l2cap::internal::ParameterProvider* parameter_provider_;
Hansong Zhangcd0c3192019-09-20 15:50:42 -0700118 DynamicChannelServiceManagerImpl* dynamic_service_manager_;
119 FixedChannelServiceManagerImpl* fixed_service_manager_;
120 ClassicSignallingManager signalling_manager_;
Chris Manton6230a6f2019-11-13 18:37:33 -0800121 std::unordered_map<Cid, PendingDynamicChannelConnection> local_cid_to_pending_dynamic_channel_connection_map_;
Jack He6a9b4662019-08-20 22:07:26 -0700122 os::Alarm link_idle_disconnect_alarm_{l2cap_handler_};
Hansong Zhang70fb4642019-11-20 17:33:06 -0800123 Mtu remote_mtu_ = kMinimumClassicMtu;
124 bool remote_supports_ertm_ = false;
125 bool remote_supports_fcs_ = false;
Jack Heff38d892019-10-03 17:11:07 -0700126 DISALLOW_COPY_AND_ASSIGN(Link);
Jack Heb5360fb2019-08-19 18:16:33 -0700127};
128
129} // namespace internal
Jack Heff38d892019-10-03 17:11:07 -0700130} // namespace classic
Chris Manton4eb56312019-08-13 14:45:06 -0700131} // namespace l2cap
132} // namespace bluetooth