xref: /libbtbb/lib/src/pcap-common.h (revision 6887217ed018f03f055bea4de69184c36643b69f)
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