Skip to content

Commit db71305

Browse files
Merge remote-tracking branch 'origin/main'
# Conflicts: # build.gradle # gradle/wrapper/gradle-wrapper.properties
2 parents 6675ffa + 1324f0a commit db71305

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#Sun Oct 18 21:42:22 CEST 2020
1+
#Wed Jan 29 20:32:48 CET 2025
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip

mesh/src/main/java/no/nordicsemi/android/mesh/transport/LowerTransportLayer.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,37 @@ final AccessMessage parseSegmentedAccessLowerTransportPDU(final int ttl,
484484
MeshLogger.verbose(TAG, "Starting incomplete timer for src: " + MeshAddress.formatAddress(blockAckDst, false));
485485
initIncompleteTimer();
486486

487-
//Start acknowledgement calculation and timer only for messages directed to a unicast address.
487+
// Start acknowledgement calculation and timer only for messages directed to a unicast address.
488488
if (MeshAddress.isValidUnicastAddress(dst)) {
489489
// Calculate the initial block acknowledgement value
490490
mSegmentedAccessBlockAck = BlockAcknowledgementMessage.calculateBlockAcknowledgement(null, segO);
491491
//Start the block acknowledgement timer irrespective of which segment was received first
492492
initSegmentedAccessAcknowledgementTimer(seqZero, ttl, blockAckSrc, blockAckDst, segN);
493493
}
494+
495+
// We need to ensure there could be an unsegmented message that could be sent as a
496+
// segmented message i.e. segO = 0 and segN = 0. This will ensure the multi-segmented
497+
// messages that may not arrive in order will be reassembled correctly or rather ignored.
498+
if (segO == 0 && segN == 0) {
499+
if (MeshAddress.isValidUnicastAddress(dst)) {
500+
mSegmentedAccessBlockAck = BlockAcknowledgementMessage.calculateBlockAcknowledgement(mSegmentedAccessBlockAck, segO);
501+
handleImmediateBlockAcks(seqZero, ttl, blockAckSrc, blockAckDst, segN);
502+
} else {
503+
//We should cancel the incomplete timer since we have received all segments
504+
cancelIncompleteTimer();
505+
}
506+
507+
final AccessMessage accessMessage = new AccessMessage();
508+
accessMessage.setAszmic(szmic);
509+
accessMessage.setSequenceNumber(MeshParserUtils.getSequenceNumberBytes(seqNumber));
510+
accessMessage.setAkf(akf);
511+
accessMessage.setAid(aid);
512+
accessMessage.setSegmented(true);
513+
final SparseArray<byte[]> segmentedMessages = segmentedAccessMessageMap.clone();
514+
accessMessage.setLowerTransportAccessPdu(segmentedMessages);
515+
return accessMessage;
516+
}
517+
494518
} else {
495519
//if the seqauth values are the same and the init complete timer has already started for a received segmented message, we need to restart the incomplete timer
496520
if (lastSeqAuth == seqAuth) {

0 commit comments

Comments
 (0)