--
You received this message because you are subscribed to the Google Groups "ns-3-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ns-3-users+...@googlegroups.com.
To post to this group, send email to ns-3-...@googlegroups.com.
Visit this group at http://groups.google.com/group/ns-3-users.
For more options, visit https://groups.google.com/groups/opt_out.
Hello, my name is Brett and I would like to say that I have seen similar issues with throughput when using RLC AM mode. I had setup a simulation that was just to see how much data I could push through (no errors, 100 resource blocks downlink, 1 eNodeB, 1 phone, 1 remote server, UDP application). When I did this using RLC UM I could get a downlink throughput of about 60 Mbps. However when I tried RLC AM I only got about 12 Mbps. When I looked into this I came across the same issues mentioned here:
After this I decided to make some modifications to RLC AM and I was wondering if these changes seem appropriate based on the LTE specification. I checked the spec and my changes seemed fine to me but I wanted to get a second opinion. I added partial support for NACKs in the AM header. By partial I mean I added the ability for the receiver to NACK entire PDUs but not portions of PDUs. In the RLC spec the AM header can contain SO start and end fields to indicate that just part of a PDU is lost. I did not do this since it is not needed for my thesis work and instead just added code so a list of NACKs could be given to the header and serialized/deserialized properly. I then changed the transmitting side so that only PDUs that have been NACKed can be put into the retransmission buffer. I modified the transmission window so that once the window wraps around an ACK for a smaller sequence number would also ACK everything up to and including SN 1023. I also commented out the code for moving items from the TXed buffer to the retransmission buffer when there was no other data to send. When I re-ran my tests I found that my modified RLC AM got me the same throughput as when I used RLC UM. Since my simulation had no errors I had no retransmissions while using AM. I also ran some tests where I dropped certain PDUs and the NACKs reported in the header and the retransmission seemed to work fine. If anyone could indicate if my changes seem appropriate or if I missed some aspect of the specification then that would be greatly appreciated. Thank you.
-Brett
--
You received this message because you are subscribed to a topic in the Google Groups "ns-3-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ns-3-users/CEfmMX3IRBw/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ns-3-users+...@googlegroups.com.
you can run the new test suite like this:
NS_LOG=TestLteRlcHeader ./waf --run test-runner --command="%s --suite=lte-rlc-header"
Currently the test fails. I suspect that the deserialization of the NACK is not done correctl, In fact, looking at the code, my impression is that deserialization might not handle correctly odd vs even NACK SN.
If anyone could give this a try, and provide further feedback, it would be very much appreciated!
Regards,
Nicola
assert failed. cond="Check (m_current)", msg="You have attempted to write after the end of the available buffer space. This usually indicates that Header::GetSerializedSize returned a size which is too small compared to what Header::Serialize is actually using.", file=./ns3/buffer.h, line=693
terminate called without an active exception
When I looked into this I found that the m_headerLength was equal to 0. I think this is because line 122 of the test class test-lte-rlc-header.cc creates the LteRlcAmHeader object but it never calls SetControlPdu to set the base m_headerLength to 2. As a result the test sets an ACK number and appears to have no NACKs to set (at least when I ran it the for loop did not have any NACKs to add). Then line 130 calls p->AddHeader, which fails since the m_headerLength is still 0. Was there something that I missed about running this test?
-Brett
I think there is an issue with my PushNack method over adding to the length of the header. The code is written like:
if (m_nackSnList.size () % 2 != 0)
but I think it should be
if (m_nackSnList.size () % 2 == 0)
The reason for this is that if we add a new NACK and this gives us an even number of NACKs the header length should increase by 1. If adding the new NACK gives us an odd number of NACKs then the header length should be increased by 2.
For each NACK we need to follow with an E1 and E2 value, the NACK is 10 bits long so each new NACK is 12 more bits in the header. The initial header for the STATUS message is of size 2 because the D/C, CPT and ACK make up 14 bits. Then we have an E1 value and the list of NACKSs. So for the first NACK the size of the list is 1 and we add 2 to the size of the header to make the header length 4. The 12 bits for the first NACK, E1 and E2 gives us a header like (note following is an ACK of 8 and NACK of 1, E1 is 1 because I am going to continue the example):
00000000
00100010
00000000
110
In the current code using != in the PushNack means an odd number of NACKs would only add 1 octet to the header. If that was used then the header length would have come up as 3 and the last bit of the NACK along with the E1 and E2 fields would have been lost.
Back to using == in PushNack if we add another NACK to the list we have an even number so we add 1 to the size of the header to make 5. The header is now (same as before but my new NACK is 2 and its following E1 is 0):
00000000
00100010
00000000
11000000
0001000
This creates a pattern where an odd number of NACKs will require 2 more octets to the header and adding an even number of NACKs requires 1 more octet. This only works because the SOstart and SOend fields of the RLC AM header are not in use. So I think the error over having odd and even number NACKs is at least in part due to the if statement in the PushNack method. I need to look into this more to find any other issues but I think this is one of the current bugs.Nicola,
I originally made my changes to the window wrap around before I found out that the SequenceNumber10 object overloaded the < operator. This was something pointed out to me by Koray Kokten who also pointed out that there was a bug related to this that was reported and fixed in https://www.nsnam.org/bugzilla/show_bug.cgi?id=1756. Koray pointed this out after I posted my code so I did not get a chance to change it. So since this is already working properly my code towards the window wrapping can be removed.
As to my misunderstanding on the use of ACK and NACK perhaps you can help me. I originally thought that the ACK_SN was to acknowledge the largest sequence number received so far and that the NACK_SNs were to negatively acknowledge any PDUs that the receiver side knew was missing. I think I developed this misunderstanding from miss-reading the specification.
I was reading about the receiver side in status reporting in 3GPP TS 36.322 V8.8.0 section 5.2.3 and it says that the ACK_SN of the status message is set to the SN of the next not received RLC Data PDU which is not indicated as missing in the resulting STATUS PDU. According to section 5.2.3 the values for NACK_SN are found by examining the receiving side reception window from VR(R) <= SN < VR(MS). Each AMD PDU in this range that has no byte segments received gets a NACK and any PDU that is not completely received gets a NACK with an SO start and SO end. VR(MS) is according to section 7.1 the highest possible value of the SN which can be indicated by ACK_SN. Based on this I thought it was possible to have an ACK_SN which is equal to VR(MS) but still have NACK_SNs that are smaller than the ACK_SN.
You say that the spec shows that ACK_SN is the lower bound of the transmit window. In section 7.1 it says that VT(A) is the Acknowledgmenet state variable and that this variable holds the value of the SN of the next AMD PDU for which a positive acknowledgment is to be received in-sequence and that it is updated whenever the AM RLC entity receives a positive acknowledgment for an AMD PDU with SN=VT(A). So I thought that VT(A) was the SN after the last in sequence PDU, which indicated to me that you could have an ACK for a higher sequence number but you also received a NACK that was smaller than that ACK. For instance I thought you could have VT(A) = 5 and get a status message that with an ACK_SN of 10 and a NACK_SN of 8. Then I thought you would increment VT(A) to 8 as you have ACKEd SN 5, 6, 7 and 9 but you increment VT(A) to go after the last in sequence ACK. A future status message that does not NACK SN 8 would then allow you to grow VT(A) past this point.
If you can only NACK sequence numbers that are larger than the ACK then I would assume this passage would be re-worded to just say that you set VT(A) to the ACK.
Also only ACKing the last in sequence received PDU seems very wasteful. If the receiver gets PDUs 1, 2, 3, 5, 6, 7, 8, 9, 10 and they are missing PDU 4 then they would send back an ACK of 4 indicating that they got PDUs 1 - 3 in sequence. The transmitter would then have to retransmit 4, 5, 6, 7, 8, 9 and 10. You are retransmitting 6 PDUs that the receiver already got. I thought the purpose of negative acknowledgements was so you could send back an ACK of 11 and NACK of 4 so the transmitter knows they only have to resend 4?
As to my use of VR(H) the spec says that VR(H) is the highest received state variable. It is the SN following the SN of the PDU with the highest SN among the received RLC data PDUs. If ACKs and NACKs worked the way I thought they did then this seems like the correct value for the ACK. In some cases I think VR(H) would be equal to VR(MS) but not always.
- Detection of reception failure of an RLC data PDU:
- The receiving side of an AM RLC entity shall trigger a STATUS report when t-Reordering expires.
If I understand this correctly then I think it means that when t-Reordering expires if there is a missing RLC PDU then the receiver will send a Status report without needing to receive a poll request. If that is correct then we can probably fix this without the need of sending PDUs from the transmitted buffer. However if my interpretation of this part of the spec is incorrect and this does not fix this last issue then I think it would be better to push what is currently available for supporting NACKs. Could you check this part of the spec and let me know what you think it is referring to?In my opinion the problem of transmitting from the transmitted buffer is the following:
When something is transmitted from the transmitted buffer it automatically moved to the retransmission. Consequently, event if data arrives before the next Tx opportunity, the data form the retransmitted buffer is again transmitted before data from the transmission buffer. This is not correct logic since the data has nit yet been acked or nacked.
Is there an issue if the Tx opportunity is just let go?
One novice question: To incorporate the current changest on lte-rlc-am, I should be working on the dev release, right?
By the way, is the AM supposed to guarantee that all errors will be corrected?Is it a full fledged reliable protocol such as TCP?I am not sure of this. If that is not the case then the test is simply saying that 2 packets out of 100 was lost when the error rate is set to 10%. Which is correcting most of the error but not all. Why would it be called Acknowledged Mode and not Reliable Mode?
Anyway, I will look into it.1. I downloaded the relevant files lte-rlc-am.cc/h and lte-rlc-am-header.cc/h and replaced the local copy and wafed it. I am still learning the project tool. Is there an easier way tp do this?
Hey,For a simple comparison purpose of a TCP application under RLC_UM and RLC_AM modes in LTE, I have written the sample script which is a kind of the combination of lena-simple-epc.cc and sixth.cc. However, when I check the .pcap file generated by ns-3 in the RL_AM mode scenario, I see a weird situation that a couple of seconds later, the TCP traffic is cut by the TCP stack, despite the application last until the end of the simulation (Sim. duration is 50 sec). On the other hand I don't see such a weird behavior in RLC_UM mode. I can see TCP Flows between server and client (where client is the UE Device) until the end of the simulation. For examining what is going wrong with RLC_AM mode, I have included some additional packet based RLC tracing system into the source code, and I see that right after the sequence number variable of the LteRlcAm class overflows for the first time (I mean the Sequence number values in RLC PDUs are modulo 1024), the RLC_AM Mode peer at the ENB side starts sending the same PDU from the re-transmission buffer over and over again until the end of the sim. So is it about a bug in RLC_AM mode of LTE Module or am I doing something wrong?Thanks in advance.PS: The sample script file is attached to the e-mail.Koray
Dipak,
I see what you are saying and I agree. The RLC spec does say that the PDU gets re-segmented so that a portion of it can be sent during that transmission opportunity. To get this to work the code needs to be changed to allow the segmentation to happen. Also the code for setting up the ACK/NACK in the status message would need to change so it would support the SOstart and SOend fields to indicate NACKs of specific portions of PDUs. At the moment I am working on finishing my thesis so I am not sure how much time I have to make further changes to the code. However I would be happy to do what I can.
I can see in the RLC code that there are some references to FIRST_SEGMENT, MIDDLE_SEGMENT and LAST_SEGMENT for sending data from the transmission buffer. Is this segmentation already working for the transmission buffer and just needs to be added to the retransmission buffer?
-Brett Levasseur
Parameter |
Value |
Number of RB |
RB = 25 |
Antenna mode |
SISO |
RLC mode |
UM or AM |
Error mode of control |
Deactivate |
Error mode of data |
Deactivate |
HARQ |
Enabled |
MAC Scheduler |
Proportional Fair |
MSS |
536 bytes |
TCP |
Westwood Plus, Tahoe, New Reno, Reno |
Simulation time |
60s |
The throughput results showed always RLC_UM (~16Mbps) better than RLC_AM (~10Mbps) without errors for all TCP types.
If this is a Issue should I solve it with a patch? Can you please help?
Best Regards,
Carlos
...PASS