Skip to content

Commit 0ad1975

Browse files
committed
Adjust storage and processing in SystemPacketBuffer
and associated code for large payloads. Extend uint16_t type variables to size_t for the APIs and all applicable places.
1 parent e4c4c38 commit 0ad1975

29 files changed

+201
-186
lines changed

src/app/BufferedReadCallback.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ CHIP_ERROR BufferedReadCallback::GenerateListTLV(TLV::ScopedBufferTLVReader & aR
6565
//
6666
// To avoid that, a single contiguous buffer is the best likely approach for now.
6767
//
68-
uint32_t totalBufSize = 0;
68+
size_t totalBufSize = 0;
6969
for (const auto & packetBuffer : mBufferedList)
7070
{
7171
totalBufSize += packetBuffer->TotalLength();

src/app/server/EchoHandler.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ chip::Protocols::Echo::EchoServer gEchoServer;
4040
*/
4141
void HandleEchoRequestReceived(chip::Messaging::ExchangeContext * ec, chip::System::PacketBufferHandle && payload)
4242
{
43-
ChipLogProgress(AppServer, "Echo Request, len=%u ... sending response.\n", payload->DataLength());
43+
ChipLogProgress(AppServer, "Echo Request, len=%zu ... sending response.\n", payload->DataLength());
4444
}
4545

4646
} // namespace

src/ble/BtpEngine.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ CHIP_ERROR BtpEngine::HandleCharacteristicReceived(System::PacketBufferHandle &&
310310
// mRxFragnentSize may be smaller than the characteristic size. Make sure
311311
// we're not truncating to a data length smaller than what we have already consumed.
312312
VerifyOrExit(reader.OctetsRead() <= mRxFragmentSize, err = BLE_ERROR_REASSEMBLER_INCORRECT_STATE);
313-
data->SetDataLength(chip::min(data->DataLength(), mRxFragmentSize));
313+
data->SetDataLength(chip::min(data->DataLength(), static_cast<size_t>(mRxFragmentSize)));
314314

315315
// Now mark the bytes we consumed as consumed.
316316
data->ConsumeHead(static_cast<uint16_t>(reader.OctetsRead()));
@@ -374,11 +374,11 @@ CHIP_ERROR BtpEngine::HandleCharacteristicReceived(System::PacketBufferHandle &&
374374
if (rx_flags.Has(HeaderFlags::kEndMessage))
375375
{
376376
// Trim remainder, if any, of the received packet buffer based on sender-specified length of reassembled message.
377-
int padding = mRxBuf->DataLength() - mRxLength;
377+
int padding = static_cast<uint16_t>(mRxBuf->DataLength()) - mRxLength;
378378

379379
if (padding > 0)
380380
{
381-
mRxBuf->SetDataLength(mRxLength);
381+
mRxBuf->SetDataLength(static_cast<size_t>(mRxLength));
382382
}
383383

384384
// Ensure all received fragments add up to sender-specified total message size.
@@ -403,7 +403,7 @@ CHIP_ERROR BtpEngine::HandleCharacteristicReceived(System::PacketBufferHandle &&
403403
}
404404
if (!mRxBuf.IsNull())
405405
{
406-
ChipLogError(Ble, "With rx buf data length = %u", mRxBuf->DataLength());
406+
ChipLogError(Ble, "With rx buf data length = %zu", mRxBuf->DataLength());
407407
}
408408
LogState();
409409

@@ -456,7 +456,7 @@ bool BtpEngine::HandleCharacteristicSend(System::PacketBufferHandle data, bool s
456456

457457
mTxBuf = std::move(data);
458458
mTxState = kState_InProgress;
459-
mTxLength = mTxBuf->DataLength();
459+
mTxLength = static_cast<uint16_t>(mTxBuf->DataLength());
460460

461461
ChipLogDebugBtpEngine(Ble, ">>> CHIPoBle preparing to send whole message:");
462462
PrintBufDebug(mTxBuf);

src/inet/TCPEndPoint.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ CHIP_ERROR TCPEndPoint::SetReceivedDataForTesting(System::PacketBufferHandle &&
126126
return CHIP_NO_ERROR;
127127
}
128128

129-
uint32_t TCPEndPoint::PendingSendLength()
129+
size_t TCPEndPoint::PendingSendLength()
130130
{
131131
if (!mSendQueue.IsNull())
132132
{
@@ -135,7 +135,7 @@ uint32_t TCPEndPoint::PendingSendLength()
135135
return 0;
136136
}
137137

138-
uint32_t TCPEndPoint::PendingReceiveLength()
138+
size_t TCPEndPoint::PendingReceiveLength()
139139
{
140140
if (!mRcvQueue.IsNull())
141141
{
@@ -333,8 +333,8 @@ void TCPEndPoint::DriveReceiving()
333333
{
334334
// Acknowledgement is done after handling the buffers to allow the
335335
// application processing to throttle flow.
336-
uint16_t ackLength = mRcvQueue->TotalLength();
337-
CHIP_ERROR err = OnDataReceived(this, std::move(mRcvQueue));
336+
size_t ackLength = mRcvQueue->TotalLength();
337+
CHIP_ERROR err = OnDataReceived(this, std::move(mRcvQueue));
338338
if (err != CHIP_NO_ERROR)
339339
{
340340
DoClose(err, false);

src/inet/TCPEndPoint.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ class DLL_EXPORT TCPEndPoint : public EndPointBasis<TCPEndPoint>
274274
* received. The operational semantics are undefined if \c len is larger
275275
* than the total outstanding unacknowledged received data.
276276
*/
277-
virtual CHIP_ERROR AckReceive(uint16_t len) = 0;
277+
virtual CHIP_ERROR AckReceive(size_t len) = 0;
278278

279279
/**
280280
* @brief Set the receive queue, for testing.
@@ -295,15 +295,15 @@ class DLL_EXPORT TCPEndPoint : public EndPointBasis<TCPEndPoint>
295295
*
296296
* @return Number of untransmitted bytes in the transmit queue.
297297
*/
298-
uint32_t PendingSendLength();
298+
size_t PendingSendLength();
299299

300300
/**
301301
* @brief Extract the length of the unacknowledged receive data.
302302
*
303303
* @return Number of bytes in the receive queue that have not yet been
304304
* acknowledged with <tt>AckReceive(uint16_t len)</tt>.
305305
*/
306-
uint32_t PendingReceiveLength();
306+
size_t PendingReceiveLength();
307307

308308
/**
309309
* @brief Initiate TCP half close, in other words, finished with sending.
@@ -447,7 +447,7 @@ class DLL_EXPORT TCPEndPoint : public EndPointBasis<TCPEndPoint>
447447
* is the length of the message text added to the TCP transmit window,
448448
* which are eligible for sending by the underlying network stack.
449449
*/
450-
typedef void (*OnDataSentFunct)(TCPEndPoint * endPoint, uint16_t len);
450+
typedef void (*OnDataSentFunct)(TCPEndPoint * endPoint, size_t len);
451451

452452
/**
453453
* The endpoint's message text transmission event handling function

src/inet/TCPEndPointImplLwIP.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ void TCPEndPointImplLwIP::DoCloseImpl(CHIP_ERROR err, State oldState)
503503
}
504504
}
505505

506-
CHIP_ERROR TCPEndPointImplLwIP::AckReceive(uint16_t len)
506+
CHIP_ERROR TCPEndPointImplLwIP::AckReceive(size_t len)
507507
{
508508
VerifyOrReturnError(IsConnected(), CHIP_ERROR_INCORRECT_STATE);
509509
CHIP_ERROR res = CHIP_NO_ERROR;

src/inet/TCPEndPointImplLwIP.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class TCPEndPointImplLwIP : public TCPEndPoint, public EndPointStateLwIP
5151
CHIP_ERROR EnableNoDelay() override;
5252
CHIP_ERROR EnableKeepAlive(uint16_t interval, uint16_t timeoutCount) override;
5353
CHIP_ERROR DisableKeepAlive() override;
54-
CHIP_ERROR AckReceive(uint16_t len) override;
54+
CHIP_ERROR AckReceive(size_t len) override;
5555
#if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT
5656
void TCPUserTimeoutHandler() override;
5757
#endif // INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT

src/inet/TCPEndPointImplOpenThread.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ CHIP_ERROR TCPEndPointImplOT::DisableKeepAlive()
5454
{
5555
return CHIP_ERROR_NOT_IMPLEMENTED;
5656
}
57-
CHIP_ERROR TCPEndPointImplOT::AckReceive(uint16_t len)
57+
CHIP_ERROR TCPEndPointImplOT::AckReceive(size_t len)
5858
{
5959
return CHIP_ERROR_NOT_IMPLEMENTED;
6060
}

src/inet/TCPEndPointImplOpenThread.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class TCPEndPointImplOT : public TCPEndPoint, public EndPointStateOpenThread
4646
CHIP_ERROR EnableNoDelay() override;
4747
CHIP_ERROR EnableKeepAlive(uint16_t interval, uint16_t timeoutCount) override;
4848
CHIP_ERROR DisableKeepAlive() override;
49-
CHIP_ERROR AckReceive(uint16_t len) override;
49+
CHIP_ERROR AckReceive(size_t len) override;
5050
#if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT
5151
void TCPUserTimeoutHandler() override;
5252
#endif // INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT

src/inet/TCPEndPointImplSockets.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ CHIP_ERROR TCPEndPointImplSockets::DisableKeepAlive()
441441
return CHIP_NO_ERROR;
442442
}
443443

444-
CHIP_ERROR TCPEndPointImplSockets::AckReceive(uint16_t len)
444+
CHIP_ERROR TCPEndPointImplSockets::AckReceive(size_t len)
445445
{
446446
VerifyOrReturnError(IsConnected(), CHIP_ERROR_INCORRECT_STATE);
447447

@@ -483,7 +483,7 @@ CHIP_ERROR TCPEndPointImplSockets::DriveSendingImpl()
483483

484484
while (!mSendQueue.IsNull())
485485
{
486-
uint16_t bufLen = mSendQueue->DataLength();
486+
uint32_t bufLen = static_cast<uint32_t>(mSendQueue->DataLength());
487487

488488
ssize_t lenSentRaw = send(mSocket, mSendQueue->Start(), bufLen, sendFlags);
489489

@@ -502,8 +502,8 @@ CHIP_ERROR TCPEndPointImplSockets::DriveSendingImpl()
502502
break;
503503
}
504504

505-
// Cast is safe because bufLen is uint16_t.
506-
uint16_t lenSent = static_cast<uint16_t>(lenSentRaw);
505+
// Cast is safe because bufLen is uint32_t.
506+
uint32_t lenSent = static_cast<uint32_t>(lenSentRaw);
507507

508508
// Mark the connection as being active.
509509
MarkActive();

src/inet/TCPEndPointImplSockets.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class TCPEndPointImplSockets : public TCPEndPoint, public EndPointStateSockets
4646
CHIP_ERROR EnableNoDelay() override;
4747
CHIP_ERROR EnableKeepAlive(uint16_t interval, uint16_t timeoutCount) override;
4848
CHIP_ERROR DisableKeepAlive() override;
49-
CHIP_ERROR AckReceive(uint16_t len) override;
49+
CHIP_ERROR AckReceive(size_t len) override;
5050
#if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT
5151
void TCPUserTimeoutHandler() override;
5252
#endif // INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT
@@ -72,7 +72,7 @@ class TCPEndPointImplSockets : public TCPEndPoint, public EndPointStateSockets
7272

7373
#if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT
7474
/// This counts the number of bytes written on the TCP socket since thelast probe into the TCP outqueue was made.
75-
uint32_t mBytesWrittenSinceLastProbe;
75+
size_t mBytesWrittenSinceLastProbe;
7676

7777
/// This is the measured size(in bytes) of the kernel TCP send queue at the end of the last user timeout window.
7878
uint32_t mLastTCPKernelSendQueueLen;

src/inet/UDPEndPointImplLwIP.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ void UDPEndPointImplLwIP::LwIPReceiveUDPMessage(void * arg, struct udp_pcb * pcb
352352
if (buf->HasChainedBuffer())
353353
{
354354
// Have to allocate a new big-enough buffer and copy.
355-
uint16_t messageSize = buf->TotalLength();
355+
size_t messageSize = buf->TotalLength();
356356
System::PacketBufferHandle copy = System::PacketBufferHandle::New(messageSize, 0);
357357
if (copy.IsNull() || buf->Read(copy->Start(), messageSize) != CHIP_NO_ERROR)
358358
{

src/inet/UDPEndPointImplSockets.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,10 @@ CHIP_ERROR UDPEndPointImplSockets::SendMsgImpl(const IPPacketInfo * aPktInfo, Sy
416416
{
417417
return CHIP_ERROR_POSIX(errno);
418418
}
419-
if (lenSent != msg->DataLength())
419+
420+
size_t len = static_cast<size_t>(lenSent);
421+
422+
if (len != msg->DataLength())
420423
{
421424
return CHIP_ERROR_OUTBOUND_MESSAGE_TOO_BIG;
422425
}
@@ -612,7 +615,7 @@ void UDPEndPointImplSockets::HandlePendingIO(System::SocketEvents events)
612615
{
613616
lStatus = CHIP_ERROR_POSIX(errno);
614617
}
615-
else if (rcvLen > lBuffer->AvailableDataLength())
618+
else if (lBuffer->AvailableDataLength() < static_cast<size_t>(rcvLen))
616619
{
617620
lStatus = CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG;
618621
}

src/inet/tests/TestInetLayer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ static void HandleTCPConnectionClosed(TCPEndPoint * aEndPoint, CHIP_ERROR aError
569569
}
570570
}
571571

572-
static void HandleTCPDataSent(TCPEndPoint * aEndPoint, uint16_t len) {}
572+
static void HandleTCPDataSent(TCPEndPoint * aEndPoint, size_t len) {}
573573

574574
static CHIP_ERROR HandleTCPDataReceived(TCPEndPoint * aEndPoint, PacketBufferHandle && aBuffer)
575575
{

src/inet/tests/TestInetLayerCommon.cpp

+24-24
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ bool WasSuccessful(const TestStatus & aTestStatus)
123123
return (lStatus);
124124
}
125125

126-
static void FillDataBufferPattern(uint8_t * aBuffer, uint16_t aLength, uint16_t aPatternStartOffset, uint8_t aFirstValue)
126+
static void FillDataBufferPattern(uint8_t * aBuffer, size_t aLength, size_t aPatternStartOffset, uint8_t aFirstValue)
127127
{
128-
for (uint16_t i = aPatternStartOffset; i < aLength; i++)
128+
for (size_t i = aPatternStartOffset; i < aLength; i++)
129129
{
130130
const uint8_t lValue = static_cast<uint8_t>(aFirstValue & 0xFF);
131131

@@ -135,18 +135,18 @@ static void FillDataBufferPattern(uint8_t * aBuffer, uint16_t aLength, uint16_t
135135
}
136136
}
137137

138-
static bool CheckDataBufferPattern(const uint8_t * aBuffer, uint16_t aLength, uint16_t aPatternStartOffset, uint8_t aFirstValue)
138+
static bool CheckDataBufferPattern(const uint8_t * aBuffer, size_t aLength, size_t aPatternStartOffset, size_t aFirstValue)
139139
{
140-
for (uint16_t i = aPatternStartOffset; i < aLength; i++)
140+
for (size_t i = aPatternStartOffset; i < aLength; i++)
141141
{
142142
const uint8_t lValue = aBuffer[i];
143143

144144
if (lValue != static_cast<uint8_t>(aFirstValue))
145145
{
146-
printf("Bad data value at offset %u (0x%04x): "
147-
"expected 0x%02x, found 0x%02x\n",
146+
printf("Bad data value at offset %zu (0x%04zx): "
147+
"expected 0x%02zx, found 0x%02x\n",
148148
i, i, aFirstValue, lValue);
149-
DumpMemory(aBuffer + aPatternStartOffset, aLength - aPatternStartOffset, "0x", 16);
149+
DumpMemory(aBuffer + aPatternStartOffset, static_cast<uint32_t>(aLength - aPatternStartOffset), "0x", 16);
150150
return false;
151151
}
152152

@@ -156,7 +156,7 @@ static bool CheckDataBufferPattern(const uint8_t * aBuffer, uint16_t aLength, ui
156156
return true;
157157
}
158158

159-
static PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint16_t aPatternStartOffset, uint8_t aFirstValue)
159+
static PacketBufferHandle MakeDataBuffer(size_t aDesiredLength, size_t aPatternStartOffset, uint8_t aFirstValue)
160160
{
161161
VerifyOrReturnError(aPatternStartOffset <= aDesiredLength, PacketBufferHandle());
162162

@@ -172,14 +172,14 @@ static PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint16_t aPatt
172172
return lBuffer;
173173
}
174174

175-
static PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint16_t aPatternStartOffset)
175+
static PacketBufferHandle MakeDataBuffer(size_t aDesiredLength, size_t aPatternStartOffset)
176176
{
177177
constexpr uint8_t lFirstValue = 0;
178178
return MakeDataBuffer(aDesiredLength, aPatternStartOffset, lFirstValue);
179179
}
180180

181181
template <typename tType>
182-
static PacketBufferHandle MakeICMPDataBuffer(uint16_t aDesiredUserLength, uint16_t aHeaderLength, uint16_t aPatternStartOffset,
182+
static PacketBufferHandle MakeICMPDataBuffer(size_t aDesiredUserLength, uint16_t aHeaderLength, size_t aPatternStartOffset,
183183
uint8_t aType)
184184
{
185185
static uint16_t lSequenceNumber = 0;
@@ -188,7 +188,7 @@ static PacketBufferHandle MakeICMPDataBuffer(uint16_t aDesiredUserLength, uint16
188188
// To ensure there is enough room for the user data and the ICMP
189189
// header, include both the user data size and the ICMP header length.
190190

191-
lBuffer = MakeDataBuffer(static_cast<uint16_t>(aDesiredUserLength + aHeaderLength), aPatternStartOffset);
191+
lBuffer = MakeDataBuffer(aDesiredUserLength + aHeaderLength, aPatternStartOffset);
192192

193193
if (!lBuffer.IsNull())
194194
{
@@ -204,7 +204,7 @@ static PacketBufferHandle MakeICMPDataBuffer(uint16_t aDesiredUserLength, uint16
204204
return (lBuffer);
205205
}
206206

207-
PacketBufferHandle MakeICMPv4DataBuffer(uint16_t aDesiredUserLength)
207+
PacketBufferHandle MakeICMPv4DataBuffer(size_t aDesiredUserLength)
208208
{
209209
constexpr uint16_t lICMPHeaderLength = sizeof(ICMPv4EchoHeader);
210210
constexpr uint16_t lPatternStartOffset = lICMPHeaderLength;
@@ -213,7 +213,7 @@ PacketBufferHandle MakeICMPv4DataBuffer(uint16_t aDesiredUserLength)
213213
return MakeICMPDataBuffer<ICMPv4EchoHeader>(aDesiredUserLength, lICMPHeaderLength, lPatternStartOffset, lType);
214214
}
215215

216-
PacketBufferHandle MakeICMPv6DataBuffer(uint16_t aDesiredUserLength)
216+
PacketBufferHandle MakeICMPv6DataBuffer(size_t aDesiredUserLength)
217217
{
218218
constexpr uint16_t lICMPHeaderLength = sizeof(ICMPv6EchoHeader);
219219
constexpr uint16_t lPatternStartOffset = lICMPHeaderLength;
@@ -222,44 +222,44 @@ PacketBufferHandle MakeICMPv6DataBuffer(uint16_t aDesiredUserLength)
222222
return MakeICMPDataBuffer<ICMPv6EchoHeader>(aDesiredUserLength, lICMPHeaderLength, lPatternStartOffset, lType);
223223
}
224224

225-
PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint8_t aFirstValue)
225+
PacketBufferHandle MakeDataBuffer(size_t aDesiredLength, uint8_t aFirstValue)
226226
{
227-
constexpr uint16_t lPatternStartOffset = 0;
227+
constexpr size_t lPatternStartOffset = 0;
228228
return MakeDataBuffer(aDesiredLength, lPatternStartOffset, aFirstValue);
229229
}
230230

231-
PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength)
231+
PacketBufferHandle MakeDataBuffer(size_t aDesiredLength)
232232
{
233-
constexpr uint16_t lPatternStartOffset = 0;
233+
constexpr size_t lPatternStartOffset = 0;
234234
return MakeDataBuffer(aDesiredLength, lPatternStartOffset);
235235
}
236236

237237
static bool HandleDataReceived(const PacketBufferHandle & aBuffer, TransferStats & aStats, bool aStatsByPacket, bool aCheckBuffer,
238-
uint16_t aPatternStartOffset, uint8_t aFirstValue)
238+
size_t aPatternStartOffset, size_t aFirstValue)
239239
{
240-
uint16_t lTotalDataLength = 0;
240+
size_t lTotalDataLength = 0;
241241

242242
// Walk through each buffer in the packet chain, checking the
243243
// buffer for the expected pattern, if requested.
244244

245245
for (PacketBufferHandle lBuffer = aBuffer.Retain(); !lBuffer.IsNull(); lBuffer.Advance())
246246
{
247-
const uint16_t lDataLength = lBuffer->DataLength();
248-
const uint8_t * const p = lBuffer->Start();
247+
const size_t lDataLength = lBuffer->DataLength();
248+
const uint8_t * const p = lBuffer->Start();
249249

250250
if (aCheckBuffer && !CheckDataBufferPattern(p, lDataLength, aPatternStartOffset, aFirstValue))
251251
{
252252
return false;
253253
}
254254

255-
lTotalDataLength = static_cast<uint16_t>(lTotalDataLength + lDataLength);
256-
aFirstValue = static_cast<uint8_t>(aFirstValue + lDataLength);
255+
lTotalDataLength = lTotalDataLength + lDataLength;
256+
aFirstValue = aFirstValue + lDataLength;
257257
}
258258

259259
// If we are accumulating stats by packet rather than by size,
260260
// then increment by one (1) rather than the total buffer length.
261261

262-
aStats.mReceive.mActual += ((aStatsByPacket) ? 1 : lTotalDataLength);
262+
aStats.mReceive.mActual += ((aStatsByPacket) ? 1 : static_cast<uint32_t>(lTotalDataLength));
263263

264264
return true;
265265
}

0 commit comments

Comments
 (0)