18f3e7eeaSChristopher Kilgour /* -*- c -*- */ 28f3e7eeaSChristopher Kilgour /* 38f3e7eeaSChristopher Kilgour * Copyright 2014 Christopher D. Kilgour techie AT whiterocker.com 48f3e7eeaSChristopher Kilgour * 58f3e7eeaSChristopher Kilgour * This file is part of libbtbb 68f3e7eeaSChristopher Kilgour * 78f3e7eeaSChristopher Kilgour * This program is free software; you can redistribute it and/or modify 88f3e7eeaSChristopher Kilgour * it under the terms of the GNU General Public License as published by 98f3e7eeaSChristopher Kilgour * the Free Software Foundation; either version 2, or (at your option) 108f3e7eeaSChristopher Kilgour * any later version. 118f3e7eeaSChristopher Kilgour * 128f3e7eeaSChristopher Kilgour * This program is distributed in the hope that it will be useful, 138f3e7eeaSChristopher Kilgour * but WITHOUT ANY WARRANTY; without even the implied warranty of 148f3e7eeaSChristopher Kilgour * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 158f3e7eeaSChristopher Kilgour * GNU General Public License for more details. 168f3e7eeaSChristopher Kilgour * 178f3e7eeaSChristopher Kilgour * You should have received a copy of the GNU General Public License 188f3e7eeaSChristopher Kilgour * along with libbtbb; see the file COPYING. If not, write to 198f3e7eeaSChristopher Kilgour * the Free Software Foundation, Inc., 51 Franklin Street, 208f3e7eeaSChristopher Kilgour * Boston, MA 02110-1301, USA. 218f3e7eeaSChristopher Kilgour */ 228f3e7eeaSChristopher Kilgour #ifndef PCAP_COMMON_DOT_H 238f3e7eeaSChristopher Kilgour #define PCAP_COMMON_DOT_H 248f3e7eeaSChristopher Kilgour 258f3e7eeaSChristopher Kilgour /* pull definitions for BT DLTs and pseudoheaders from libpcap, if possible */ 26a3df4d72SDominic Spill #if defined(ENABLE_PCAP) 27*6887217eSMike Ryan // #include <pcap/pcap.h> 28*6887217eSMike Ryan // #include <pcap/bluetooth.h> 29*6887217eSMike Ryan #define DLT_PPI 192 30*6887217eSMike Ryan #define DLT_USER0 147 31a3df4d72SDominic Spill #endif /* ENABLE_PCAP */ 328f3e7eeaSChristopher Kilgour 338f3e7eeaSChristopher Kilgour #if defined( __APPLE__ ) 348f3e7eeaSChristopher Kilgour #include <CoreServices/CoreServices.h> 358f3e7eeaSChristopher Kilgour #define htobe32 EndianU32_NtoB 368f3e7eeaSChristopher Kilgour #define be32toh EndianU32_BtoN 378f3e7eeaSChristopher Kilgour #define le32toh EndianU32_LtoN 388f3e7eeaSChristopher Kilgour #define htobe64 EndianU64_NtoB 398f3e7eeaSChristopher Kilgour #define be64toh EndianU64_BtoN 408f3e7eeaSChristopher Kilgour #define htole16 EndianU16_NtoL 418f3e7eeaSChristopher Kilgour #define htole32 EndianU32_NtoL 428f3e7eeaSChristopher Kilgour #else 438f3e7eeaSChristopher Kilgour #include <endian.h> 448f3e7eeaSChristopher Kilgour #endif 458f3e7eeaSChristopher Kilgour 468f3e7eeaSChristopher Kilgour #if !defined( htole16 ) /* will be defined under Linux when endian.h already included */ 478f3e7eeaSChristopher Kilgour #if defined( __GNUC__ ) 488f3e7eeaSChristopher Kilgour #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 498f3e7eeaSChristopher Kilgour inline uint16_t htole16(uint16_t host_16bits) { return host_16bits; } 508f3e7eeaSChristopher Kilgour inline uint16_t le16toh(uint16_t little_endian_16bits) { return little_endian_16bits; } 518f3e7eeaSChristopher Kilgour inline uint32_t htole32(uint32_t host_32bits) { return host_32bits; } 528f3e7eeaSChristopher Kilgour inline uint32_t le32toh(uint32_t little_endian_32bits) { return little_endian_32bits; } 538f3e7eeaSChristopher Kilgour inline uint64_t htole64(uint64_t host_64bits) { return host_64bits; } 548f3e7eeaSChristopher Kilgour inline uint64_t le64toh(uint64_t little_endian_64bits) { return little_endian_64bits; } 558f3e7eeaSChristopher Kilgour #else 568f3e7eeaSChristopher Kilgour #error "FIXME: need to support big-endian under GNU" 578f3e7eeaSChristopher Kilgour #endif /* __BYTE_ORDER__ */ 588f3e7eeaSChristopher Kilgour #else /* not GNU C */ 598f3e7eeaSChristopher Kilgour #error "FIXME: need to support non-GNU compiler" 608f3e7eeaSChristopher Kilgour #endif /* __GNUC__ */ 618f3e7eeaSChristopher Kilgour #endif /* htole16 */ 628f3e7eeaSChristopher Kilgour 630e05cc66SDominic Spill #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) 640e05cc66SDominic Spill 658f3e7eeaSChristopher Kilgour /* --------------------------------- BR/EDR ----------------------------- */ 668f3e7eeaSChristopher Kilgour 678f3e7eeaSChristopher Kilgour #if !defined( DLT_BLUETOOTH_BREDR_BB ) 688f3e7eeaSChristopher Kilgour #define DLT_BLUETOOTH_BREDR_BB 255 69fa150dd3SDominic Spill #endif 708f3e7eeaSChristopher Kilgour typedef struct __attribute__((packed)) _pcap_bluetooth_bredr_bb_header { 718f3e7eeaSChristopher Kilgour uint8_t rf_channel; 728f3e7eeaSChristopher Kilgour int8_t signal_power; 738f3e7eeaSChristopher Kilgour int8_t noise_power; 748f3e7eeaSChristopher Kilgour uint8_t access_code_offenses; 758f3e7eeaSChristopher Kilgour uint8_t payload_transport_rate; 768f3e7eeaSChristopher Kilgour uint8_t corrected_header_bits; 778f3e7eeaSChristopher Kilgour int16_t corrected_payload_bits; 788f3e7eeaSChristopher Kilgour uint32_t lap; 798f3e7eeaSChristopher Kilgour uint32_t ref_lap_uap; 808f3e7eeaSChristopher Kilgour uint32_t bt_header; 818f3e7eeaSChristopher Kilgour uint16_t flags; 828f3e7eeaSChristopher Kilgour uint8_t br_edr_payload[0]; 838f3e7eeaSChristopher Kilgour } pcap_bluetooth_bredr_bb_header; 848f3e7eeaSChristopher Kilgour 858f3e7eeaSChristopher Kilgour #define BREDR_DEWHITENED 0x0001 868f3e7eeaSChristopher Kilgour #define BREDR_SIGPOWER_VALID 0x0002 878f3e7eeaSChristopher Kilgour #define BREDR_NOISEPOWER_VALID 0x0004 888f3e7eeaSChristopher Kilgour #define BREDR_PAYLOAD_DECRYPTED 0x0008 898f3e7eeaSChristopher Kilgour #define BREDR_REFLAP_VALID 0x0010 908f3e7eeaSChristopher Kilgour #define BREDR_PAYLOAD_PRESENT 0x0020 918f3e7eeaSChristopher Kilgour #define BREDR_CHANNEL_ALIASED 0x0040 928f3e7eeaSChristopher Kilgour #define BREDR_REFUAP_VALID 0x0080 938f3e7eeaSChristopher Kilgour #define BREDR_HEC_CHECKED 0x0100 948f3e7eeaSChristopher Kilgour #define BREDR_HEC_VALID 0x0200 958f3e7eeaSChristopher Kilgour #define BREDR_CRC_CHECKED 0x0400 968f3e7eeaSChristopher Kilgour #define BREDR_CRC_VALID 0x0800 978f3e7eeaSChristopher Kilgour #define BREDR_MIC_CHECKED 0x1000 988f3e7eeaSChristopher Kilgour #define BREDR_MIC_VALID 0x2000 998f3e7eeaSChristopher Kilgour 1000e05cc66SDominic Spill #define BREDR_MAX_PAYLOAD 400 1010e05cc66SDominic Spill 1028f3e7eeaSChristopher Kilgour /* --------------------------------- Low Energy ---------------------------- */ 1038f3e7eeaSChristopher Kilgour 1048f3e7eeaSChristopher Kilgour #if !defined( DLT_BLUETOOTH_LE_LL_WITH_PHDR ) 1058f3e7eeaSChristopher Kilgour #define DLT_BLUETOOTH_LE_LL_WITH_PHDR 256 106fa150dd3SDominic Spill #endif 1078f3e7eeaSChristopher Kilgour typedef struct __attribute__((packed)) _pcap_bluetooth_le_ll_header { 1088f3e7eeaSChristopher Kilgour uint8_t rf_channel; 1098f3e7eeaSChristopher Kilgour int8_t signal_power; 1108f3e7eeaSChristopher Kilgour int8_t noise_power; 1118f3e7eeaSChristopher Kilgour uint8_t access_address_offenses; 1128f3e7eeaSChristopher Kilgour uint32_t ref_access_address; 1138f3e7eeaSChristopher Kilgour uint16_t flags; 1148f3e7eeaSChristopher Kilgour uint8_t le_packet[0]; 1158f3e7eeaSChristopher Kilgour } pcap_bluetooth_le_ll_header; 1168f3e7eeaSChristopher Kilgour 1178f3e7eeaSChristopher Kilgour #define LE_DEWHITENED 0x0001 1188f3e7eeaSChristopher Kilgour #define LE_SIGPOWER_VALID 0x0002 1198f3e7eeaSChristopher Kilgour #define LE_NOISEPOWER_VALID 0x0004 1208f3e7eeaSChristopher Kilgour #define LE_PACKET_DECRYPTED 0x0008 1218f3e7eeaSChristopher Kilgour #define LE_REF_AA_VALID 0x0010 1228f3e7eeaSChristopher Kilgour #define LE_AA_OFFENSES_VALID 0x0020 1238f3e7eeaSChristopher Kilgour #define LE_CHANNEL_ALIASED 0x0040 1248f3e7eeaSChristopher Kilgour #define LE_CRC_CHECKED 0x0400 1258f3e7eeaSChristopher Kilgour #define LE_CRC_VALID 0x0800 1268f3e7eeaSChristopher Kilgour #define LE_MIC_CHECKED 0x1000 1278f3e7eeaSChristopher Kilgour #define LE_MIC_VALID 0x2000 1288f3e7eeaSChristopher Kilgour 1290e05cc66SDominic Spill #define LE_MAX_PAYLOAD 48 1300e05cc66SDominic Spill 1318f3e7eeaSChristopher Kilgour #endif /* PCAP_COMMON_DOT_H */ 132