3 * Copyright (c) 2020 Project CHIP Authors
4 * Copyright (c) 2019 Google LLC.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * Definitions for chip BLE service advertisement data.
26 #include <core/CHIPEncoding.h>
32 * chip data block types that may appear with chip BLE service advertisement data.
34 enum chipBLEServiceDataType
36 kchipBLEServiceDataType_DeviceIdentificationInfo = 0x01,
37 kchipBLEServiceDataType_TokenIdentificationInfo = 0x02,
41 * chip BLE Device Identification Information Block
43 * Defines the over-the-air encoded format of the device identification information block that appears
44 * within chip BLE service advertisement data.
46 struct ChipBLEDeviceIdentificationInfo
48 constexpr static uint16_t kDiscriminatorMask = 0xfff;
51 uint8_t DeviceDiscriminator[2];
52 uint8_t DeviceVendorId[2];
53 uint8_t DeviceProductId[2];
55 void Init() { memset(this, 0, sizeof(*this)); }
57 uint16_t GetVendorId() const { return chip::Encoding::LittleEndian::Get16(DeviceVendorId); }
59 void SetVendorId(uint16_t vendorId) { chip::Encoding::LittleEndian::Put16(DeviceVendorId, vendorId); }
61 uint16_t GetProductId() const { return chip::Encoding::LittleEndian::Get16(DeviceProductId); }
63 void SetProductId(uint16_t productId) { chip::Encoding::LittleEndian::Put16(DeviceProductId, productId); }
65 uint16_t GetDeviceDiscriminator() const
67 return chip::Encoding::LittleEndian::Get16(DeviceDiscriminator) & kDiscriminatorMask;
70 void SetDeviceDiscriminator(uint16_t deviceDiscriminator)
72 // Discriminator is 12-bit long, so don't overwrite bits 12th through 15th
73 deviceDiscriminator &= kDiscriminatorMask;
74 deviceDiscriminator |= static_cast<uint16_t>(DeviceDiscriminator[1] << 8u & ~kDiscriminatorMask);
75 chip::Encoding::LittleEndian::Put16(DeviceDiscriminator, deviceDiscriminator);
77 } __attribute__((packed));
80 } /* namespace chip */