Lines Matching refs:pn
44 btbb_piconet *pn = (btbb_piconet *)calloc(1, sizeof(btbb_piconet)); in btbb_piconet_new() local
45 pn->refcount = 1; in btbb_piconet_new()
46 return pn; in btbb_piconet_new()
50 btbb_piconet_ref(btbb_piconet *pn) in btbb_piconet_ref() argument
52 pn->refcount++; in btbb_piconet_ref()
56 btbb_piconet_unref(btbb_piconet *pn) in btbb_piconet_unref() argument
58 pn->refcount--; in btbb_piconet_unref()
59 if (pn->refcount == 0) in btbb_piconet_unref()
60 free(pn); in btbb_piconet_unref()
70 void btbb_init_piconet(btbb_piconet *pn, uint32_t lap) in btbb_init_piconet() argument
72 pn->LAP = lap; in btbb_init_piconet()
73 btbb_piconet_set_flag(pn, BTBB_LAP_VALID, 1); in btbb_init_piconet()
76 void btbb_piconet_set_flag(btbb_piconet *pn, int flag, int val) in btbb_piconet_set_flag() argument
79 pn->flags &= ~mask; in btbb_piconet_set_flag()
81 pn->flags |= mask; in btbb_piconet_set_flag()
84 int btbb_piconet_get_flag(const btbb_piconet *pn, const int flag) in btbb_piconet_get_flag() argument
87 return ((pn->flags & mask) != 0); in btbb_piconet_get_flag()
90 void btbb_piconet_set_uap(btbb_piconet *pn, uint8_t uap) in btbb_piconet_set_uap() argument
92 pn->UAP = uap; in btbb_piconet_set_uap()
93 btbb_piconet_set_flag(pn, BTBB_UAP_VALID, 1); in btbb_piconet_set_uap()
96 uint8_t btbb_piconet_get_uap(const btbb_piconet *pn) in btbb_piconet_get_uap() argument
98 return pn->UAP; in btbb_piconet_get_uap()
101 uint32_t btbb_piconet_get_lap(const btbb_piconet *pn) in btbb_piconet_get_lap() argument
103 return pn->LAP; in btbb_piconet_get_lap()
106 uint16_t btbb_piconet_get_nap(const btbb_piconet *pn) in btbb_piconet_get_nap() argument
108 return pn->NAP; in btbb_piconet_get_nap()
111 uint64_t btbb_piconet_get_bdaddr(const btbb_piconet *pn) in btbb_piconet_get_bdaddr() argument
113 return ((uint64_t) pn->NAP) << 32 | ((uint32_t) pn->UAP) << 24 | pn->LAP; in btbb_piconet_get_bdaddr()
116 int btbb_piconet_get_clk_offset(const btbb_piconet *pn) in btbb_piconet_get_clk_offset() argument
118 return pn->clk_offset; in btbb_piconet_get_clk_offset()
121 void btbb_piconet_set_clk_offset(btbb_piconet *pn, int clk_offset) in btbb_piconet_set_clk_offset() argument
123 pn->clk_offset = clk_offset; in btbb_piconet_set_clk_offset()
126 void btbb_piconet_set_afh_map(btbb_piconet *pn, uint8_t *afh_map) { in btbb_piconet_set_afh_map() argument
128 pn->used_channels = 0; in btbb_piconet_set_afh_map()
131 pn->afh_map[i] = afh_map[i]; in btbb_piconet_set_afh_map()
132 pn->used_channels += count_bits(pn->afh_map[i]); in btbb_piconet_set_afh_map()
134 if(btbb_piconet_get_flag(pn, BTBB_UAP_VALID)) in btbb_piconet_set_afh_map()
135 get_hop_pattern(pn); in btbb_piconet_set_afh_map()
138 uint8_t *btbb_piconet_get_afh_map(btbb_piconet *pn) { in btbb_piconet_get_afh_map() argument
139 return pn->afh_map; in btbb_piconet_get_afh_map()
142 uint8_t btbb_piconet_set_channel_seen(btbb_piconet *pn, uint8_t channel) in btbb_piconet_set_channel_seen() argument
144 if(!(pn->afh_map[channel/8] & 0x1 << (channel % 8))) { in btbb_piconet_set_channel_seen()
145 pn->afh_map[channel/8] |= 0x1 << (channel % 8); in btbb_piconet_set_channel_seen()
146 pn->used_channels++; in btbb_piconet_set_channel_seen()
152 uint8_t btbb_piconet_clear_channel_seen(btbb_piconet *pn, uint8_t channel) in btbb_piconet_clear_channel_seen() argument
154 if((pn->afh_map[channel/8] & 0x1 << (channel % 8))) { in btbb_piconet_clear_channel_seen()
155 pn->afh_map[channel/8] &= ~(0x1 << (channel % 8)); in btbb_piconet_clear_channel_seen()
156 pn->used_channels--; in btbb_piconet_clear_channel_seen()
162 uint8_t btbb_piconet_get_channel_seen(btbb_piconet *pn, uint8_t channel) in btbb_piconet_get_channel_seen() argument
165 return ( pn->afh_map[channel/8] & (1 << (channel % 8)) ) != 0; in btbb_piconet_get_channel_seen()
171 void precalc(btbb_piconet *pn) in precalc() argument
181 if(btbb_piconet_get_flag(pn, BTBB_IS_AFH)) { in precalc()
183 if(btbb_piconet_get_channel_seen(pn, chan)) in precalc()
184 pn->bank[j++] = chan; in precalc()
189 pn->bank[i] = ((i * 2) % BT_NUM_CHANNELS); in precalc()
197 void address_precalc(int address, btbb_piconet *pn) in address_precalc() argument
200 pn->a1 = (address >> 23) & 0x1f; in address_precalc()
201 pn->b = (address >> 19) & 0x0f; in address_precalc()
202 pn->c1 = ((address >> 4) & 0x10) + in address_precalc()
207 pn->d1 = (address >> 10) & 0x1ff; in address_precalc()
208 pn->e = ((address >> 7) & 0x40) + in address_precalc()
311 static void gen_hops(btbb_piconet *pn) in gen_hops() argument
330 a = pn->a1 ^ i; in gen_hops()
332 c = pn->c1 ^ j; in gen_hops()
335 d = pn->d1 ^ k; in gen_hops()
337 perm_in = ((x + a) % 32) ^ pn->b; in gen_hops()
341 if (btbb_piconet_get_flag(pn, BTBB_IS_AFH)) in gen_hops()
342 pn->sequence[index] = pn->bank[(perm_out + pn->e + f_dash) % pn->used_channels]; in gen_hops()
344 pn->sequence[index] = pn->bank[(perm_out + pn->e + f) % BT_NUM_CHANNELS]; in gen_hops()
348 if (btbb_piconet_get_flag(pn, BTBB_IS_AFH)) in gen_hops()
349 pn->sequence[index + 1] = pn->bank[(perm_out + pn->e + f_dash + 32) % pn->used_channels]; in gen_hops()
351 pn->sequence[index + 1] = pn->bank[(perm_out + pn->e + f + 32) % BT_NUM_CHANNELS]; in gen_hops()
357 f_dash = f % pn->used_channels; in gen_hops()
365 void gen_hop_pattern(btbb_piconet *pn) in gen_hop_pattern() argument
369 pn->sequence = (char*) malloc(SEQUENCE_LENGTH); in gen_hop_pattern()
371 precalc(pn); in gen_hop_pattern()
372 address_precalc(((pn->UAP<<24) | pn->LAP) & 0xfffffff, pn); in gen_hop_pattern()
373 gen_hops(pn); in gen_hop_pattern()
388 void get_hop_pattern(btbb_piconet *pn) in get_hop_pattern() argument
394 key = btbb_piconet_get_flag(pn, BTBB_IS_AFH); in get_hop_pattern()
395 key = (key<<39) | ((uint64_t)pn->used_channels<<32) | ((uint32_t)pn->UAP<<24) | pn->LAP; in get_hop_pattern()
399 gen_hop_pattern(pn); in get_hop_pattern()
402 s->sequence = pn->sequence; in get_hop_pattern()
406 pn->sequence = s->sequence; in get_hop_pattern()
412 char single_hop(int clock, btbb_piconet *pn) in single_hop() argument
421 a = (pn->a1 ^ (clock >> 21)) & 0x1f; in single_hop()
423 c = (pn->c1 ^ (clock >> 16)) & 0x1f; in single_hop()
424 d = (pn->d1 ^ (clock >> 7)) & 0x1ff; in single_hop()
430 ((x + a) % 32) ^ pn->b, in single_hop()
434 if(btbb_piconet_get_flag(pn, BTBB_IS_AFH)) { in single_hop()
435 f_dash = base_f % pn->used_channels; in single_hop()
436 next_channel = pn->bank[(perm + pn->e + f_dash + y2) % pn->used_channels]; in single_hop()
438 next_channel = pn->bank[(perm + pn->e + f + y2) % BT_NUM_CHANNELS]; in single_hop()
444 char hop(int clock, btbb_piconet *pn) in hop() argument
446 return pn->sequence[clock]; in hop()
455 static int init_candidates(char channel, int known_clock_bits, btbb_piconet *pn) in init_candidates() argument
463 if (pn->aliased) in init_candidates()
464 observable_channel = aliased_channel(pn->sequence[i]); in init_candidates()
466 observable_channel = pn->sequence[i]; in init_candidates()
468 pn->clock_candidates[count++] = i; in init_candidates()
475 int btbb_init_hop_reversal(int aliased, btbb_piconet *pn) in btbb_init_hop_reversal() argument
480 get_hop_pattern(pn); in btbb_init_hop_reversal()
487 pn->clock_candidates = (uint32_t*) malloc(sizeof(uint32_t) * max_candidates); in btbb_init_hop_reversal()
489 clock = (pn->clk_offset + pn->first_pkt_time) & 0x3f; in btbb_init_hop_reversal()
490 pn->num_candidates = init_candidates(pn->pattern_channels[0], clock, pn); in btbb_init_hop_reversal()
491 pn->winnowed = 0; in btbb_init_hop_reversal()
492 btbb_piconet_set_flag(pn, BTBB_HOP_REVERSAL_INIT, 1); in btbb_init_hop_reversal()
493 btbb_piconet_set_flag(pn, BTBB_CLK27_VALID, 0); in btbb_init_hop_reversal()
494 btbb_piconet_set_flag(pn, BTBB_IS_ALIASED, aliased); in btbb_init_hop_reversal()
496 printf("%d initial CLK1-27 candidates\n", pn->num_candidates); in btbb_init_hop_reversal()
498 return pn->num_candidates; in btbb_init_hop_reversal()
501 void try_hop(btbb_packet *pkt, btbb_piconet *pn) in try_hop() argument
503 uint8_t filter_uap = pn->UAP; in try_hop()
508 if (btbb_piconet_get_flag(pn, BTBB_HOP_REVERSAL_INIT)) { in try_hop()
510 pn->pattern_indices[pn->packets_observed] = in try_hop()
511 pkt->clkn - pn->first_pkt_time; in try_hop()
512 pn->pattern_channels[pn->packets_observed] = pkt->channel; in try_hop()
513 pn->packets_observed++; in try_hop()
514 pn->total_packets_observed++; in try_hop()
515 btbb_winnow(pn); in try_hop()
516 if (btbb_piconet_get_flag(pn, BTBB_CLK27_VALID)) { in try_hop()
518 printf("clock offset = %d.\n", pn->clk_offset); in try_hop()
521 if (btbb_piconet_get_flag(pn, BTBB_CLK6_VALID)) { in try_hop()
522 btbb_uap_from_header(pkt, pn); in try_hop()
523 if (btbb_piconet_get_flag(pn, BTBB_CLK27_VALID)) { in try_hop()
525 printf("clock offset = %d.\n", pn->clk_offset); in try_hop()
528 if (btbb_uap_from_header(pkt, pn)) { in try_hop()
529 if (filter_uap == pn->UAP) { in try_hop()
530 btbb_init_hop_reversal(0, pn); in try_hop()
531 btbb_winnow(pn); in try_hop()
539 if(!btbb_piconet_get_flag(pn, BTBB_UAP_VALID)) { in try_hop()
540 btbb_piconet_set_flag(pn, BTBB_UAP_VALID, 1); in try_hop()
541 pn->UAP = filter_uap; in try_hop()
547 static void reset(btbb_piconet *pn) in reset() argument
551 if(btbb_piconet_get_flag(pn, BTBB_HOP_REVERSAL_INIT)) { in reset()
552 free(pn->clock_candidates); in reset()
553 pn->sequence = NULL; in reset()
555 btbb_piconet_set_flag(pn, BTBB_GOT_FIRST_PACKET, 0); in reset()
556 btbb_piconet_set_flag(pn, BTBB_HOP_REVERSAL_INIT, 0); in reset()
557 btbb_piconet_set_flag(pn, BTBB_UAP_VALID, 0); in reset()
558 btbb_piconet_set_flag(pn, BTBB_CLK6_VALID, 0); in reset()
559 btbb_piconet_set_flag(pn, BTBB_CLK27_VALID, 0); in reset()
560 pn->packets_observed = 0; in reset()
566 btbb_piconet_set_flag(pn, BTBB_IS_AFH, in reset()
567 btbb_piconet_get_flag(pn, BTBB_LOOKS_LIKE_AFH)); in reset()
575 static int channel_winnow(int offset, char channel, btbb_piconet *pn) in channel_winnow() argument
582 for (i = 0; i < pn->num_candidates; i++) { in channel_winnow()
583 if (pn->aliased) in channel_winnow()
584 …observable_channel = aliased_channel(pn->sequence[(pn->clock_candidates[i] + offset) % SEQUENCE_LE… in channel_winnow()
586 observable_channel = pn->sequence[(pn->clock_candidates[i] + offset) % SEQUENCE_LENGTH]; in channel_winnow()
591 pn->clock_candidates[new_count++] = pn->clock_candidates[i]; in channel_winnow()
594 pn->num_candidates = new_count; in channel_winnow()
598 pn->clk_offset = ((pn->clock_candidates[0]<<1) - (pn->first_pkt_time<<1)); in channel_winnow()
599 printf("\nAcquired CLK1-27 = 0x%07x\n", pn->clock_candidates[0]); in channel_winnow()
600 btbb_piconet_set_flag(pn, BTBB_CLK27_VALID, 1); in channel_winnow()
603 reset(pn); in channel_winnow()
613 int btbb_winnow(btbb_piconet *pn) in btbb_winnow() argument
615 int new_count = pn->num_candidates; in btbb_winnow()
619 for (; pn->winnowed < pn->packets_observed; pn->winnowed++) { in btbb_winnow()
620 index = pn->pattern_indices[pn->winnowed]; in btbb_winnow()
621 channel = pn->pattern_channels[pn->winnowed]; in btbb_winnow()
622 new_count = channel_winnow(index, channel, pn); in btbb_winnow()
626 if (pn->packets_observed > 0) { in btbb_winnow()
627 last_index = pn->pattern_indices[pn->winnowed - 1]; in btbb_winnow()
628 last_channel = pn->pattern_channels[pn->winnowed - 1]; in btbb_winnow()
635 if (!btbb_piconet_get_flag(pn, BTBB_LOOKS_LIKE_AFH) in btbb_winnow()
638 btbb_piconet_set_flag(pn, BTBB_LOOKS_LIKE_AFH, 1); in btbb_winnow()
648 int btbb_uap_from_header(btbb_packet *pkt, btbb_piconet *pn) in btbb_uap_from_header() argument
657 if (!btbb_piconet_get_flag(pn, BTBB_GOT_FIRST_PACKET)) in btbb_uap_from_header()
658 pn->first_pkt_time = clkn; in btbb_uap_from_header()
661 btbb_piconet_set_channel_seen(pn, pkt->channel); in btbb_uap_from_header()
663 if (pn->packets_observed < MAX_PATTERN_LENGTH) { in btbb_uap_from_header()
664 pn->pattern_indices[pn->packets_observed] = clkn - pn->first_pkt_time; in btbb_uap_from_header()
665 pn->pattern_channels[pn->packets_observed] = pkt->channel; in btbb_uap_from_header()
668 reset(pn); in btbb_uap_from_header()
671 pn->packets_observed++; in btbb_uap_from_header()
672 pn->total_packets_observed++; in btbb_uap_from_header()
677 if (pn->clock6_candidates[count] > -1 in btbb_uap_from_header()
678 || !btbb_piconet_get_flag(pn, BTBB_GOT_FIRST_PACKET)) { in btbb_uap_from_header()
680 int clock = (count + clkn - pn->first_pkt_time) % 64; in btbb_uap_from_header()
687 if (!btbb_piconet_get_flag(pn, BTBB_GOT_FIRST_PACKET) in btbb_uap_from_header()
688 || UAP == pn->clock6_candidates[count]) in btbb_uap_from_header()
691 if (btbb_piconet_get_flag(pn, BTBB_UAP_VALID) && in btbb_uap_from_header()
692 (UAP != pn->UAP)) in btbb_uap_from_header()
698 pn->clock6_candidates[count] = -1; in btbb_uap_from_header()
703 pn->clock6_candidates[count] = UAP; in btbb_uap_from_header()
710 pn->clk_offset = (count - (pn->first_pkt_time & 0x3f)) & 0x3f; in btbb_uap_from_header()
711 if (!btbb_piconet_get_flag(pn, BTBB_UAP_VALID)) in btbb_uap_from_header()
713 UAP, pn->total_packets_observed); in btbb_uap_from_header()
716 pn->clk_offset, pn->total_packets_observed); in btbb_uap_from_header()
717 pn->UAP = UAP; in btbb_uap_from_header()
718 btbb_piconet_set_flag(pn, BTBB_CLK6_VALID, 1); in btbb_uap_from_header()
719 btbb_piconet_set_flag(pn, BTBB_UAP_VALID, 1); in btbb_uap_from_header()
720 pn->total_packets_observed = 0; in btbb_uap_from_header()
726 btbb_piconet_set_flag(pn, BTBB_GOT_FIRST_PACKET, 1); in btbb_uap_from_header()
731 pn->clk_offset = (first_clock - (pn->first_pkt_time & 0x3f)) & 0x3f; in btbb_uap_from_header()
732 if (!btbb_piconet_get_flag(pn, BTBB_UAP_VALID)) in btbb_uap_from_header()
734 pn->clock6_candidates[first_clock], pn->total_packets_observed); in btbb_uap_from_header()
737 pn->clk_offset, pn->total_packets_observed); in btbb_uap_from_header()
738 pn->UAP = pn->clock6_candidates[first_clock]; in btbb_uap_from_header()
739 btbb_piconet_set_flag(pn, BTBB_CLK6_VALID, 1); in btbb_uap_from_header()
740 btbb_piconet_set_flag(pn, BTBB_UAP_VALID, 1); in btbb_uap_from_header()
741 pn->total_packets_observed = 0; in btbb_uap_from_header()
746 reset(pn); in btbb_uap_from_header()
792 void btbb_print_afh_map(btbb_piconet *pn) { in btbb_print_afh_map() argument
794 afh_map = pn->afh_map; in btbb_print_afh_map()
810 btbb_piconet *pn; member
820 btbb_piconet *pn; in get_piconet() local
824 pn = btbb_piconet_new(); in get_piconet()
825 btbb_init_piconet(pn, lap); in get_piconet()
829 s->pn = pn; in get_piconet()
832 pn = s->pn; in get_piconet()
834 return pn; in get_piconet()
839 btbb_piconet *pn = NULL; in btbb_next_survey_result() local
843 pn = piconet_survey->pn; in btbb_next_survey_result()
848 return pn; in btbb_next_survey_result()
851 int btbb_process_packet(btbb_packet *pkt, btbb_piconet *pn) { in btbb_process_packet() argument
853 pn = get_piconet(btbb_packet_get_lap(pkt)); in btbb_process_packet()
854 btbb_piconet_set_channel_seen(pn, pkt->channel); in btbb_process_packet()
855 if(btbb_header_present(pkt) && !btbb_piconet_get_flag(pn, BTBB_UAP_VALID)) in btbb_process_packet()
856 btbb_uap_from_header(pkt, pn); in btbb_process_packet()
860 if(pn) in btbb_process_packet()
861 btbb_piconet_set_channel_seen(pn, pkt->channel); in btbb_process_packet()
868 if (pn && btbb_piconet_get_flag(pn, BTBB_LAP_VALID) && in btbb_process_packet()
872 if (btbb_piconet_get_flag(pn, BTBB_FOLLOWING)) { in btbb_process_packet()
873 btbb_packet_set_uap(pkt, btbb_piconet_get_uap(pn)); in btbb_process_packet()
884 else if (btbb_piconet_get_uap(pn)) { in btbb_process_packet()
885 try_hop(pkt, pn); in btbb_process_packet()
886 if (btbb_piconet_get_flag(pn, BTBB_CLK6_VALID) && in btbb_process_packet()
887 btbb_piconet_get_flag(pn, BTBB_CLK27_VALID)) { in btbb_process_packet()
888 btbb_piconet_set_flag(pn, BTBB_FOLLOWING, 1); in btbb_process_packet()
895 btbb_uap_from_header(pkt, pn); in btbb_process_packet()