1e25b118aSDominic Spill /* -*- c -*- */ 2e25b118aSDominic Spill /* 3e25b118aSDominic Spill * Copyright 2007 - 2013 Dominic Spill, Michael Ossmann, Will Code 4e25b118aSDominic Spill * 5e25b118aSDominic Spill * This file is part of libbtbb 6e25b118aSDominic Spill * 7e25b118aSDominic Spill * This program is free software; you can redistribute it and/or modify 8e25b118aSDominic Spill * it under the terms of the GNU General Public License as published by 9e25b118aSDominic Spill * the Free Software Foundation; either version 2, or (at your option) 10e25b118aSDominic Spill * any later version. 11e25b118aSDominic Spill * 12e25b118aSDominic Spill * This program is distributed in the hope that it will be useful, 13e25b118aSDominic Spill * but WITHOUT ANY WARRANTY; without even the implied warranty of 14e25b118aSDominic Spill * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15e25b118aSDominic Spill * GNU General Public License for more details. 16e25b118aSDominic Spill * 17e25b118aSDominic Spill * You should have received a copy of the GNU General Public License 18e25b118aSDominic Spill * along with libbtbb; see the file COPYING. If not, write to 19e25b118aSDominic Spill * the Free Software Foundation, Inc., 51 Franklin Street, 20e25b118aSDominic Spill * Boston, MA 02110-1301, USA. 21e25b118aSDominic Spill */ 22e25b118aSDominic Spill #ifndef INCLUDED_BLUETOOTH_PICONET_H 23e25b118aSDominic Spill #define INCLUDED_BLUETOOTH_PICONET_H 24e25b118aSDominic Spill #include "btbb.h" 25e25b118aSDominic Spill 26e25b118aSDominic Spill /* maximum number of hops to remember */ 27e25b118aSDominic Spill #define MAX_PATTERN_LENGTH 1000 28e25b118aSDominic Spill 29e25b118aSDominic Spill /* number of channels in use */ 30e25b118aSDominic Spill #define BT_NUM_CHANNELS 79 31e25b118aSDominic Spill 321e7f449bSDominic Spill struct btbb_piconet { 33e25b118aSDominic Spill 34e25b118aSDominic Spill uint32_t refcount; 35e25b118aSDominic Spill 36e25b118aSDominic Spill uint32_t flags; 37e25b118aSDominic Spill 38e25b118aSDominic Spill /* true if using a particular aliased receiver implementation */ 39e25b118aSDominic Spill int aliased; 40e25b118aSDominic Spill 41e25b118aSDominic Spill /* AFH channel map - either read or derived from observed packets */ 42e25b118aSDominic Spill uint8_t afh_map[10]; 43e25b118aSDominic Spill 44*f1965e4dSHannes Ellinger /* Number of used channel derived from AFH channel map */ 45*f1965e4dSHannes Ellinger uint8_t used_channels; 46*f1965e4dSHannes Ellinger 47e25b118aSDominic Spill /* lower address part (of master's BD_ADDR) */ 48e25b118aSDominic Spill uint32_t LAP; 49e25b118aSDominic Spill 50e25b118aSDominic Spill /* upper address part (of master's BD_ADDR) */ 51e25b118aSDominic Spill uint8_t UAP; 52e25b118aSDominic Spill 53e25b118aSDominic Spill /* non-significant address part (of master's BD_ADDR) */ 54e25b118aSDominic Spill uint16_t NAP; 55e25b118aSDominic Spill 56e25b118aSDominic Spill /* CLK1-27 candidates */ 57e25b118aSDominic Spill uint32_t *clock_candidates; 58e25b118aSDominic Spill 59e25b118aSDominic Spill /* these values for hop() can be precalculated */ 60e25b118aSDominic Spill int b, e; 61e25b118aSDominic Spill 62e25b118aSDominic Spill /* these values for hop() can be precalculated in part (e.g. a1 is the 63e25b118aSDominic Spill * precalculated part of a) */ 64e25b118aSDominic Spill int a1, c1, d1; 65e25b118aSDominic Spill 66e25b118aSDominic Spill /* frequency register bank */ 67e25b118aSDominic Spill int bank[BT_NUM_CHANNELS]; 68e25b118aSDominic Spill 69e25b118aSDominic Spill /* this holds the entire hopping sequence */ 70e25b118aSDominic Spill char *sequence; 71e25b118aSDominic Spill 72e25b118aSDominic Spill /* number of candidates for CLK1-27 */ 73e25b118aSDominic Spill int num_candidates; 74e25b118aSDominic Spill 75e25b118aSDominic Spill /* number of packets observed during one attempt at UAP/clock discovery */ 76e25b118aSDominic Spill int packets_observed; 77e25b118aSDominic Spill 78e25b118aSDominic Spill /* total number of packets observed */ 79e25b118aSDominic Spill int total_packets_observed; 80e25b118aSDominic Spill 81e25b118aSDominic Spill /* number of observed packets that have been used to winnow the candidates */ 82e25b118aSDominic Spill int winnowed; 83e25b118aSDominic Spill 84e25b118aSDominic Spill /* CLK1-6 candidates */ 85e25b118aSDominic Spill int clock6_candidates[64]; 86e25b118aSDominic Spill 87e25b118aSDominic Spill /* remember patterns of observed hops */ 88e25b118aSDominic Spill int pattern_indices[MAX_PATTERN_LENGTH]; 89e25b118aSDominic Spill uint8_t pattern_channels[MAX_PATTERN_LENGTH]; 90e25b118aSDominic Spill 91e25b118aSDominic Spill /* offset between CLKN (local) and CLK of piconet */ 92e25b118aSDominic Spill int clk_offset; 93e25b118aSDominic Spill 94e25b118aSDominic Spill /* local clock (clkn) at time of first packet */ 95e25b118aSDominic Spill uint32_t first_pkt_time; 96e25b118aSDominic Spill 97e25b118aSDominic Spill /* queue of packets to be decoded */ 98e25b118aSDominic Spill pkt_queue *queue; 991e7f449bSDominic Spill }; 100e25b118aSDominic Spill 101e25b118aSDominic Spill /* number of hops in the hopping sequence (i.e. number of possible values of CLK1-27) */ 102e25b118aSDominic Spill #define SEQUENCE_LENGTH 134217728 103e25b118aSDominic Spill 104e25b118aSDominic Spill /* number of aliased channels received */ 105e25b118aSDominic Spill #define ALIASED_CHANNELS 25 106e25b118aSDominic Spill 107e25b118aSDominic Spill /* do all the precalculation that can be done before knowing the address */ 108e25b118aSDominic Spill void precalc(btbb_piconet *pnet); 109e25b118aSDominic Spill 110e25b118aSDominic Spill /* do precalculation that requires the address */ 111e25b118aSDominic Spill void address_precalc(int address, btbb_piconet *pnet); 112e25b118aSDominic Spill 113e25b118aSDominic Spill /* drop-in replacement for perm5() using lookup table */ 1141e7f449bSDominic Spill int fast_perm(int z, int p_high, int p_low); 115e25b118aSDominic Spill 116e25b118aSDominic Spill /* 5 bit permutation */ 117e25b118aSDominic Spill /* assumes z is constrained to 5 bits, p_high to 5 bits, p_low to 9 bits */ 118e25b118aSDominic Spill int perm5(int z, int p_high, int p_low); 119e25b118aSDominic Spill 120e25b118aSDominic Spill /* determine channel for a particular hop */ 121e25b118aSDominic Spill /* replaced with gen_hops() for a complete sequence but could still come in handy */ 122e25b118aSDominic Spill char single_hop(int clock, btbb_piconet *pnet); 123e25b118aSDominic Spill 124e25b118aSDominic Spill /* look up channel for a particular hop */ 125e25b118aSDominic Spill char hop(int clock, btbb_piconet *pnet); 126e25b118aSDominic Spill 127e25b118aSDominic Spill void try_hop(btbb_packet *pkt, btbb_piconet *pn); 128e25b118aSDominic Spill 129*f1965e4dSHannes Ellinger void get_hop_pattern(btbb_piconet *pn); 130*f1965e4dSHannes Ellinger 131e25b118aSDominic Spill #endif /* INCLUDED_BLUETOOTH_PICONET_H */ 132