Commit Graph
100 Commits
Author SHA1 Message Date
Cedric Roux 6e5511b220 bugfix: use an array of size NGAP_MAX_DRBS_PER_UE for drb_priority
It may happen that the drb to configure is not 1, so we may need
this array in rrc_gNB_generate_dedicatedRRCReconfiguration().

Not tested, this commit is mostly to harmonize with other places in
openair2/RRC/NR/rrc_gNB.c
2023-04-15 21:26:24 +02:00
Cedric Roux bf10230185 bugfix: use correct index in array
Accelleran CU configures DRB ID 4, not 1, so we need to take index 3
in the array 'priority', not 0.

So let's use i-1 as it was before.
2023-04-15 20:20:10 +02:00
Cedric Roux 733c7e5e89 bugfix: change memory management of interface between PHY and MAC scheduler
This commit fixes a bug caused by global variables in the gNB_MAC_INST
structure used to transfer MAC scheduler's results to the PHY layer.

When using several threads in the PHY layer, it may happen that the
MAC scheduler is called a second time by the second PHY thread for the
next slot before the content of the global variables in the gNB_MAC_INST
structure used to store the result of the MAC scheduler for the current
slot have been consumed by the first thread, leading to unpredictable
results (all of them certainly wrong).

The solution is to introduce a small memory management module for the
interface between the PHY threads and the MAC scheduler. The MAC
scheduler now fills the data structures passed to it, and not a
global variable anymore. The PHY layer manages the structures and
ensures that no data is overwritten before being fully consumed by
the various threads of the PHY layer.

Some care has to be taken because several PHY threads will access the
same structures at the same time for a given slot (in read mode, so
it's okay). A mechanism of reference counting has thus been introduced.

Only one CC is supported. This restriction should not be too hard
to remove if/when needed. (The code before this commit does not seem
to work for more than one CC anyway.)
2023-04-05 16:39:12 +02:00
Cedric Roux 50bf571347 hack: see "Bye." message when quitting gnb running with aw2s
For some (unclear) reason, nr-softmodem with aw2s device does not print
"Bye." when stopping it with control+c, which is problematic in the CI.

This little hack solves the problem.

(Maybe not the right solution, to be changed if needed.)
2023-03-30 12:57:10 +02:00
Cedric Roux a4718d4a16 bugfix: LDPC decoding in the gNB: clear d properly
The d array has to be cleared at the first usage, which may not necessarily
be when new_rx is true. For example, in case of DTX detected for a first
transmission, the next transmission won't have new_rx true, so d won't be
cleared, containing data from a previous transmission. Or when a LDPC
decoding is cancelled for a segment when new_rx is true, a decoding for
a retransmission will not clear d because then new_rx will not be true.
(Yes, the logic of cancellation will be changed in the future, but the
changes will be orthogonal to the ones of this commit.)

new_rx is removed.
2023-03-23 17:18:50 +01:00
Cedric Roux 39c42bca41 bugfix: bad usage of T() in the log module
The LOG_x() and T() logic was wrong.

LOG_x() goes to the terminal when T_stdout == 1 or T_stdout == 2.
It goes to T() when T_stdout == 0 or T_stdout == 2.

The call T() does the check for T_stdout == 0 or T_stdout == 2.
So we have to call it out of the check "if (T_stdout)".

So, well, let's fix that.

Some spacing was fixed as well. clang-format may complain.
2023-03-10 12:10:08 +01:00
Cedric Roux 3084ae89dd bugfix: set max priority to trx_usrp_write_thread 2023-03-04 16:42:01 +01:00
Cedric Roux 6315dae4ca minor typo 2023-02-25 13:45:52 +01:00
Cedric Roux f64ed09574 bugfix: increase size of nrb
We can have 273 RBs, so 8 bits to store the number of RBs is not enough.
16 bits ought to be enough for anybody.
2023-02-23 21:36:46 +01:00
Cedric Roux a4eeefc13f support old versions of openssl
Needed for ubuntu 16 and centos 7.
2023-02-23 21:35:26 +01:00
Cedric Roux 16b0b5f0ec bugfix: length type too short
On a setup, length of cellGroupConfig was > 255.

Using uint8_t to store the length is thus wrong
and gives a bad encoding of the cellGroupConfig.

So let's use uint32_t to store length instead of uint8_t.
2023-02-15 22:50:40 +01:00
Cedric Roux 344f8b75e6 bugfix: try to handle USRP devices correctly to avoid crashes
Some problems when we release the device:

    - Calling the destructors is wrong, we should set the pointers to NULL.
      These are shared pointers, this is C++.
    - We have to stop rx by doing a STREAM_MODE_STOP_CONTINUOUS.
    - The end-of-burst for tx has been simplified.

This problem when we acquire the device:

    - Calling get_rx_stream() many times seems to be problematic.

We now should have a better behavior with UHD 4.2 and N310. (Hopefully with
others too.) No crash seen so far.
2023-02-04 23:37:58 +01:00
Cedric Roux 698122d6d2 bugfix: fix sdap
There was a problem testing accelleran cu + oai du + oai ue + rfsim
because accelleran cu configures sdap header for UL but not for DL
and our sdap implementation deals with either "no sdap header at all"
or "sdap headers for both UL and DL".

The code has been modified to deal with the other cases
("sdap header for UL but not DL" and "sdap header for DL but not UL").

has_sdapDLheader and has_sdapULheader have been removed, has_sdap
too, replaced by has_sdap_rx and has_sdap_tx, which makes the code
independant of ue or gnb and is, I think, clearer.

With this work, accelleran cu + oai du + oai ue + rfsim works. We
also have oai gnb + oai ue + rfsim functional for all cases of sdap
header configuration (this won't happen for users, the code of gnb has to
be modified to have sdap header for only ul or only dl). It also works
with a COTS UE for all cases of sdap configuration (again, this won't
happen for users, only "no sdap header" and "sdap headers for both
UL and DL" exist in oai gnb with the current code).

To have other cases, you can edit openair2/RRC/NR/rrc_gNB_radio_bearers.c
and search for NR_SDAP_Config__sdap_HeaderDL_present in there.

To enable sdap, run the gnb with the command line argument
--gNBs.[0].enable_sdap 1
2023-01-22 00:09:22 +01:00
Cedric Roux 565b8482f9 remove patch in install_simde_from_source()
upstream took it
2023-01-18 13:01:37 +01:00
Cedric Roux fc7bcceca9 fix a small bug and add a log for when recvfrom() fails
recvfrom() returns ssize_t, not size_t.
2023-01-18 10:23:37 +01:00
Cedric Roux 08e57ca313 bugfix: use correct size in malloc() 2023-01-17 15:03:44 +01:00
Cedric Roux 3674a6f0f2 bugfix: initialize all variables of the 'context' thing
There was a problem in rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND()
where we PROTOCOL_CTXT_SET_BY_INSTANCE() that does not initialize
eNB_index leading to a crash later on in pdcp. So let's initialize
everything.

Plus, while we're here, use do { } while(0) in the macros, just to avoid
problems like:

  if (condition)
    macro;

Without do { } while(0) only the first statement of the macro is done
in the if. (Not sure if the code has the problem somewhere, but doesn't
hurt to fix.)
2023-01-17 13:19:30 +01:00
Cedric Roux 924d88bbf9 bugfix: avoid a crash when oai_exit is set
There was a crash when we exit the nr softmodem with AW2S device.
The array rxbase[] was surely freed() by some other thread, so
let's not access it after detecting oai_exit != 0.

We also need to unblock a possible reader thread. The chosen way to
do may be not the best. To be checked.
2023-01-17 13:06:25 +01:00
Cedric Roux 551aee172a bugfix CU/DU: use correct IP address for GTP-U
Not only the teid is received from the DU but also the IP address. We
have to use it too.

Also, don't connect the UDP socket. The parameter remote_s_address in the
configuration file must not be used, at least not for gtp-u because the
IP address is received from the DU (plus for later, for multiple DUs, it
won't work at all).
2023-01-09 15:19:07 +01:00
Cedric Roux 3cd4b3c3fa fixes some issues found by review
- AssertFatal() in nr_rlc_srb0_recv_sdu() if the srb0 is not found
- do_RRCSetup() may return -1, handle it properly
- do_RRCReject() may return -1, handle it properly
- remove one switch in rrc_gNB_generate_RRCReject()
2022-11-29 15:22:46 +01:00
Cedric Roux 5d92e0d730 NR DU: nr rrc: hotfix: set default priority correctly
Using Accelleran CU, the DRB ID is 4 (not 1), we need to set and access
the array 'drb_priority' correctly in the DU specific functions.

Before this commit, we had the following error:
[NR_MAC]   ASN1 message CellGroupConfig encoding failed (rlc-BearerToAddModList, 18446744073709551615)!
2022-11-28 15:33:13 +01:00
Cedric Roux 231c2f3c5f gnb: remove srb0 shared global variable - use RLC module instead 2022-11-25 17:31:03 +01:00
Cedric Roux 7853673db7 f1 du: little hackish fix to get correct drb
I have a more complex fix that I'll put in a later merge request. That does
the job for the time being.
2022-11-09 17:00:11 +01:00
Cedric Roux df45820f71 f1 du: get IP address for UL UP GTP tunnel from the right place 2022-11-09 15:43:22 +01:00
Cedric Roux d2f456e089 bugfix: call nr_rlc_get_available_tx_space() with lcid, not rb id 2022-11-09 15:42:50 +01:00
Cedric Roux d4356efc70 f1 du: get list of sst/sd from configuration file
may not be the best place to get data from conf file, to be refined later
if needed
2022-11-09 12:40:41 +01:00
Cedric Roux 3b42e46cf0 nr rlc: add enum for rlc mode (am, um, or tm) 2022-09-06 15:58:47 +02:00
Cedric Roux 2c08302c89 nr rlc: fix in process_control_pdu()
the following:

         if (cur_wait_list == entity->wait_end)
           end_wait_list = prev_wait_list;

was done after cur_wait_list is updated to its new value, but the old value
has to be used in this test. So end_wait_list was not set properly.

This was leading to random crashes later on because then entity->wait_list
was NULL but entity->wait_end was not (because of the bug fixed by this
commit).

The new value for cur_wait_list is also now set using prev_wait_list->next
just before the goto, as done in other places in the code.

Also "cur" was removed, for it has no purpose and makes the code harder
to understand.
2022-09-05 16:29:51 +02:00
Cedric Roux af6059d4ab clang-format: open-brace at column one to start the body of a function 2022-08-26 20:14:40 +02:00
Cedric Roux 3e2d88907b use bool, not int 2022-08-18 17:07:04 +02:00
Cedric Roux 0618812554 T tracer: simplify
- don't call exit() if get_message() fails, simply terminate the thread and
  disable the T tracer
- T_dont_fork disappears, monitor_and_kill() as well, so now it's only 2
  processes: the main (enb/gnb/ue) and the local tracer
2022-08-16 14:44:23 +02:00
Cedric Roux 1b029be058 nr rlc stats: make avg time to tx optional
Introduce the function nr_rlc_activate_avg_time_to_tx() to
activate/deactivate collection of avg time to tx stats (which
may have an impact on realtime processing, so better not compute
them when not needed).

Fix a little bug in time_average_get_average() for when there is not stat.
2022-08-12 12:19:09 +02:00
Cedric Roux fad3f23164 Add RLC stats: avg time to tx for an RLC SDU 2022-08-12 12:19:09 +02:00
Cedric Roux ee7aca5d05 ngap: minor fix: access the array correctly 2022-08-09 12:22:40 +02:00
Cedric Roux 3155ec6df8 gtp: small fix: set E if there is an extension header 2022-08-03 10:34:12 +02:00
Cedric Roux 667b8e5eed nr_pdcp: nia1 implementation
We reuse existing code from eia1 for actual computation. Maybe not the most
efficient. To be revised if needed.

Some hacks in CMakeLists.txt were introduced to compile
phy simulators. To be removed at some point.
2022-07-21 16:59:38 +02:00
Cedric Roux 4505e780c5 nr rlc: minor: update tests
Behavior for ack/nack generation has changed not too long ago but the tests
were not checked and updated.
2022-06-23 11:44:01 +02:00
Cedric Roux 2802418c34 remove debug printf 2022-06-21 16:43:54 +02:00
Cedric Roux d0fa56b1de compilation fix 2022-06-20 15:15:11 +02:00
Cedric Roux 5cd674483b Merge remote-tracking branch 'origin/develop' into F1_interop_ACC_n78 2022-06-19 18:41:27 +02:00
Cedric Roux 2bed0352fd f1: remove hardcoded value, set to what is in develop 2022-06-19 18:33:57 +02:00
Cedric Roux 2521e46593 Merge remote-tracking branch 'origin/F1C_extensions_develop' into F1_interop_ACC_n78
Conflicts:
	openair2/F1AP/f1ap_du_interface_management.c
	openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
	openair2/LAYER2/NR_MAC_gNB/main.c
	openair2/RRC/NR/MESSAGES/asn1_msg.c
	openair2/RRC/NR/MESSAGES/asn1_msg.h
	openair2/RRC/NR/rrc_gNB.c
	openair3/ocp-gtpu/gtp_itf.cpp
2022-06-15 11:28:37 +02:00
Cedric Roux 33b69bdf30 nr rlc: bugfix: use hard-coded mapping between drb ID and mac lcid
This will probably impact negatively the Accelleran interoperability
but the previous version is not correct and breaks the oai nr ue.

To be checked in a CU/DU scenario with Accelleran.
2022-06-13 18:28:07 +02:00
Cedric Roux 1ad8f254c2 Merge remote-tracking branch 'origin/develop' into F1_interop_ACC_n78 2022-06-13 16:59:59 +02:00
Cedric Roux f71766c3ee Merge remote-tracking branch 'origin/develop' into F1_interop_ACC_n78
Conflicts:
	openair2/F1AP/f1ap_du_ue_context_management.c
	openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
	openair2/RRC/NR/MESSAGES/asn1_msg.h
	openair2/RRC/NR/rrc_gNB.c
	openair3/ocp-gtpu/gtp_itf.cpp

There were some important conflicts in openair3/ocp-gtpu/gtp_itf.cpp
I rewrote a bit the function Gtpv1uHandleGpdu(). It might have been
done wrongly.
To be tested and fixed if needed.

To redo the merge, if needed:
git checkout 9b2a163ebb
git merge 5ea828e149
2022-06-08 15:48:24 +02:00
Cedric Roux 4b4e419aba nr rlc: fix NR RLC AM status generation
Several problems were found and fixed.
2022-04-21 16:47:27 +02:00
Cedric Roux 8b0be9cf87 nr rlc: speedup ack/nack reception
The code completely changed, expect problems.
2022-04-15 12:20:02 +02:00
Cedric Roux 78f0c8ff29 nr rlc: harmonize computation of sn_count
Functions generate_missing() and missing_size() had different
computations of sn_count. Not sure if it is a problem or not,
but let's do the same in both functions.

Hopefully the computation is correct.
2022-02-20 16:00:54 +01:00
Cedric Roux 7c652df820 nr rlc: bugfix - so_end was used instead of sn_end 2022-02-20 15:56:56 +01:00
Cedric Roux 52d75940be fix macpdu2wireshark
Somehow this file was in a bad state...
2022-02-11 10:36:00 +01:00
Cedric Roux e5a3bcdc33 nr-ue: fix T tracer
T tracer was not functional anymore. because init_tpools() was called
before T_Config_Init().

The problem was that init_tpools() creates some threads and T_Config_Init()
does call fork() and the child process (which is the one running the
softmodem, the parent process is used to monitor it, this is the design
of the T tracer, maybe to change at some point, it's too complicated) has
no thread after the fork(). The threads created by init_tpools() are gone.
Game over.

In conclusion: T_Config_Init() has to be called very early in the life of
the softmodem, at least before init_tpools().
2022-02-09 14:07:41 +01:00
Cedric Roux 1409e3bcb4 nr-ue: fix T tracer
T tracer was not functional anymore. because init_tpools() was called
before T_Config_Init().

The problem was that init_tpools() creates some threads and T_Config_Init()
does call fork() and the child process (which is the one running the
softmodem, the parent process is used to monitor it, this is the design
of the T tracer, maybe to change at some point, it's too complicated) has
no thread after the fork(). The threads created by init_tpools() are gone.
Game over.

In conclusion: T_Config_Init() has to be called very early in the life of
the softmodem, at least before init_tpools().
2022-02-09 10:22:01 +01:00
Cedric Roux 92c5115f13 lte: fixes in EpsNetworkFeatureSupport.c
We have to eat all the bytes, not only one.
We have to get the bit we want from the right buffer position.

Note: only one bit is supported from this "EPS network feature support",
not sure how to properly deal with it, so let's keep the code as it is.

This commit was made because the MAGMA MME sends "EPS network feature
support" to the UE in the NAS message "Attach Accept". OAI MME does not
send this. So the bug about size was not seen.
2022-02-04 16:32:49 +01:00
Cedric Roux fe4c988c97 nr ue: fix security setting of DRB
Maybe this fix won't work for non-openair gNB. We use the same keys and
algorithms as for SRBs, which is what openair gNB does.

(I hope I'm right there.)

To be changed if needed.
2022-01-24 15:56:45 +01:00
Cedric Roux de72d53c21 nr ue: fix rlc and pdcp tick generation
Ticks have to come every millisecond. The code was calling tick
only for DL slots.

(This whole logic will change at some point, this tick mechanism is not
good. But in the meantime, let's fix anyway.)
2022-01-11 11:04:48 +01:00
Cedric Roux fe81d31ea3 compilation warnings fixes
The previous commit created two new warnings:

    warning: 'avgs' may be used uninitialized in this function
    warning: 'seq_index' may be used uninitialized in this function

This commit removes them.

Maybe it's not the correct solution. To be fixed if needed.
2022-01-11 11:04:00 +01:00
Cedric Roux 0806734254 T tracer: add option to have both T traces and regular console logs
Use --T_stdout 2 to have both.

--T_stdout 0 is still the way to have only T traces and no console logs.
2022-01-11 11:04:00 +01:00
Cedric Roux d67b46a1a5 nr pdcp: introduce a thread to do pdcp_data_ind
Before this commit, pdcp_data_ind is done in the realtime PHY/MAC
thread, and this may have an impact on realtime performances.

Let's introduce a new thread to do the job, freeing the realtime
PHY/MAC logic.

This is not a minor change. It may have positive and/or negative
effects. To be tested carefully.
2021-12-13 15:00:45 +01:00
Cedric Roux a764c7c932 nr rlc: trigger status report when t-reassembly expires
and update tests that fail because of the new logic
2021-12-07 11:46:18 +01:00
Cedric Roux f64d2c58cb nr rlc: reduce "buffer full" log 2021-12-07 11:46:18 +01:00
Cedric Roux d4c4fdf7f3 T tracer: add harq pid in nr ul/dl/dl retx traces 2021-11-25 15:59:40 +01:00
Cedric Roux 1495a6b01f nr rlc: speedup buffer status computation
TX and ReTX should be faster now (for RLC AM, UM and TM).

RLC AM Status (function nr_rlc_entity_am.c:status_size()) was not modified,
so its CPU usage is the same as before. (It's more complicated to change
than for TX and ReTX.)
2021-11-25 11:27:49 +01:00
Cedric Roux b65b0e2eaf T tracer: trace MAC DL retransmission PDUs in the gnb
and adapt macpdu2wireshark to deal with them
2021-11-25 11:27:17 +01:00
Cedric Roux 2fb5ec3a5f T tracer: trace MAC DL retransmission PDUs in the gnb
and adapt macpdu2wireshark to deal with them
2021-11-23 11:28:20 +00:00
Cedric Roux 0429d3d410 nr-rlc: bugfix: copy correct part of PDUs in case of segmentation 2021-09-08 17:18:20 +01:00
Cedric Roux 5ac4ae361a minor: T tracer: be more verbose for DLSCH DCI 2021-09-07 13:33:45 +02:00
Cedric Roux 36bae67eef nr-rlc: bugfix: copy correct part of PDUs in case of segmentation 2021-09-07 13:16:39 +02:00
Cedric Roux 58904eaab8 cleanup: replace "eNB" by "gNB" as it should be 2021-09-07 13:08:14 +02:00
Cedric Roux 4877d56a12 nr: add security section to gnb config files
The configuration files named "gnb*conf" have been modified.
Other configuration files were left unmodified.
2021-09-06 11:06:47 +02:00
Cedric Roux eeca38368e gnb sa: improve security
Note: some modifications have been done to the UE too, but for syntactic
reasons. The UE may fail to work, not tested.

For the UE, we have the problem of handling properly SecurityModeCommand.
We don't verify its integrity. This is a bit complicated to handle properly
and may require some API changes in the PDCP layer. So, as of today, the
integrity of this message is not verified.

Also, NSA mode has been touched, but it should not be a problem. But not
tested, so not sure.
2021-09-06 11:06:47 +02:00
Cedric Roux 6bf2874711 nr: add T trace for msg4 (rrc setup) 2021-08-23 17:09:25 +02:00
Cedric Roux 4a2c0b1eff bugfix: fix allocation of RBGs for retransmission
When there is a retransmission, we want to use the same number of RBs.

The RBs are allocated by groups (RBGs).

In some cases (like a cell with 25 PRBs), the last RBG contains less RBs.
So in case of a retransmission, if this last RBG was used before we need
to reuse it to have the same number of RBs. If not, we will use more RBs
for the retransmission than the previous transmission.

In an experiment with two UEs (quectel modules) it was seen that when a
retransmission happens with a different number of RBs then the UE is not
happy at all, leading to way more NACKs in the harq processes than should
happen (actually the first NACK was not a NACK at all, but the eNB did
interpret it as a NACK; so the next transmission should simply be discarded
by the UE that successfully received the first transmission; instead the UE
fails to decode the data and sends a NACK, a real one this time).

Maybe it's not the correct solution, but it improve things, there are
much less NACKs.
2021-07-21 23:22:48 +02:00
Cedric Roux f6e0321860 hack: do not use BCH RBs for DL scheduling in subframe 0
The problem is that when using those RBs with MCS 28 we may exceed the
code rate 0.93 and according to 36.213 7.1.7 the UE may skip decoding
PDSCH entirely in this case.

This is a hack. The real solution is to check that the code rate is below
0.93 for each scheduling decision and, I don't know, reduce the MCS if the
code rate is above, so that in the end it is below. That means that we need
a proper resource grid for the configuration of the eNB and this is not an
easy thing (at least from my point of view) given all the possible
configurations for the eNB, so I prefer not to do it rather than do something
incorrect, thus this hack.

The problem of this hack is that we won't use all the available RBs for
scheduling, potentially reducing the maximum throughput achievable.

To be fixed properly at some time, by someone who understands fully the
resource grid and all the possible combinations (fdd/tdd, number of
antennas, whatever else).
2021-07-21 23:22:02 +02:00
Cedric Roux 02cedc0ca1 nr pdcp: bugfix: better nettle version detection
This fix may fail to work.

we should stop supporting old versions of nettle at some point.
2021-05-22 12:56:52 +02:00
Cedric Roux e26c1f6f6d nr pdcp: bugfix: bad HFN computation at PDU reception 2021-05-22 12:56:43 +02:00
Cedric Roux e257f76dd0 nr: rlc: minor: set log level to error for max retx reached
Just in case there is a problem, better to see it.

max retx reached means "radio link failure". We should do
something about it at some point. For the moment, let's
inform the user that there is a problem.

We can set back to LOG_D later in time when we deal with it
properly.
2021-05-18 10:30:26 +02:00
Cedric Roux 913f402280 nr: pdcp: accept "infinity" for t-reordering
"infinity" is -1 in the code.
2021-05-18 10:30:26 +02:00
Cedric Roux 8393744c3f nr: bugfix: bad check
38.323 5.2.2.1 says:

    "if t-Reordering is running, and if RX_DELIV >= RX_REORD"

Let's do as is said.
2021-05-18 10:30:26 +02:00
Cedric Roux d2c9b7cb5a nr pdcp: bugfix: reset integrity context
CMAC_Init has to be called between each usage of the cmac context.
2021-04-29 15:15:18 +02:00
Cedric Roux 3633bcd367 nr pdcp: bugfixes
- use bearer-1 in compute_t of integrity NIA2
- compare integrity at the right place in nr_pdcp_entity_recv_pdu
- proper handling of security parameters settings (algos, keys)
2021-04-27 14:46:42 +02:00
Cedric Roux a8adcf862c sa: nr pdcp: we don't use the hash table anymore 2021-04-27 10:00:24 +02:00
Cedric Roux 9135d4200f sa: nr pdcp: improve security
This commit implements integrity and security settings for nr pdcp. It will
only work for SRBs.

This commit has not been tested. It may fail to work completely. To be checked.
2021-04-26 11:43:44 +02:00
Cedric Roux cca4ce9bf1 minor: indentation 2021-04-22 10:39:27 +02:00
Cedric Roux c63abcd0f2 nsa: x2ap: hack: exit gNB if connection to eNB failed
Exit gNB if connection to eNB failed - to be modified if needed.

We may want to try to connect over and over again until we succeed
but the modifications to the code to get this behavior are complex.

Exit on error is a simple solution.
2021-04-16 12:36:44 +02:00
Cedric Roux 1a5f10be90 bugfix: nr: free RA process when UE is removed
The bug was:
connect a phone, disconnect, repeat five times. The fifth time the phone
does not reconnect because there is no free RA process.

When an UE is removed, we have to free associated RA processes.
2021-04-06 10:40:37 +02:00
Cedric Roux 6c6b46985b x2: exit if connection between eNB and gNB breaks
Before this commit, when the gNB crashes, the eNB keeps running.
Same, if the eNB crashes, the gNB keeps running.

In a far past when this happened, the other program (the one not
crashing) was forced to exit.

Then this behavior was changed, for some reason.
But the code was not finished, so now we have a system in an inconsistent
state.

So either we accept that the connection between eNB and gNB can break,
that is one of the programs crashes, and we clean the state of the
program that keeps running. But this is a complex work and it will
surely not survive very long, because someone will change something
in the code later that will break this complex behavior.

Or, simpler, we go back to initial behavior, which is: the program that
did not crash does actually exit when the other crashes.

This commit provides the second solution.

It can easily be reverted whenever someone wants to implement the complex
solution.
2021-03-31 16:39:30 +02:00
Cedric Roux 46c1aff489 fix: do NR only if at least one gNB is connected to the eNB
We used to set 'does_nr' of an UE if we detect ENDC supported in the
UE capabilities.

Then we activate NR measurements if 'does_nr' is true.

The problem is that if the eNB is not connected to a gNB but the UE
reports some NR measurements (because a gNB is running somewhere near)
then the eNB will crash when starting the switch to NR.

A (quick) solution is to set 'does_nr' only if there is a gNB connected to
the eNB.

Maybe not the best solution. To be changed if needed.
2021-03-31 16:39:30 +02:00
Cedric Roux fe4a9b005a nr: add some comments to pdcp nia2 integrity 2021-03-30 16:01:57 +02:00
Cedric Roux 63b7ff981e bugfix: fix compilation of simulators 2021-03-30 11:57:51 +02:00
Cedric Roux 18cb68ecc2 nr pdcp: first draft of NIA2 integrity
This code has not been tested with a COTS UE. We need SRB1/2 (so we need SA)
to test.

The activation of security and integrity for SRB1 will need more code
(new functions) because it happens after some time, not at creation time
of the PDCP entity and there is no way to do this with current code.
2021-03-30 11:57:51 +02:00
Cedric Roux 14c823037f nr pdcp: bugfix: D/C bit set only for DRBs 2021-03-30 11:57:51 +02:00
Cedric Roux 9d1c24d461 nr rlc: bugfix: fix NACK with range
We do some sanity checks for incoming rlc control packets. One of them
is to check that so_start is not > so_end when present.

But when 'range' is present and bigger than 1 it means that so_start refers
to one PDU and so_end to another one. So we may well have so_start > so_end.

This commit fixes that and reorganizes a bit the code to do the check before
processing and rejecting the PDU if the values are not correct. (Before this
commit we were NACKing the whole PDUs if so_start > so_end.)
2021-03-26 15:36:43 +01:00
Cedric Roux 4ff8f8832e NR: fix: set PDCP discard timer to infinity
The discard timer is used by the PDCP layer to discard packets that were not
transmitted to RLC after some time.

We don't really need it for the moment, maybe never for the default
bearer which is a best-effort bearer passing all kind of IP traffic.
Maybe for voice over IP kind of traffic it's important, or realtime
applications.

I ran an iperf UDP uplink test and saw no error on the PHY layer but still
lots of packets lost in the iperf logs, which was very surprising. By
analyzing the logs in wireshark I saw that, with the current scheduler,
an IP packet sent by the UE took 40ms to be sent piece by piece to the
gNB, and then the next uplink IP packet was never sent at all because
the discard timer was expired, leading to the high count of packets lost
in the iperf logs.

So let's put infinity for the moment for the discard timer. From my
understanding of the moment it's not a problem. If for some reason we
should set it to some non-infinity value, then we can change later.
2021-03-10 10:30:23 +01:00
Cedric Roux 9edc8cce0a nr pdcp: improvements
Implement data transfer (38.331 5.2):
    - transmit operation (in nr_pdcp_entity_recv_sdu)
    - receive operation (in nr_pdcp_entity_recv_pdu)
    - t-Reordering expiration

To keep track of time the function nr_pdcp_wakeup_timer_thread has been
added and is called by the gNB's MAC scheduler via nr_pdcp_tick.

(The UE has not been modified.)

A thread has been introduced to set time of all the existing PDCP
entities in the system. This probably does not scale well with many
PDCP entities (many UEs connected to the gNB). To be changed at some
point when needed. Hopefully, with a few UEs this mechanism won't be
too problematic (ie. won't cause realtime problems).

The problem with time in PDCP is that SDUs are kept if some are
missing, to do reordering. A timer is started and when it expires
we have to transmit the SDUs even if some are still missing. We
want to do that as soon as possible. So we have to check timers
often (every millisecond).

In RLC the time is set when there is some activity (SDU or PDU
received). In PDCP we cannot wait for this kind of activity. We
would keep packets longer than necessary, which may disturb
upper layers (think: TCP). That is why we introduced the thread,
as a simple mechanism to keep packets no longer than necessary.

The locking done by this thread may create realtime issues.

The whole logic of time keeping can be changed later if it turns
out that it is not efficient.

The functions dealing with DRB AM have been removed. All the types
of PDCP entities (DRB AM, DRB UM, SRB) use the same mechanism for
transmit and receive operations. So the code has been made common
for all those types.

We don't deal with:
    - entity re-establishment, entity release or entity suspend
    - SDU discard (the timer is present but not used)
    - status reporting
    - data recovery
    - data volume calculation
    - header compression / decompression

There is no plan to implement those features in a near future.

Integrity protection is not done yet, and will be implemented soon.
2021-03-03 14:06:31 +01:00
Cedric Roux 95b659ab44 T tracer: add gnb tracer
Minimalist gnb tracer to trace (for the moment) rxdataF when some
decoding for PUCCH or PUSCH has been done.

Important: T_BUFFER_MAX and T_CACHE_SIZE have been changed. T_BUFFER_MAX
is twice as big as before. T_CACHE_SIZE has been devided by two. Globally,
the memory usage of the T tracer is the same, but since we divided by two
the number of buffers in the cache, we may hit some realtime problems if
all the buffers are busy at some point. The simple solution would be to
use 8192*2 for T_CACHE_SIZE as it was, but then we double the memory usage
of the T tracer. This, or another solution, to be defined.
2021-03-02 10:08:00 +01:00
Cedric Roux 21ff70e84f hack: put back a hack that seems necessary for NR rfsim tests in the CI
go figure...
2021-02-15 15:25:52 +01:00
Cedric Roux 3cfa2c266b hack: fix NR prachsim compilation
Dirty!
2021-02-15 15:25:52 +01:00
Cedric Roux 778e487323 hack: fix NR ulsim compilation
Dirty.
2021-02-15 15:25:52 +01:00
Cedric Roux 67b9cd1892 hack: fix NR dlsim compilation
Dirty...
2021-02-15 15:25:52 +01:00
Cedric Roux 73f3a458cf NSA: finalize nea2 security for gNB
- a new section in the configuration file to select security algorithms,
  with new code to deal with it
- cleanup CG-ConfigInfo: specs seem to indicate that we must not
  add mcg_RB_Config; the gNB has to deal with that
- as a consequence, modify fill_default_rbconfig() that is called in
  every cases and needs security and bearer parameters

The new section in the configuration file looks like:

    security = {
      # preferred ciphering algorithms
      # the first one of the list that an UE supports in chosen
      # valid values: nea0, nea1, nea2, nea3
      ciphering_algorithms = ( "nea0", "nea2" );

      # preferred integrity algorithms
      # the first one of the list that an UE supports in chosen
      # valid values: nia0, nia1, nia2, nia3
      integrity_algorithms = ( "nia0" );
    };
2021-02-15 15:25:52 +01:00