@@ -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