summaryrefslogtreecommitdiff
path: root/system/gd/l2cap/internal/data_pipeline_manager.cc
blob: e3fe89b8e0fdd35645e063294c352eeec012a538 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <unordered_map>

#include "l2cap/cid.h"
#include "l2cap/internal/channel_impl.h"
#include "l2cap/internal/data_controller.h"
#include "l2cap/internal/data_pipeline_manager.h"
#include "l2cap/internal/sender.h"
#include "os/log.h"

namespace bluetooth {
namespace l2cap {
namespace internal {

void DataPipelineManager::AttachChannel(Cid cid, std::shared_ptr<ChannelImpl> channel, ChannelMode mode) {
  ASSERT(sender_map_.find(cid) == sender_map_.end());
  sender_map_.emplace(std::piecewise_construct, std::forward_as_tuple(cid),
                      std::forward_as_tuple(handler_, link_, scheduler_.get(), channel, mode));
}

void DataPipelineManager::DetachChannel(Cid cid) {
  ASSERT(sender_map_.find(cid) != sender_map_.end());
  sender_map_.erase(cid);
  scheduler_->RemoveChannel(cid);
  scheduler_->SetChannelTxPriority(cid, false);
}

DataController* DataPipelineManager::GetDataController(Cid cid) {
  if (sender_map_.find(cid) == sender_map_.end()) {
    return nullptr;
  };
  return sender_map_.find(cid)->second.GetDataController();
}

void DataPipelineManager::OnPacketSent(Cid cid) {
  ASSERT(sender_map_.find(cid) != sender_map_.end());
  sender_map_.find(cid)->second.OnPacketSent();
}

void DataPipelineManager::UpdateClassicConfiguration(Cid cid, classic::internal::ChannelConfigurationState config) {
  ASSERT(sender_map_.find(cid) != sender_map_.end());
  sender_map_.find(cid)->second.UpdateClassicConfiguration(config);
}

void DataPipelineManager::SetChannelTxPriority(Cid cid, bool high_priority) {
  ASSERT(sender_map_.find(cid) != sender_map_.end());
  scheduler_->SetChannelTxPriority(cid, high_priority);
}

}  // namespace internal
}  // namespace l2cap
}  // namespace bluetooth