Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(535)

Side by Side Diff: components/proximity_auth/ble/bluetooth_low_energy_weave_packet_generator.cc

Issue 2031953003: Weave Packet Generator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: changed magic numbers to enums Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_genera tor.h"
6
7 #include <string.h>
8
9 #include <algorithm>
10
11 #include "base/logging.h"
12
13 namespace proximity_auth {
14
15 BluetoothLowEnergyWeavePacketGenerator::Factory*
16 BluetoothLowEnergyWeavePacketGenerator::Factory::factory_instance_ = NULL;
Kyle Horimoto 2016/06/08 00:06:29 Initialize to nullptr.
jingxuy 2016/06/08 21:30:36 Done.
17
18 std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator>
19 BluetoothLowEnergyWeavePacketGenerator::Factory::NewInstance() {
20 if (!factory_instance_) {
Kyle Horimoto 2016/06/08 00:06:30 Check for equality with nullptr.
jingxuy 2016/06/08 21:30:36 Done.
21 factory_instance_ = new Factory();
22 }
23 return std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator>(
24 factory_instance_->BuildInstance());
25 }
26
27 void BluetoothLowEnergyWeavePacketGenerator::Factory::SetInstanceForTesting(
28 Factory* factory) {
29 factory_instance_ = factory;
30 }
31
32 BluetoothLowEnergyWeavePacketGenerator*
33 BluetoothLowEnergyWeavePacketGenerator::Factory::BuildInstance() {
34 return new BluetoothLowEnergyWeavePacketGenerator();
35 }
36
37 BluetoothLowEnergyWeavePacketGenerator::BluetoothLowEnergyWeavePacketGenerator()
38 : packet_size_(kDefaultDataPacketSize), packet_number_(0) {}
39
40 std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator::Packet>
41 BluetoothLowEnergyWeavePacketGenerator::CreateConnectionRequest() {
42 Packet* packet = CreateControlPacket();
43
44 SetControlCmd(packet, ControlPacketCommand::REQUEST);
45 SetIntField(packet, 1, kMinSupportedWeaveVersion);
46 SetIntField(packet, 3, kMaxSupportedWeaveVersion);
47 SetIntField(packet, 5, kMaxSupportedPacketSize);
48
49 return std::unique_ptr<Packet>(packet);
50 }
51
52 std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator::Packet>
53 BluetoothLowEnergyWeavePacketGenerator::CreateConnectionResponse() {
54 Packet* packet = CreateControlPacket();
55
56 SetControlCmd(packet, ControlPacketCommand::RESPONSE);
57 SetIntField(packet, 1, kServerWeaveVersion);
58 SetIntField(packet, 3, packet_size_);
59
60 return std::unique_ptr<Packet>(packet);
61 }
62
63 std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator::Packet>
64 BluetoothLowEnergyWeavePacketGenerator::CreateConnectionClose(
65 ReasonForClose reason_for_close) {
66 Packet* packet = CreateControlPacket();
67
68 SetControlCmd(packet, ControlPacketCommand::CLOSE);
69 SetIntField(packet, 1, reason_for_close);
70
71 return std::unique_ptr<Packet>(packet);
72 }
73
74 BluetoothLowEnergyWeavePacketGenerator::Packet*
75 BluetoothLowEnergyWeavePacketGenerator::CreateControlPacket() {
76 Packet* packet = new Packet(kControlPacketSize, 0);
77
78 // Packet is a control packet.
79 SetPacketTypeBit(packet, PacketType::CONTROL);
80 SetPacketCounter(packet);
81
82 return packet;
83 }
84
85 void BluetoothLowEnergyWeavePacketGenerator::SetDataPacketSize(uint32_t size) {
86 packet_size_ = size;
87 }
88
89 std::unique_ptr<std::vector<BluetoothLowEnergyWeavePacketGenerator::Packet>>
90 BluetoothLowEnergyWeavePacketGenerator::EncodeDataMessage(std::string message) {
91 uint32_t payload_size = packet_size_ - 1;
92 // (message.length() + 1) + (payload_size - 1) / (payload_size).
93 uint32_t num_packets = (message.length() + payload_size) / payload_size;
94 std::vector<Packet>* weave_message = new std::vector<Packet>(num_packets);
95
96 uint32_t last_byte = message.length() + 1;
97 const char* byte_message = message.c_str();
98
99 for (uint32_t i = 0; i < num_packets; ++i) {
100 Packet* packet = &weave_message->at(i);
101 uint32_t begin = payload_size * i;
102 uint32_t end = std::min(begin + payload_size, last_byte);
103
104 packet->push_back(0);
105
106 SetPacketTypeBit(packet, PacketType::DATA);
107 SetPacketCounter(packet);
108
109 for (uint32_t i = begin; i < end; ++i) {
110 packet->push_back(byte_message[i]);
111 }
112 }
113
114 // Since even empty string has \0, weave_message is guaranteed to be nonempty.
115 SetDataFirstBit(&weave_message->at(0));
116 SetDataLastBit(&weave_message->at(num_packets - 1));
117
118 return std::unique_ptr<std::vector<Packet>>(weave_message);
119 }
120
121 void BluetoothLowEnergyWeavePacketGenerator::SetIntField(Packet* packet,
Kyle Horimoto 2016/06/08 00:06:30 nit: Rename this to SetShortField().
122 uint32_t index,
123 uint16_t val) {
124 DCHECK(packet);
125 DCHECK_LT(index, packet->size());
126 DCHECK_LT(index + 1, packet->size());
127
128 uint8_t upper = val >> 8 & 0xFF;
129 uint8_t lower = val & 0xFF;
130
131 packet->at(index) = lower;
132 packet->at(index + 1) = upper;
133 }
134
135 void BluetoothLowEnergyWeavePacketGenerator::SetPacketTypeBit(Packet* packet,
136 bool val) {
137 DCHECK(packet);
138 DCHECK(!packet->empty());
139 packet->at(0) = (packet->at(0) & 0x7F) | (val << 7);
140 }
141
142 void BluetoothLowEnergyWeavePacketGenerator::SetControlCmd(Packet* packet,
143 uint8_t val) {
144 DCHECK(packet);
145 DCHECK(!packet->empty());
146 // Currently only commands supported are 0, 1, and 2.
147 DCHECK_LT(val, 3);
148 packet->at(0) = (packet->at(0) & 0xF0) | val;
149 }
150
151 void BluetoothLowEnergyWeavePacketGenerator::SetPacketCounter(Packet* packet) {
152 DCHECK(packet);
153 DCHECK(!packet->empty());
154 uint8_t counter = packet_number_ % kMaxPacketCounter;
155 packet->at(0) = (packet->at(0) & 0x8F) | (counter << 4);
156 packet_number_++;
157 }
158
159 void BluetoothLowEnergyWeavePacketGenerator::SetDataFirstBit(Packet* packet) {
160 DCHECK(packet);
161 DCHECK(!packet->empty());
162 packet->at(0) = (packet->at(0) & 0xF7) | (1 << 3);
163 }
164
165 void BluetoothLowEnergyWeavePacketGenerator::SetDataLastBit(Packet* packet) {
166 DCHECK(packet);
167 DCHECK(!packet->empty());
168 packet->at(0) = (packet->at(0) & 0xFB) | (1 << 2);
169 }
170
171 } // namespace proximity_auth
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698