Skip to content

Commit f848913

Browse files
committed
Perform remaining length checks on advertising parameters set methods
Now all the set methods of advertising data parameters return a bool value. This bool indicates whether the parameter has been correctly set or not, depending on the size of the passed value. A remaining length parameter of advertising data has been introduced. It can be publicly read, it indicates how many bytes can be still written into the packet.
1 parent 79a9e2e commit f848913

File tree

2 files changed

+110
-43
lines changed

2 files changed

+110
-43
lines changed

src/BLEAdvertisingData.cpp

Lines changed: 91 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
#include "BLEAdvertisingData.h"
2121

22+
#define AD_FIELD_OVERHEAD (2)
23+
2224
BLEAdvertisingData::BLEAdvertisingData() :
2325
_dataLength(0),
2426
_rawDataLength(0),
@@ -31,56 +33,112 @@ BLEAdvertisingData::BLEAdvertisingData() :
3133
_serviceData(NULL),
3234
_serviceDataLength(0),
3335
_flags(0),
34-
_hasFlags(false)
36+
_hasFlags(false),
37+
_remainingLength(MAX_AD_DATA_LENGTH)
3538
{
3639
}
3740

3841
BLEAdvertisingData::~BLEAdvertisingData()
3942
{
4043
}
4144

42-
void BLEAdvertisingData::setAdvertisedServiceUuid(const char* advertisedServiceUuid)
45+
inline bool BLEAdvertisingData::updateRemainingLength(int fieldLength)
4346
{
44-
_advertisedServiceUuid = advertisedServiceUuid;
47+
if (fieldLength <= _remainingLength) {
48+
_remainingLength -= fieldLength;
49+
return true;
50+
}
51+
return false;
4552
}
4653

47-
void BLEAdvertisingData::setManufacturerData(const uint8_t manufacturerData[], int manufacturerDataLength)
54+
int BLEAdvertisingData::remainingLength() const
4855
{
49-
_manufacturerData = manufacturerData;
50-
_manufacturerDataLength = manufacturerDataLength;
51-
_hasManufacturerCompanyId = false;
56+
return _remainingLength;
5257
}
5358

54-
void BLEAdvertisingData::setManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength)
59+
int BLEAdvertisingData::availableForWrite()
5560
{
56-
_manufacturerData = manufacturerData;
57-
_manufacturerDataLength = manufacturerDataLength;
58-
_manufacturerCompanyId = companyId;
59-
_hasManufacturerCompanyId = true;
61+
int available = (_remainingLength - AD_FIELD_OVERHEAD);
62+
if (available < 0) available = 0;
63+
return available;
6064
}
6165

62-
void BLEAdvertisingData::setAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length)
66+
bool BLEAdvertisingData::setAdvertisedServiceUuid(const char* advertisedServiceUuid)
6367
{
64-
_serviceDataUuid = uuid;
65-
_serviceData = data;
66-
_serviceDataLength = length;
68+
BLEUuid uuid(advertisedServiceUuid);
69+
bool success = updateRemainingLength(uuid.length() + AD_FIELD_OVERHEAD);
70+
if (success) {
71+
_advertisedServiceUuid = advertisedServiceUuid;
72+
}
73+
return success;
6774
}
6875

69-
void BLEAdvertisingData::setLocalName(const char *localName)
76+
bool BLEAdvertisingData::setAdvertisedService(const BLEService& service)
7077
{
71-
_localName = localName;
78+
return setAdvertisedServiceUuid(service.uuid());
7279
}
7380

74-
void BLEAdvertisingData::setRawData(const uint8_t* data, uint8_t length)
81+
bool BLEAdvertisingData::setManufacturerData(const uint8_t manufacturerData[], int manufacturerDataLength)
7582
{
76-
_rawData = data;
77-
_rawDataLength = length;
83+
bool success = updateRemainingLength(manufacturerDataLength + AD_FIELD_OVERHEAD);
84+
if (success) {
85+
_manufacturerData = manufacturerData;
86+
_manufacturerDataLength = manufacturerDataLength;
87+
_hasManufacturerCompanyId = false;
88+
}
89+
return success;
7890
}
7991

80-
void BLEAdvertisingData::setFlags(uint8_t flags)
92+
bool BLEAdvertisingData::setManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength)
8193
{
82-
_hasFlags = true;
83-
_flags = flags;
94+
bool success = updateRemainingLength(manufacturerDataLength + sizeof(companyId) + AD_FIELD_OVERHEAD);
95+
if (success) {
96+
_manufacturerData = manufacturerData;
97+
_manufacturerDataLength = manufacturerDataLength;
98+
_manufacturerCompanyId = companyId;
99+
_hasManufacturerCompanyId = true;
100+
}
101+
return success;
102+
}
103+
104+
bool BLEAdvertisingData::setAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length)
105+
{
106+
bool success = updateRemainingLength(length + sizeof(uuid) + AD_FIELD_OVERHEAD);
107+
if (success) {
108+
_serviceDataUuid = uuid;
109+
_serviceData = data;
110+
_serviceDataLength = length;
111+
}
112+
return success;
113+
}
114+
115+
bool BLEAdvertisingData::setLocalName(const char *localName)
116+
{
117+
bool success = updateRemainingLength(strlen(localName) + AD_FIELD_OVERHEAD);
118+
if (success) {
119+
_localName = localName;
120+
}
121+
return success;
122+
}
123+
124+
bool BLEAdvertisingData::setRawData(const uint8_t* data, int length)
125+
{
126+
bool success = updateRemainingLength(length);
127+
if (success) {
128+
_rawData = data;
129+
_rawDataLength = length;
130+
}
131+
return success;
132+
}
133+
134+
bool BLEAdvertisingData::setFlags(uint8_t flags)
135+
{
136+
bool success = updateRemainingLength(sizeof(flags) + AD_FIELD_OVERHEAD);
137+
if (success) {
138+
_hasFlags = true;
139+
_flags = flags;
140+
}
141+
return success;
84142
}
85143

86144
bool BLEAdvertisingData::updateData()
@@ -133,8 +191,8 @@ int BLEAdvertisingData::dataLength() const
133191
bool BLEAdvertisingData::addLocalName(const char *localName)
134192
{
135193
bool success = false;
136-
if (strlen(localName) > (MAX_AD_DATA_LENGTH - 2)) {
137-
success = addField(BLEFieldShortLocalName, (uint8_t*)localName, (MAX_AD_DATA_LENGTH - 2));
194+
if (strlen(localName) > (MAX_AD_DATA_LENGTH - AD_FIELD_OVERHEAD)) {
195+
success = addField(BLEFieldShortLocalName, (uint8_t*)localName, (MAX_AD_DATA_LENGTH - AD_FIELD_OVERHEAD));
138196
} else {
139197
success = addField(BLEFieldCompleteLocalName, localName);
140198
}
@@ -161,7 +219,7 @@ bool BLEAdvertisingData::addManufacturerData(const uint8_t manufacturerData[], i
161219

162220
bool BLEAdvertisingData::addManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength)
163221
{
164-
uint8_t tempDataLength = manufacturerDataLength + sizeof(companyId);
222+
int tempDataLength = manufacturerDataLength + sizeof(companyId);
165223
uint8_t tempData[MAX_AD_DATA_LENGTH];
166224
memcpy(tempData, &companyId, sizeof(companyId));
167225
memcpy(&tempData[sizeof(companyId)], manufacturerData, manufacturerDataLength);
@@ -170,14 +228,14 @@ bool BLEAdvertisingData::addManufacturerData(const uint16_t companyId, const uin
170228

171229
bool BLEAdvertisingData::addAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length)
172230
{
173-
uint8_t tempDataLength = length + sizeof(uuid);
231+
int tempDataLength = length + sizeof(uuid);
174232
uint8_t tempData[MAX_AD_DATA_LENGTH];
175233
memcpy(tempData, &uuid, sizeof(uuid));
176234
memcpy(&tempData[sizeof(uuid)], data, length);
177235
return addField(BLEFieldServiceData, tempData, tempDataLength);
178236
}
179237

180-
bool BLEAdvertisingData::addRawData(const uint8_t* data, uint8_t length)
238+
bool BLEAdvertisingData::addRawData(const uint8_t* data, int length)
181239
{
182240
// Bypass addField to add the integral raw data
183241
if (length > (MAX_AD_DATA_LENGTH - _dataLength)) {
@@ -191,18 +249,18 @@ bool BLEAdvertisingData::addRawData(const uint8_t* data, uint8_t length)
191249

192250
bool BLEAdvertisingData::addFlags(uint8_t flags)
193251
{
194-
return addField(BLEFieldFlags, &flags, 1);
252+
return addField(BLEFieldFlags, &flags, sizeof(flags));
195253
}
196254

197255
bool BLEAdvertisingData::addField(BLEAdField field, const char* data)
198256
{
199-
uint8_t dataLength = strlen(data);
257+
int dataLength = strlen(data);
200258
return addField(field, (uint8_t *)data, dataLength);
201259
}
202260

203-
bool BLEAdvertisingData::addField(BLEAdField field, const uint8_t* data, uint8_t length)
261+
bool BLEAdvertisingData::addField(BLEAdField field, const uint8_t* data, int length)
204262
{
205-
uint8_t fieldLength = length + 2; // Considering data TYPE and LENGTH fields
263+
int fieldLength = length + AD_FIELD_OVERHEAD; // Considering data TYPE and LENGTH fields
206264
if (fieldLength > (MAX_AD_DATA_LENGTH - _dataLength)) {
207265
// Not enough space for storing this field
208266
return false;

src/BLEAdvertisingData.h

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include <Arduino.h>
2424
#include "utility/BLEUuid.h"
25+
#include "BLEService.h"
2526

2627
#define MAX_AD_DATA_LENGTH (31)
2728

@@ -50,37 +51,45 @@ class BLEAdvertisingData {
5051
BLEAdvertisingData();
5152
virtual ~BLEAdvertisingData();
5253

53-
void setAdvertisedServiceUuid(const char* advertisedServiceUuid);
54-
void setManufacturerData(const uint8_t manufacturerData[], int manufacturerDataLength);
55-
void setManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength);
56-
void setLocalName(const char *localName);
57-
void setAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length);
58-
void setRawData(const uint8_t* data, uint8_t length);
59-
void setFlags(uint8_t flags);
54+
int availableForWrite();
55+
56+
bool setAdvertisedService(const BLEService& service);
57+
bool setAdvertisedServiceUuid(const char* advertisedServiceUuid);
58+
bool setManufacturerData(const uint8_t manufacturerData[], int manufacturerDataLength);
59+
bool setManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength);
60+
bool setLocalName(const char *localName);
61+
bool setAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length);
62+
bool setRawData(const uint8_t* data, int length);
63+
bool setFlags(uint8_t flags);
6064

6165
protected:
6266
friend class BLELocalDevice;
6367
bool updateData();
6468
uint8_t* data();
6569
int dataLength() const;
70+
int remainingLength() const;
6671

6772
private:
73+
bool updateRemainingLength(int fieldLength);
74+
6875
bool addAdvertisedServiceUuid(const char* advertisedServiceUuid);
6976
bool addManufacturerData(const uint8_t manufacturerData[], int manufacturerDataLength);
7077
bool addManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength);
7178
bool addLocalName(const char *localName);
7279
bool addAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length);
73-
bool addRawData(const uint8_t* data, uint8_t length);
80+
bool addRawData(const uint8_t* data, int length);
7481
bool addFlags(uint8_t flags);
7582

7683
bool addField(BLEAdField field, const char* data);
77-
bool addField(BLEAdField field, const uint8_t* data, uint8_t length);
84+
bool addField(BLEAdField field, const uint8_t* data, int length);
7885

7986
uint8_t _data[MAX_AD_DATA_LENGTH];
8087
int _dataLength;
8188

89+
int _remainingLength;
90+
8291
const uint8_t* _rawData;
83-
uint8_t _rawDataLength;
92+
int _rawDataLength;
8493

8594
uint8_t _flags;
8695
bool _hasFlags;

0 commit comments

Comments
 (0)