When the program exits it has to stop the streaming of the USRP.
The function exit_fun is supposed to do that. When quitting with
control+c (very common case) this function is not called. The
code is very unclear there, so let's add a stop_rf in the RU,
as there is already a start_rf.
If we don't call trx_end_func, then at the next run the USRP
device may be in an unstable state and behave improperly.
If the program crashes then the USRP device may be in an
unstable state. The only solution to this problem is to reset
the USRP device.
Maybe there is a way to clean the state of the device when we
open it, before we start using it. Sort of a cleanup before
use. That could be a better solution to "bad state after program
crash".
What has been tested:
- monolithic eNB only
The one in lte-enb.c disrupts the realtime. Using a B200mini with
20MHz bandwidth leads to the UE unable to connect for it seesms like
the UL and DL are not properly time synched because of this sleep
of one second that happens after the USRP streaming has started.
We see some random access attempts but the decoded preamble is
wrong.
This may be dependant on the setup. I had sporadic errors with
a B210, where sometimes the UE could connect and sometimes not.
The code was very unclear and potentially buggy.
This new version is more robust.
We can waste up to 2 bytes because the last header in the MAC PDU
does not contain a length field and when we request data from RLC
we suppose a 3-bytes MAC header. This might be optimized at some
point, but the benefit would be low.
This commit also contains some general cleanup:
- formatting
- variables' types: let's use 'int' instead of trying to be clever
by using small types that may generate bugs if the value is
too big
- remove 'tpc_accumulated' which was globally used for all UEs
and has no purpose other than logging. We may want to rework
a bit the TPC machinery at some point. As the code is today
we may repeatedly send TPC over and over without caring about
the 3GPP limits, in which case no one knows how the UE is
supposed to behave: does it clamp the current max value or does
it accumulate over and over and take the clamped value to compute
its actual power? If we send a reverse TPC (reduce power instead
of increase) does it do it immediately or does it have to decrease
n+1 times if we previously ordered it to increase n times?)
We do not address the problem of prioritizing LCIDs. As of today there
is only one dedicated traffic channel (DTCH), so it's not a problem
at this point.
What has been tested:
- monolithic eNB 5/10/20MHz with one cots UE, TCP/UDP UL/DL. At 20MHz the
machine used was not capable of keeping up, generating lots of Us
and Ls when the throughput reaches 60Mb/s. USRP B210 was used.
Running TCP DL traffic with one connected UE showed a lot of
fluctuations in throughput. After analysis it was found that
sometimes the RLC UM PDU was not correct. It contained one byte
more than it should. On the receiver side, the TCP packet
contained in the RLC packet seems to be rejected by the TCP
stack of the UE (it has one byte more than it should),
leading to a brutal reduction of the throughput, probably due
to some congestion detection in the TCP implementation.
Or something.
This hotfix seems to solve the problem. Using iperf in downlink
with a 5MHz eNB, we see no more fluctuations, the traffic is
very steady at 16.8Mb/s, as reported by the iperf server running
on the phone. (17.5 in the PHY plot of the T tracer.)
A rewrite of both the MAC and RLC UM packet generation is needed.
The code is way too complex for what it does and may contain
several similar problems that only trigger in specific rare
conditions.
The problem is the following (as reported by an user):
"one UE is attached to OAI system. UE is near the antenna. Try to detach
the UE and attach again. Repeat this procedure for 5-6 times. OAI system
does not work and any the UE can not attach to this system. I use TEMS
software and I can see MIB signaling on this UE but UE can not decode SIB1
and SIB2."
What happens is that the DCI for SIB1 and SIB2 is not cleared before
use. That is the bits in the 'padding' field keep the values that were
set before. If the structure has been used to transmit other DCIs
(eg. for UEs) in the past, it may be reused with some of those bits set
to 1. When receiving this DCI, the UE won't accept it because it
gets some bits at 1 where it expects them to be 0.
The short-term/quick solution is to clear the 'padding' field.
A better solution would be to rewrite this part of the code,
which is way too complicated for what it does. But this takes
too much time.
In dci.h the field 'dummy' of some structures was renamed to 'padding'.
The fields 'padding32' and 'padding64' were also renamed to 'padding'
for consistency.
Some structures (DCI2B_1_5MHz_TDD, DCI2B_10MHz_FDD, DCI2D_1_5MHz_FDD,
DCI2D_5MHz_FDD, DCI2D_10MHz_FDD) had a 'padding' field at the end, which
was renamed to 'padding0'. I don't know if this field should be here at all.
To me this field looks very suspicious. When we test DCIs 2B and 2D we
should be careful.
(cherry picked from commit c5ca2bd862)
Summary of changes:
- fix dlsim/ulsim
- fix centOS compilation
- Move the accounting phase of the DL pre-processor in a separate procedure
and fix some issues
- additional Mac stats and Improvements
- minor fix in test setup v2
With value 4 when connecting one UE and doing some downlink
iperf TCP there is a crash. Probably due to the multiple wrong
RA detected leading to uplink failure of fake UE that never
sends Msg3 (because, well, there is no other UE).
This is another problem that will be fixed at some point.
Anyway, this value 4 fails. Let's put back 3.