1*4a64e381SAndroid Build Coastguard Worker /* 2*4a64e381SAndroid Build Coastguard Worker * Copyright (c) 2017-2018, The OpenThread Authors. 3*4a64e381SAndroid Build Coastguard Worker * All rights reserved. 4*4a64e381SAndroid Build Coastguard Worker * 5*4a64e381SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*4a64e381SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 7*4a64e381SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 8*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 9*4a64e381SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 10*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 11*4a64e381SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 12*4a64e381SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the 13*4a64e381SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products 14*4a64e381SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*4a64e381SAndroid Build Coastguard Worker * 16*4a64e381SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17*4a64e381SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*4a64e381SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*4a64e381SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20*4a64e381SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*4a64e381SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*4a64e381SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*4a64e381SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*4a64e381SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*4a64e381SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*4a64e381SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 27*4a64e381SAndroid Build Coastguard Worker */ 28*4a64e381SAndroid Build Coastguard Worker 29*4a64e381SAndroid Build Coastguard Worker /** 30*4a64e381SAndroid Build Coastguard Worker * @file 31*4a64e381SAndroid Build Coastguard Worker * This file provides commissioner steering data calculations 32*4a64e381SAndroid Build Coastguard Worker */ 33*4a64e381SAndroid Build Coastguard Worker 34*4a64e381SAndroid Build Coastguard Worker #ifndef OTBR_UTILS_STEERING_DATA_HPP_ 35*4a64e381SAndroid Build Coastguard Worker #define OTBR_UTILS_STEERING_DATA_HPP_ 36*4a64e381SAndroid Build Coastguard Worker 37*4a64e381SAndroid Build Coastguard Worker #include "openthread-br/config.h" 38*4a64e381SAndroid Build Coastguard Worker 39*4a64e381SAndroid Build Coastguard Worker #include <stdint.h> 40*4a64e381SAndroid Build Coastguard Worker #include <string.h> 41*4a64e381SAndroid Build Coastguard Worker 42*4a64e381SAndroid Build Coastguard Worker namespace otbr { 43*4a64e381SAndroid Build Coastguard Worker 44*4a64e381SAndroid Build Coastguard Worker /** 45*4a64e381SAndroid Build Coastguard Worker * This class represents Steering Data 46*4a64e381SAndroid Build Coastguard Worker */ 47*4a64e381SAndroid Build Coastguard Worker class SteeringData 48*4a64e381SAndroid Build Coastguard Worker { 49*4a64e381SAndroid Build Coastguard Worker public: 50*4a64e381SAndroid Build Coastguard Worker enum 51*4a64e381SAndroid Build Coastguard Worker { 52*4a64e381SAndroid Build Coastguard Worker kMaxSizeOfBloomFilter = 16, ///< Max length of bloom filter in bytes. 53*4a64e381SAndroid Build Coastguard Worker kSizeJoinerId = 8, ///< Size of Extended Joiner ID. 54*4a64e381SAndroid Build Coastguard Worker }; 55*4a64e381SAndroid Build Coastguard Worker 56*4a64e381SAndroid Build Coastguard Worker /** 57*4a64e381SAndroid Build Coastguard Worker * This method initializes the bloom filter. 58*4a64e381SAndroid Build Coastguard Worker * 59*4a64e381SAndroid Build Coastguard Worker * @param[in] aLength The length of the bloom filter in bytes. 60*4a64e381SAndroid Build Coastguard Worker */ 61*4a64e381SAndroid Build Coastguard Worker void Init(uint8_t aLength); 62*4a64e381SAndroid Build Coastguard Worker 63*4a64e381SAndroid Build Coastguard Worker /** 64*4a64e381SAndroid Build Coastguard Worker * This method sets all bits in the bloom filter to zero. 65*4a64e381SAndroid Build Coastguard Worker */ Clear(void)66*4a64e381SAndroid Build Coastguard Worker void Clear(void) { memset(mBloomFilter, 0, sizeof(mBloomFilter)); } 67*4a64e381SAndroid Build Coastguard Worker 68*4a64e381SAndroid Build Coastguard Worker /** 69*4a64e381SAndroid Build Coastguard Worker * Ths method sets all bits in the bloom filter to one. 70*4a64e381SAndroid Build Coastguard Worker */ Set(void)71*4a64e381SAndroid Build Coastguard Worker void Set(void) { memset(mBloomFilter, 0xff, sizeof(mBloomFilter)); } 72*4a64e381SAndroid Build Coastguard Worker 73*4a64e381SAndroid Build Coastguard Worker /** 74*4a64e381SAndroid Build Coastguard Worker * This method sets bit @p aBit. 75*4a64e381SAndroid Build Coastguard Worker * 76*4a64e381SAndroid Build Coastguard Worker * @param[in] aBit The bit offset. 77*4a64e381SAndroid Build Coastguard Worker */ SetBit(uint8_t aBit)78*4a64e381SAndroid Build Coastguard Worker void SetBit(uint8_t aBit) { mBloomFilter[mLength - 1 - (aBit / 8)] |= 1 << (aBit % 8); } 79*4a64e381SAndroid Build Coastguard Worker 80*4a64e381SAndroid Build Coastguard Worker /** 81*4a64e381SAndroid Build Coastguard Worker * This method computes the Bloom Filter. 82*4a64e381SAndroid Build Coastguard Worker * 83*4a64e381SAndroid Build Coastguard Worker * @param[in] aJoinerId Extended address 84*4a64e381SAndroid Build Coastguard Worker */ 85*4a64e381SAndroid Build Coastguard Worker void ComputeBloomFilter(const uint8_t *aJoinerId); 86*4a64e381SAndroid Build Coastguard Worker 87*4a64e381SAndroid Build Coastguard Worker /** 88*4a64e381SAndroid Build Coastguard Worker * This method computes joiner id from EUI64. 89*4a64e381SAndroid Build Coastguard Worker * 90*4a64e381SAndroid Build Coastguard Worker * @param[in] aEui64 A pointer to EUI64. 91*4a64e381SAndroid Build Coastguard Worker * @param[out] aJoinerId A pointer to receive joiner id. This pointer can be the same as @p aEui64. 92*4a64e381SAndroid Build Coastguard Worker */ 93*4a64e381SAndroid Build Coastguard Worker static void ComputeJoinerId(const uint8_t *aEui64, uint8_t *aJoinerId); 94*4a64e381SAndroid Build Coastguard Worker 95*4a64e381SAndroid Build Coastguard Worker /** 96*4a64e381SAndroid Build Coastguard Worker * This method returns a pointer to the bloom filter. 97*4a64e381SAndroid Build Coastguard Worker * 98*4a64e381SAndroid Build Coastguard Worker * @returns A pointer to the computed bloom filter. 99*4a64e381SAndroid Build Coastguard Worker */ GetBloomFilter(void) const100*4a64e381SAndroid Build Coastguard Worker const uint8_t *GetBloomFilter(void) const { return mBloomFilter; } 101*4a64e381SAndroid Build Coastguard Worker 102*4a64e381SAndroid Build Coastguard Worker /** 103*4a64e381SAndroid Build Coastguard Worker * This method returns the length of the bloom filter. 104*4a64e381SAndroid Build Coastguard Worker */ GetLength(void) const105*4a64e381SAndroid Build Coastguard Worker uint8_t GetLength(void) const { return mLength; } 106*4a64e381SAndroid Build Coastguard Worker 107*4a64e381SAndroid Build Coastguard Worker private: 108*4a64e381SAndroid Build Coastguard Worker uint8_t mBloomFilter[kMaxSizeOfBloomFilter]; 109*4a64e381SAndroid Build Coastguard Worker uint8_t mLength; 110*4a64e381SAndroid Build Coastguard Worker }; 111*4a64e381SAndroid Build Coastguard Worker 112*4a64e381SAndroid Build Coastguard Worker } /* namespace otbr */ 113*4a64e381SAndroid Build Coastguard Worker 114*4a64e381SAndroid Build Coastguard Worker #endif // OTBR_UTILS_STEERING_DATA_HPP_ 115