SegAndConcat Reassembly issues

Asked by Boyan Lazarov

Hello,
I'm trying to use the SegAndConcat FU (wns::ldk::sar::SegAndConcat) in combination with a SegmentingQueue in a setup similar to the one in wimac. I'm having some trouble during the reassembly procedure after a packet has been lost and the t-Reordering timer has expired. Below is is a description of the setup and the problem:

Setup:
A base station (BS) in a scenario with multiple cells and BSs is transmitting data to a subscriber station (SS). Data comes in the form of IP Packets from the constanze generators. Packet size is 1024 Bit data + 48 Bit overhead = 1072 Bit. The SegAndConcat FU is setup with isSegmenting = False as segmentation is performed by the SegmentingQueue in the scheduler. The FU thus only handles reassembly. There is also a CRC present bellow the SegAndConcat FU, which is set to "Dropping". Furthermore, there are no retransmissions in the system (no HARQ nor ARQ). The following situation arises:

After transmitting for some time, a PDU is discarded by the CRC because the ErrorModeling calculated a high error probability. The PDU has a SN = 189. As described in the protocol, the reordering timer is started. In the mean time, further transmissions occur, and PDUs with SN = 190 to 205 are transmitted and correctly received until the timer expires. The VR variables at the time the timer fires look the following way:

vrUH_ = 206
vrUR_=189
vrUX_ = 191

TS 36.322 5.1.2.2.4 defines the following actions when the timer expires:

- vrUR is set to the SN of the first not received PDU with SN > vrUX, in this case 206
- From the received PDUs with SN < this new vrUR ( SN < 206), SDUs are reassembled and passed to the FUs above.If an SDU cannot be reassembled due to missing PDUs, it should discarded.
- Finally, if vrUH is still larger than vrUR, the t-Reordering timer is restarted and vrUX is set equal to vrUH

The following happens in the simulator:

- Timer fires and ReorderingWindow::onTReorderingTimeout is called
- vrUR is correctly updated to 206
- updateReassemblyBuffer is called with the new vrUR as a parameter

- this function iterates over all PDUs in the reordering window (in this case, from SN 190 to 205) and attempts to pass them to the reassembly buffer
- this results in a call to onReorderedPDU() with the current PDU as a parameter
- this method first checks if this PDU is the nextExpectedPDU (which is not the case, the next expected is 189 which was lost)
- Because this is not the expected PDU, the reassembly buffer is emptied.
- It is then checked whether the current PDU can be accepted from the buffer - This is where the problem occurs:

- the function called is ReassemblyBuffer::accepts(PDU). This function returns "true" either if the buffer is empty _and_ the PDU's isBegin flag is set to true, or if the PDU is the next expected PDU (not the case). Since the buffer has been emptied, the only real factor is the isBegin flag. The transmitted PDUs are generated in the BS's scheduler by the SegmentingQueue. The actual function of interest is the retrieve() method of the InnerQueue (InnerQueue::retrieve()) after the getHeadOfLinePDUSegment function is called. In this retrieve function, one can see that the PDU's is begin flag is set to true only if a SDU begins right at the beginning of the PDU. However, this is not always the case (example - a PDU can contain the last bits of one SDU, and after that a new SDU could start; or a SDU can be split among multiple PDUs etc.). In fact, studying some of the simulation output it turns out that only a very small fraction of the PDUs begin with a new SDU an thus have their isBegin flag set. Back to the problem - from the PDUs with SNs from 190 to 205, none have their isBegin flag set. Therefore, all of them get rejected by the accepts() method, and are thus dropped by the reassembly buffer. As the BS transmitts with phymodes allowing ~330 to 550 bits per PDU, it is clear that the PDUs in the reordering window contain multiple SDUs that could have been reassembled. Furthermore, after the ReassemblyBuffer drops the first PDU (with SN = 190), the buffer is cleared and the nextExpectedPDU gets set to -1.
After this point, no more SDUs are reassemled by the SegAndConcat, even though there are multiple correct transmissions until the end of the simulation. Bellow is some output from the problem:

( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering onTReorderingExpired: (vrUR = 189 vrUX = 191)
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 191 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 192 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 193 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 194 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 195 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 196 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 197 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 198 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 199 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 200 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 201 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 202 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 203 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 204 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 205 is duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering isDuplicate: Segment 206 is not duplicate
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering Moving segment 190 to reassembly Buffer
( 0.2559987) [ WNS] L2.SegAndConcat onReorderedPDU(sn=190):
( 0.2559987) [ WNS] L2.SegAndConcat onReorderedPDU: PDU 189 is missing. Clearing reassembly buffer.
( 0.2559987) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 190. isBegin=False.
( 0.2559987) [ WNS] L2.SegAndConcat
( 0.2559987) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.2559987) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering Moving segment 191 to reassembly Buffer
( 0.2559987) [ WNS] L2.SegAndConcat onReorderedPDU(sn=191):
( 0.2559987) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.2559987) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 191. isBegin=False

... and so on up to PDU 205

I therefore have the following questions:
- Could this be a configuration issue which prevents the SegAndConcat unit from working correctly, or could this be a bug?
- In general, is it possible to use the combination of SegAndConcat and a Segmenting queue without any retransmission mechanism (HARQ), leaving aside the potentially higher packet loss?

Thank you for your time, any ideas would be greatly appreciated!

Best regards,

Boyan Lazarov, B.Sc
TU Muenchen

Question information

Language:
English Edit question
Status:
Answered
For:
openWNS Library Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Boyan Lazarov (lazarov-b) said :
#1

After looking at the debug output of the openwns-sdk/tests/system/wifi-wimac-coexist-tests/configBase system test (which runs without deviations from the reference output), we are more confident that the above described behavior is indeed a bug in the Segmentation/Concatenation/Reassembly mechanism.

In that system test, packets of size=3000 bits are sent and 48 bits of CRC are added before this is segmented into segments of size 288 bit. In the debug output pasted below, we see that obviously segment number 1072 was lost and triggered the tReording timer. After the timeout, segments 1073 through 1126 are dropped and reassembly continues with segment 1127. After receiving 11 segments (1127 through 1137), the 3048 bits SDU has been completely reassembled (11*288 > 3048 > 10*288). That means that 54 segments have been discarded due to the missing segment number 1072. However, the missing segment should only affect 10 other segments belonging to the same SDU or 20 other segments if the lost segment contains the end of one SDU and the beginning of another SDU.

So it seems to us that too many packets are dropped. We believe this is due to the same improper handling of isBegin flag as indicated above. Looking at InnerQueue::retrieve it seems that the isBegin flag can only be true if a new SDU starts at the beginning of the segment. In cases where the segment begins with the rest of a previous SDU, no isBegin=True would be set if the remaining space in the segment is filled with the beginning of the next SDU. Also, the isEnd flag would not be set because the end of the first SDU would not be at the end of the segment. Is this really the intended behavior?

This happens on a fresh checkout from launchpad.net.

( 0.3255556) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering onTReorderingExpired: (vrUR = 1063 vrUX = 1074)
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1073):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1073. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1074):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1074. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1075):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1075. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1076):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1076. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1077):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1077. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1078):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1078. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1079):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1079. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1080):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1080. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1081):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1081. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1082):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1082. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1083):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1083. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1084):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1084. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1085):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1085. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1086):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1086. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1087):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1087. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1088):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1088. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1089):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1089. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1090):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1090. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1091):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1091. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1092):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1092. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1093):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1093. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1094):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1094. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1095):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1095. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1096):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1096. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1097):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1097. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1098):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1098. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1099):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1099. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1100):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1100. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1101):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1101. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1102):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1102. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1103):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1103. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1104):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1104. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1105):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1105. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1106):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1106. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1107):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1107. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1108):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1108. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1109):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1109. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1110):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1110. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1111):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1111. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1112):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1112. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1113):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1113. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1114):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1114. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1115):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1115. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1116):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1116. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1117):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1117. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1118):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1118. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1119):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1119. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1120):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1120. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1121):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1121. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1122):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1122. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1123):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1123. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1124):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1124. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1125):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1125. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1126):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1126. isBegin=False.
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1127):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1127 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1128):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1128 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1129):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1129 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1130):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1130 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1131):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1131 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1132):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1132 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1133):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1133 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1134):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1134 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1135):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1135 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1136):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1136 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1137):
( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1137 of size 288 bits into reassembly buffer
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=1
( 0.3255556) [ WNS] L2.SegAndConcat reassemble: Passing 3048 bits to upper FU.
( 0.3255556) [WIMAC] wimac::ConnectionClassifier UT2: classify incomming compound. CID: 3 to destMACAdr: 2
( 0.3255556) [ WNS] TopP UT2 sent 0.31065 received 0.325556 delay 0.0149054 length 3000
( 0.3255556) [ WNS] TopTp UT2 incoming length 3000
( 0.3255556) [WIMAC] wimac::UpperConvergence UT2: doOnData(), forwarding to upper Component (IP)

Revision history for this message
Daniel Bültmann (daniel.bueltmann) said :
#2

Dear Boyan,

thank you for your good work. I also agree with you that you have found
a bug. Unfortunately, I do not have time at the moment to fix it myself,
but maybe you can contribute a fix if you like. I would propose the
following way forward:

1. Convert this question/answer thread to a bug report of openwns-library.

2. Extend the testcase
src/ldk/sar/tests/SACSegmentingQueueIntegrationTest.cpp to actually
provoke the error. It is quite easy to do. If you have a look at the
source code you will find a test setup with the SegmentingQueue and the
SegAndConcatFU. You can execute the test suite by:

cd tests/unit/unitTests
./openwns -t -v

or only execute the test above with:

cd tests/unit/unitTests
./openwns -t -v -T wns::ldk::sar::tests::SACSegmentingQueueIntegrationTest

3. Fix the bug ;) I think the following would be reasonable, but feel
free to propose a better solution:

The starting point is void SegAndConcat::onReorderedPDU(). Probably you
need to modify ReassemblyBuffer::isNextExpectedSegment() to accept a segment

  if (isEmpty() && (readCommand(c)->getBeginFlag() ||
readCommand(c)->peer.pdus_.size() > 1))

So, if the buffer is empty a new segment is accepted if the getBeginFlag
is set or if more than one sdu is contained within.

You will need to do the same with ReassemblyBuffer::accepts()

Furthermore, you will need to modify ReassemblyBuffer::insert(), such
that if the buffer is empty and the isBegin flag is not set:
  1) Assure that readCommand(c)->peer.pdus_.size() > 1
  2) Remove the head element of readCommand(c)->peer.pdus_.size()
  3) Set the begin flag: readCommand(c)->setBeginFlag()
  4) Put the segment into the buffer

4. Check if this fixes the error and does not introduce new ones by
executing the test suite.

5. Push your branch with the bugifx to launchpad and propose a merge. Me
or Maciej will then merge it to the trunk.

Let me know if this is OK with you.

Thanks a lot,
  Daniel

Boyan Lazarov wrote:
> Question #108680 on openWNS Library changed:
> https://answers.launchpad.net/openwns-library/+question/108680
>
> Boyan Lazarov gave more information on the question:
> After looking at the debug output of the openwns-sdk/tests/system/wifi-
> wimac-coexist-tests/configBase system test (which runs without
> deviations from the reference output), we are more confident that the
> above described behavior is indeed a bug in the
> Segmentation/Concatenation/Reassembly mechanism.
>
> In that system test, packets of size=3000 bits are sent and 48 bits of
> CRC are added before this is segmented into segments of size 288 bit. In
> the debug output pasted below, we see that obviously segment number 1072
> was lost and triggered the tReording timer. After the timeout, segments
> 1073 through 1126 are dropped and reassembly continues with segment
> 1127. After receiving 11 segments (1127 through 1137), the 3048 bits SDU
> has been completely reassembled (11*288 > 3048 > 10*288). That means
> that 54 segments have been discarded due to the missing segment number
> 1072. However, the missing segment should only affect 10 other segments
> belonging to the same SDU or 20 other segments if the lost segment
> contains the end of one SDU and the beginning of another SDU.
>
> So it seems to us that too many packets are dropped. We believe this is
> due to the same improper handling of isBegin flag as indicated above.
> Looking at InnerQueue::retrieve it seems that the isBegin flag can only
> be true if a new SDU starts at the beginning of the segment. In cases
> where the segment begins with the rest of a previous SDU, no
> isBegin=True would be set if the remaining space in the segment is
> filled with the beginning of the next SDU. Also, the isEnd flag would
> not be set because the end of the first SDU would not be at the end of
> the segment. Is this really the intended behavior?
>
> This happens on a fresh checkout from launchpad.net.
>
>
> ( 0.3255556) [ WNS] L2.SegAndConcat.SegAndConcat.Reordering onTReorderingExpired: (vrUR = 1063 vrUX = 1074)
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1073):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1073. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1074):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1074. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1075):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1075. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1076):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1076. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1077):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1077. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1078):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1078. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1079):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1079. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1080):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1080. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1081):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1081. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1082):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1082. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1083):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1083. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1084):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1084. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1085):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1085. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1086):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1086. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1087):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1087. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1088):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1088. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1089):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1089. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1090):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1090. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1091):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1091. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1092):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1092. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1093):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1093. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1094):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1094. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1095):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1095. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1096):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1096. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1097):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1097. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1098):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1098. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1099):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1099. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1100):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1100. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1101):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1101. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1102):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1102. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1103):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1103. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1104):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1104. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1105):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1105. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1106):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1106. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1107):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1107. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1108):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1108. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1109):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1109. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1110):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1110. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1111):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1111. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1112):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1112. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1113):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1113. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1114):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1114. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1115):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1115. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1116):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1116. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1117):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1117. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1118):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1118. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1119):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1119. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1120):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1120. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1121):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1121. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1122):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1122. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1123):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1123. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1124):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1124. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1125):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1125. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1126):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: PDU -1 is missing. Clearing reassembly buffer.
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Dropping PDU 1126. isBegin=False.
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1127):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1127 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1128):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1128 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1129):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1129 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1130):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1130 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1131):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1131 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1132):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1132 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1133):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1133 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1134):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1134 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1135):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1135 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1136):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1136 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=0
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU(sn=1137):
> ( 0.3255556) [ WNS] L2.SegAndConcat onReorderedPDU: Putting PDU 1137 of size 288 bits into reassembly buffer
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: getReassembledSegments() sc.size()=1
> ( 0.3255556) [ WNS] L2.SegAndConcat reassemble: Passing 3048 bits to upper FU.
> ( 0.3255556) [WIMAC] wimac::ConnectionClassifier UT2: classify incomming compound. CID: 3 to destMACAdr: 2
> ( 0.3255556) [ WNS] TopP UT2 sent 0.31065 received 0.325556 delay 0.0149054 length 3000
> ( 0.3255556) [ WNS] TopTp UT2 incoming length 3000
> ( 0.3255556) [WIMAC] wimac::UpperConvergence UT2: doOnData(), forwarding to upper Component (IP)
>
>

Revision history for this message
Daniel Bültmann (daniel.bueltmann) said :
#3

This issue is fixed in trunk now.

Jan and Boyan, thank you for your contribution!

Can you help with this problem?

Provide an answer of your own, or ask Boyan Lazarov for more information if necessary.

To post a message you must log in.