// Copyright 2023 The Pigweed Authors // // 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 // // https://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 "pw_bluetooth_sapphire/internal/host/sm/pairing_phase.h" #include #include "pw_bluetooth_sapphire/internal/host/common/log.h" #include "pw_bluetooth_sapphire/internal/host/sm/smp.h" #include "pw_bluetooth_sapphire/internal/host/sm/types.h" namespace bt::sm { PairingPhase::PairingPhase(PairingChannel::WeakPtr chan, Listener::WeakPtr listener, Role role) : sm_chan_(std::move(chan)), listener_(std::move(listener)), role_(role), has_failed_(false), weak_channel_handler_(nullptr) {} void PairingPhase::SetPairingChannelHandler(PairingChannelHandler& self) { weak_channel_handler_ = WeakSelf(&self); sm_chan().SetChannelHandler(weak_channel_handler_.GetWeakPtr()); } void PairingPhase::InvalidatePairingChannelHandler() { weak_channel_handler_.InvalidatePtrs(); } void PairingPhase::OnFailure(Error error) { PW_CHECK(!has_failed()); bt_log(WARN, "sm", "pairing failed: %s", bt_str(error)); has_failed_ = true; PW_CHECK(listener_.is_alive()); listener_->OnPairingFailed(error); } void PairingPhase::Abort(ErrorCode ecode) { PW_CHECK(!has_failed()); Error error(ecode); bt_log(INFO, "sm", "abort pairing: %s", bt_str(error)); sm_chan().SendMessage(kPairingFailed, ecode); OnFailure(error); } void PairingPhase::HandleChannelClosed() { bt_log(WARN, "sm", "channel closed while pairing"); OnFailure(Error(HostError::kLinkDisconnected)); } } // namespace bt::sm