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();
}
}
Blueotooth: SnoopLogger
最新推荐文章于 2024-08-23 21:39:27 发布