Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1967333 authored by Erwin Jansen's avatar Erwin Jansen Committed by Automerger Merge Worker
Browse files

Merge "Enable sniffing of HCI packets to std::ostream" am: 8a3b8d9b am:...

Merge "Enable sniffing of HCI packets to std::ostream" am: 8a3b8d9b am: aa740b04 am: 59510ae0 am: 0a43b676

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/2116849



Change-Id: Icb6c7c5051708eb3ac5760617c845236a0c726f7
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 1a3042be 0a43b676
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -73,7 +73,8 @@ void TestEnvironment::initialize(std::promise<void> barrier) {
        filename =
        filename =
            device->GetAddress().ToString() + "_" + std::to_string(i) + ".pcap";
            device->GetAddress().ToString() + "_" + std::to_string(i) + ".pcap";
      }
      }
      std::static_pointer_cast<HciSniffer>(transport)->Open(filename.c_str());
      auto file = std::make_shared<std::ofstream>(filename, std::ios::binary);
      std::static_pointer_cast<HciSniffer>(transport)->SetOutputStream(file);
    }
    }
    srv->StartListening();
    srv->StartListening();
  });
  });
+30 −18
Original line number Original line Diff line number Diff line
@@ -23,9 +23,7 @@ using namespace std::literals;


namespace rootcanal {
namespace rootcanal {


void HciSniffer::Open(const char* filename) {
static void writeHeader(std::ostream* stream) {
  output_.open(filename, std::ios::binary);

  // https://tools.ietf.org/id/draft-gharris-opsawg-pcap-00.xml#file-header
  // https://tools.ietf.org/id/draft-gharris-opsawg-pcap-00.xml#file-header
  uint32_t magic_number = 0xa1b2c3d4;
  uint32_t magic_number = 0xa1b2c3d4;
  uint16_t major_version = 2;
  uint16_t major_version = 2;
@@ -36,13 +34,26 @@ void HciSniffer::Open(const char* filename) {
  uint32_t linktype = 201;  // http://www.tcpdump.org/linktypes.html
  uint32_t linktype = 201;  // http://www.tcpdump.org/linktypes.html
                            // LINKTYPE_BLUETOOTH_HCI_H4_WITH_PHDR
                            // LINKTYPE_BLUETOOTH_HCI_H4_WITH_PHDR


  output_.write((char*)&magic_number, 4);
  stream->write((char*)&magic_number, 4);
  output_.write((char*)&major_version, 2);
  stream->write((char*)&major_version, 2);
  output_.write((char*)&minor_version, 2);
  stream->write((char*)&minor_version, 2);
  output_.write((char*)&reserved1, 4);
  stream->write((char*)&reserved1, 4);
  output_.write((char*)&reserved2, 4);
  stream->write((char*)&reserved2, 4);
  output_.write((char*)&snaplen, 4);
  stream->write((char*)&snaplen, 4);
  output_.write((char*)&linktype, 4);
  stream->write((char*)&linktype, 4);
}

HciSniffer::HciSniffer(std::shared_ptr<HciTransport> transport,
                       std::shared_ptr<std::ostream> outputStream)
    : transport_(transport), start_(std::chrono::steady_clock::now()) {
  SetOutputStream(outputStream);
}

void HciSniffer::SetOutputStream(std::shared_ptr<std::ostream> outputStream) {
  output_ = outputStream;
  if (output_) {
    writeHeader(output_.get());
  }
}
}


void HciSniffer::AppendRecord(PacketDirection packet_direction,
void HciSniffer::AppendRecord(PacketDirection packet_direction,
@@ -60,13 +71,14 @@ void HciSniffer::AppendRecord(PacketDirection packet_direction,
  uint32_t direction = static_cast<uint32_t>(packet_direction);
  uint32_t direction = static_cast<uint32_t>(packet_direction);
  uint8_t idc = static_cast<uint8_t>(packet_type);
  uint8_t idc = static_cast<uint8_t>(packet_type);


  output_.write((char*)&seconds, 4);
  output_->write((char*)&seconds, 4);
  output_.write((char*)&microseconds, 4);
  output_->write((char*)&microseconds, 4);
  output_.write((char*)&captured_packet_length, 4);
  output_->write((char*)&captured_packet_length, 4);
  output_.write((char*)&original_packet_length, 4);
  output_->write((char*)&original_packet_length, 4);
  output_.write((char*)&direction, 4);
  output_->write((char*)&direction, 4);
  output_.write((char*)&idc, 1);
  output_->write((char*)&idc, 1);
  output_.write((char*)packet.data(), packet.size());
  output_->write((char*)packet.data(), packet.size());
  output_->flush();
}
}


void HciSniffer::RegisterCallbacks(PacketCallback command_callback,
void HciSniffer::RegisterCallbacks(PacketCallback command_callback,
@@ -103,7 +115,7 @@ void HciSniffer::TimerTick() { transport_->TimerTick(); }


void HciSniffer::Close() {
void HciSniffer::Close() {
  transport_->Close();
  transport_->Close();
  output_.close();
  output_->flush();
}
}


void HciSniffer::SendEvent(const std::vector<uint8_t>& packet) {
void HciSniffer::SendEvent(const std::vector<uint8_t>& packet) {
+12 −6
Original line number Original line Diff line number Diff line
@@ -19,6 +19,8 @@
#include <chrono>
#include <chrono>
#include <cstdint>
#include <cstdint>
#include <fstream>
#include <fstream>
#include <memory>
#include <ostream>


#include "model/hci/h4.h"
#include "model/hci/h4.h"
#include "model/hci/hci_transport.h"
#include "model/hci/hci_transport.h"
@@ -30,18 +32,22 @@ enum class PacketDirection : uint8_t {
  HOST_TO_CONTROLLER = 1,
  HOST_TO_CONTROLLER = 1,
};
};


// A Hci Transport that logs all the in and out going
// packets to a stream.
class HciSniffer : public HciTransport {
class HciSniffer : public HciTransport {
 public:
 public:
  HciSniffer(std::shared_ptr<HciTransport> transport)
  HciSniffer(std::shared_ptr<HciTransport> transport,
      : transport_(transport), start_(std::chrono::steady_clock::now()) {}
             std::shared_ptr<std::ostream> outputStream = nullptr);
  ~HciSniffer() = default;
  ~HciSniffer() = default;


  static std::shared_ptr<HciTransport> Create(
  static std::shared_ptr<HciTransport> Create(
      std::shared_ptr<HciTransport> transport) {
      std::shared_ptr<HciTransport> transport,
    return std::make_shared<HciSniffer>(transport);
      std::shared_ptr<std::ostream> outputStream = nullptr) {
    return std::make_shared<HciSniffer>(transport, outputStream);
  }
  }


  void Open(const char* filename);
  // Sets and initializes the output stream
  void SetOutputStream(std::shared_ptr<std::ostream> outputStream);


  void SendEvent(const std::vector<uint8_t>& packet) override;
  void SendEvent(const std::vector<uint8_t>& packet) override;


@@ -65,7 +71,7 @@ class HciSniffer : public HciTransport {
  void AppendRecord(PacketDirection direction, PacketType type,
  void AppendRecord(PacketDirection direction, PacketType type,
                    const std::vector<uint8_t>& packet);
                    const std::vector<uint8_t>& packet);


  std::ofstream output_;
  std::shared_ptr<std::ostream> output_;
  std::shared_ptr<HciTransport> transport_;
  std::shared_ptr<HciTransport> transport_;
  std::chrono::time_point<std::chrono::steady_clock> start_;
  std::chrono::time_point<std::chrono::steady_clock> start_;
};
};