Blueotooth: SnoopLogger

std::ofstream btsnoop_ostream_;
snoop_log_path_ = "./btsnoop_hci.log";
btsnoop_ostream.open(snoop_log_path_, std::ios::binary | std::ios::out);


struct FileHeaderType {
  uint8_t identification_pattern[8];
  uint32_t version_number;
  uint32_t datalink_type;
} __attribute__((__packed__));

bool isLittleEndian = false;
constexpr FileHeaderType kBtSnoopFileHeader = {
    .identification_pattern = {'b', 't', 's', 'n', 'o', 'o', 'p', 0x00},
    .version_number = isLittleEndian ? 0x01000000 : 1,
    .datalink_type = isLittleEndian ? 0xea030000 : 0x03ea
};
btsnoop_ostream_.write(reinterpret_cast<const char*>(&kBtSnoopFileHeader), sizeof(FileHeaderType));
btsnoop_ostream_.flush();


enum PacketType {
  CMD = 1,
  ACL = 2,
  SCO = 3,
  EVT = 4,
  ISO = 5,
};
struct PacketHeaderType {
  uint32_t length_original;
  uint32_t length_captured;
  uint32_t flags;
  uint32_t dropped_packets;
  uint64_t timestamp;
  uint8_t type;
} __attribute__((__packed__));
enum Direction {
  INCOMING,
  OUTGOING,
};
using HciPacket = std::vector<uint8_t>;

void Capture(const HciPacket& packet, Direction direction, PacketType type) {
  // Epoch in microseconds since 01/01/0000.
  constexpr uint64_t kBtSnoopEpochDelta = 0x00dcddb30f2f8000ULL;
  uint64_t timestamp_us = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();

  std::bitset<32> flags = 0;
  switch (type) {
    case PacketType::CMD:
      flags.set(0, false);
      flags.set(1, true);
      break;
    case PacketType::ACL:
    case PacketType::ISO:
    case PacketType::SCO:
      flags.set(0, direction == Direction::INCOMING);
      flags.set(1, false);
      break;
    case PacketType::EVT:
      flags.set(0, true);
      flags.set(1, true);
      break;
  }
  uint32_t length = packet.size() + /* type byte */ 1;

  PacketHeaderType header = {.length_original = htonl(length),
                             .length_captured = htonl(length),
                             .flags = htonl(static_cast<uint32_t>(flags.to_ulong())),
                             .dropped_packets = 0,
                             .timestamp = htonll(timestamp_us + kBtSnoopEpochDelta),
                             .type = static_cast<uint8_t>(type)};
  {
    btsnoop_ostream_.write(reinterpret_cast<const char*>(&header), sizeof(PacketHeaderType));
    btsnoop_ostream_.write(reinterpret_cast<const char*>(packet.data()), packet.size());
    btsnoop_ostream_.flush();
  }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值