| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "packet.h" |
| |
| #include <unordered_map> |
| |
| #include "src/connectivity/bluetooth/core/bt-host/common/log.h" |
| #include "src/connectivity/bluetooth/core/bt-host/sm/smp.h" |
| #include "src/connectivity/bluetooth/core/bt-host/sm/types.h" |
| |
| namespace bt::sm { |
| |
| PacketReader::PacketReader(const ByteBuffer* buffer) |
| : PacketView<Header>(buffer, buffer->size() - sizeof(Header)) {} |
| |
| ValidPacketReader::ValidPacketReader(const ByteBuffer* buffer) : PacketReader(buffer) {} |
| |
| fit::result<ValidPacketReader, sm::ErrorCode> ValidPacketReader::ParseSdu( |
| const ByteBufferPtr& sdu) { |
| ZX_ASSERT(sdu); |
| size_t length = sdu->size(); |
| if (length < sizeof(Header)) { |
| bt_log(DEBUG, "sm", "PDU too short!"); |
| return fit::error(ErrorCode::kInvalidParameters); |
| } |
| auto reader = PacketReader(sdu.get()); |
| auto expected_payload_size = kCodeToPayloadSize.find(reader.code()); |
| if (expected_payload_size == kCodeToPayloadSize.end()) { |
| bt_log(DEBUG, "sm", "smp code not recognized: %#.2X", reader.code()); |
| return fit::error(ErrorCode::kCommandNotSupported); |
| } |
| if (reader.payload_size() != expected_payload_size->second) { |
| bt_log(DEBUG, "sm", "malformed packet with code %#.2X", reader.code()); |
| return fit::error(ErrorCode::kInvalidParameters); |
| } |
| return fit::ok(ValidPacketReader(sdu.get())); |
| } |
| |
| PacketWriter::PacketWriter(Code code, MutableByteBuffer* buffer) |
| : MutablePacketView<Header>(buffer, buffer->size() - sizeof(Header)) { |
| mutable_header()->code = code; |
| } |
| |
| } // namespace bt::sm |