device: Set disconnect timer to zero for fast disconnection
[platform/upstream/bluez.git] / monitor / crc.c
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 /*
3  *
4  *  BlueZ - Bluetooth protocol stack for Linux
5  *
6  *  Copyright (C) 2011-2014  Intel Corporation
7  *  Copyright (C) 2002-2010  Marcel Holtmann <marcel@holtmann.org>
8  *
9  *
10  */
11
12 #ifdef HAVE_CONFIG_H
13 #include <config.h>
14 #endif
15
16 #include "crc.h"
17
18 uint32_t crc24_bit_reverse(uint32_t value)
19 {
20         uint32_t result = 0;
21         uint8_t i;
22
23         for (i = 0; i < 24; i++)
24                 result |= ((value >> i) & 1) << (23 - i);
25
26         return result;
27 }
28
29 uint32_t crc24_calculate(uint32_t preset, const uint8_t *data, uint8_t len)
30 {
31         uint32_t state = preset;
32         uint8_t i;
33
34         for (i = 0; i < len; i++) {
35                 uint8_t n, cur = data[i];
36
37                 for (n = 0; n < 8; n++) {
38                         int next_bit = (state ^ cur) & 1;
39
40                         cur >>= 1;
41                         state >>= 1;
42                         if (next_bit) {
43                                 state |= 1 << 23;
44                                 state ^= 0x5a6000;
45                         }
46                 }
47         }
48
49         return state;
50 }
51
52 uint32_t crc24_reverse(uint32_t crc, const uint8_t *data, uint8_t len)
53 {
54         uint32_t state = crc;
55         uint8_t i;
56
57         for (i = 0; i < len; i++) {
58                 uint8_t n, cur = data[len - i - 1];
59
60                 for (n = 0; n < 8; n++) {
61                         int top_bit = state >> 23;
62
63                         state = (state << 1) & 0xffffff;
64                         state |= top_bit ^ ((cur >> (7 - n)) & 1);
65                         if (top_bit)
66                                 state ^= 0xb4c000;
67                 }
68         }
69
70         return state;
71 }