Commit Graph
4037 Commits
Author SHA1 Message Date
Robert Schmidt e02aae4624 Open TODOs at RRC 2024-10-25 20:10:26 +02:00
c956de6f27 Trigger F1 Handover on A3 event
When receiving a measurement report including an A3 event, trigger
handover towards the indicated cell.

Note that currently, we are still limited to one Cell by DU, hence
looking up a cell comes down to looking up a DU, as is done here.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: Luis Pereira <lpereira@allbesmart.pt>
Co-authored-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2024-10-25 20:10:26 +02:00
Robert Schmidt 8b4259c047 Ignore UE Context Modification Required during handover
During handover, we might receive a UE context Modification required
message. Currently, we cannot handle this; ignore the message.
2024-10-25 20:10:26 +02:00
Robert Schmidt 546ffee56b DU dies during HO: free HO context of UE to avoid dangling data 2024-10-25 20:10:26 +02:00
Robert Schmidt b6ccf8aa77 Handle reestablishment during handover
This commit implements reestablishment during handover when occurring at
the source DU, either as a handover Failure or "normal" reestablishment
(something else went wrong). In this case, the CU will trigger HO
cancel, which in F1, means to cancel on the target DU. Also, undo any
previous ID changes. Retain the old CellGroupConfig (before handover)
for the case of reestablishment at source. If not needed, it is freed
after the reconfiguration complete.

Reestablishment on target cell during handover cannot be handled by the
gNB (yet). It is the same as with a normal reestablishment (not during
handover) on a different cell: that cell has no notion of the old UE, so
we cannot simply indicate the old UE to reestablish; at least, we would
need to cleanup the CellGroupConfig, and I am not sure this works out of
the box, either.
2024-10-25 20:10:26 +02:00
Robert Schmidt c6434c80fd Reestablishment hack: free reconfigurationWithSync
After handover, the last CellGroupConfig received is the one for
handover, containing a reconfigurationWithSync. Resending this
CellGroupConfig to the UE after reestablishment would trigger a
handover. Free the reconfigurationWithSync to have the UE complete
reestablishment at the current cell.

The CU implementation of reestablishment modifies the CellGroupConfig.
It should not do this, but does as of now. The specification (38.473 Sec
8.7) foresees an optional F1 UE context modification procedure (which
can be used to receive the CellGroupConfig). This should be done instead
to retrieve the correct CellGroupConfig.

Note that the F1 UE context setup procedure, similar to the UE context
modification procedure, would also allow to perform reestablishment on a
DU that is not the original one.
2024-10-25 20:10:26 +02:00
145fd2b415 Handle Release request during handover
If we release a request from a DU during, handle as follows:

- from the source: Handover is still ongoing, so ignore it by
  acknowledging the release, and marking handover as done. In this case,
  we did not receive an acknowledgement from the target, but since the
  source DU does not keep the UE context, we could not cancel the
  handover anymore either. The UE might come back on any DU through
  reestablishment (or simply be connected on the target)
- from the target: consider this to be a genuine release, and forward to
  AMF.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-25 20:10:26 +02:00
a2da391e70 Handle successful HO after reconfigurationComplete
The HO is completed (from a pure RAN perspective) when receiving
reconfiguration complete. In that case, remove the HO context, and
signal successful handover through the callback. For the F1 handover,
this means releasing the UE at the source DU.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-25 20:10:26 +02:00
e42c303bd7 Handle UE Context Modification Response in HO case
We expect the UE's RRC Reconfiguration Complete to come through the
target DU, as the "new UE" at the target CU. Also, function
CU_handle_UL_RRC_MESSAGE_TRANSFER() checks that the UL RRC Message,
through which we will receive RRC Reconfiguration Complete, matches the
DU UE ID stored in RRC. Since the DU UE ID will be the one at the target
DU, while up to now, we stored the DU UE ID at the source DU.

Correspondingly, update the DU UE ID to the one at the target DU; also
update the corresponding assoc_id.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-25 20:10:26 +02:00
0e20c4c257 Handle UE context setup resp for HO: trigger reconfiguration on source
In this commit, handle the reception of a UE context setup response, in
the case of handover. In that case, store the gNB-DU UE ID and C-RNTI of
the UE at the target DU, and trigger a reconfiguration towards the UE at
the source DU via the callback.

To ensure that the CU-UP's PDCP is SN-aligned with the UE, use
cuup_notify_reestablishment() to reset the bearers with PDCP
reestablishment, which has already been implemented in the last commit.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-25 20:10:26 +02:00
Robert Schmidt 7b163f1688 Harmonize UE context setup resp bearer handling
This is preparatory work to handle the UE context setup response from
the target DU. There are two cases:

- "Initial" UE context setup response (during connection setup): we need
  to inform the CU-UP via an E1 message of the new bearers (GTP tunnel
  update)
- F1 handover:  we need to inform the CU-UP via an E1 message that there
  are DRBs to reestablish

There are two different functions, e1_send_bearer_updates() and
cuup_notify_reestablishment(), to do this. Harmonize the code, before
implementing the actual handover logic in the next commit.
2024-10-25 20:10:26 +02:00
66b548060e Implement F1 Handover Trigger
Add a function to trigger an F1 handover, including the corresponding
telnet function implementation. The function looks up source&target DU,
creates a HO context, and reads PDU information to send a UE context
setup request to the target DU towards which to handover.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-25 20:10:26 +02:00
Robert Schmidt c0770cc19b Make QoS characteristics function available
Functions get_qos_char_from_qos_flow_param() and
get_qos_characteristics() will be used in rrc_gNB_mobility.c to read PDU
information for handover. Move the definitions to a header to reuse
later.
2024-10-25 20:10:26 +02:00
746dc29a46 Add HandoverPreparationInformation() ASN.1 encoder function
HandoverPreparationInformation will be used in the follow-up commit to
trigger a handover.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-25 20:10:26 +02:00
Robert Schmidt 90d8eefa59 Add new handover context structures for handover operation 2024-10-25 20:10:26 +02:00
Robert Schmidt b5e3507764 Fix: store CellGroupConfig from initial UL RRC message
This F1 message sends us the CellGroupConfig of the UE. Store it in case
we need it. For instance, at least in OAI, it is possible to make a
handover without a DRB (this might or might not be standard compliant).
However, in this case, we did never receive a UE context setup request,
which stores the CellGroupConfig. Hence, store the first CellGroupConfig
we receive, to be able to do e.g., handover.
2024-10-25 20:10:26 +02:00
Robert Schmidt 35995c8a10 Move RETURN_IF_INVALID_ASSOC_ID() to header for use elsewhere
RETURN_IF_INVALID_ASSOC_ID() checks if an assoc_id (of a DU) is valid.
It will be also used in the mobility RRC module later. Move it to the DU
header (where it logically belongs) to move it from there.
2024-10-25 20:10:26 +02:00
Robert Schmidt 6cd76ff862 Remove unused includes and comment with resolved issue 2024-10-25 20:10:25 +02:00
Roberto MaguetaandLuis Pereira 67eb94db3f Print RRC neighbor cell measurements, if present
Co-authored-by: Luis Pereira <lpereira@allbesmart.pt>
2024-10-25 20:10:25 +02:00
Robert Schmidt 5378c4d8d9 Refactor RRC Reconfiguration function
Refactor the RRC reconfiguration function to reuse it also later for
sending the reconfiguration including the handover trigger.
2024-10-22 18:12:51 +02:00
Robert Schmidtandbatuhanduyuler fef589cf88 Refactor reconfigurationWithSync ASN.1 to separate function
Will be reused later for handover.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
2024-10-22 18:12:50 +02:00
004403c84d Implement F1 UE Ctxt Modif Transmission Action Indicator
Implement the Transmission Action Indicator F1AP forwarding logic, and
add it to the F1 internal representation structure. After the
transmission interrupt timer (during which SRB1 can send messages), the
UE will be out-of-sync (we assume it's not there anymore).

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-22 18:12:50 +02:00
d70561d509 Implement F1 UE Ctxt HandoverPrepInfo in F1
Implement the HandoverPreparationInformation F1AP forwarding logic, and
add it to the F1 internal representation structure.

No logic is implemented in this commit.

Co-authored-by: batuhanduyuler <batuhan.duyuler@firecell.io>
Co-authored-by: rmagueta <rmagueta@allbesmart.pt>
2024-10-22 18:12:50 +02:00
Robert Schmidt 4c0fa90818 Merge remote-tracking branch 'origin/bugfixes-gnb-stability' into integration_2024_w42 (!3038)
- Fixes #853, #854, #858, #859, #862
- handle repeated NGAP Initial context setup requests, thereby fixing assert:

      Assertion (!ue_p->as_security_active) failed!
      In rrc_gNB_generate_SecurityModeCommand() /home/eurecom/raymond/openairinterface5g/openair2/RRC/NR/rrc_gNB.c:2590
      logic error: security already activ

- A lot of cleanup: remove almost all use of protocol_ctxt_t in 5G RRC and use
  existing pointers instead
2024-10-19 12:48:50 +02:00
Robert Schmidt c4344f26d1 Correctly pass ID to rrc_gNB_get_next_transaction_identifier() 2024-10-17 19:06:45 +02:00
Robert Schmidt 132cd64bb0 Handle empty RRC ULInformationTransfer
A UE might send a ULInformationTransfer without the actual content present
(intentionally or not). Check this and handle appropriately to avoid
a segfault when reading the empty NAS message.

Closes: #862
2024-10-17 19:06:45 +02:00
Robert Schmidt 304372d5e6 Remove unused protocol_ctxt_t 2024-10-17 19:06:45 +02:00
Robert Schmidt 63a0785430 Cleanup rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(): pass UE context directly 2024-10-17 19:06:45 +02:00
Robert Schmidt 759b0ec39e Cleanup rrc_CU_process_ue_modification_required(): remove protocol_ctxt_t 2024-10-17 19:06:45 +02:00
Robert Schmidt ff3a14f7f9 Cleanup rrc_gNB_modify_dedicatedRRCReconfiguration: pass UE context directly 2024-10-17 19:06:45 +02:00
Robert Schmidt 01b240ebf1 Cleanup rrc_gNB_generate_dedicatedRRCReconfiguration(): pass UE context directly 2024-10-17 19:06:45 +02:00
Robert Schmidt 452ccc3235 Cleanup rrc_gNB_generate_dedicatedRRCReconfiguration_release()
Pass RRC and UE context pointers directly.
2024-10-17 19:06:45 +02:00
Robert Schmidt dbeb1ea691 Cleanup nr_rrc_reconfiguration_req(): pass UE context directly 2024-10-17 19:06:45 +02:00
Robert Schmidt 145ab259e8 Cleanup rrc_gNB_generate_RRCRelease(): pass context directly 2024-10-17 19:06:45 +02:00
Robert Schmidt fce17f873b Remove nr_rrc_common.c: declared functions are not used 2024-10-17 19:06:45 +02:00
Robert Schmidt e497526543 Remove function declaration with non-existant definition 2024-10-17 19:06:45 +02:00
Robert Schmidt 788bc623e3 Cleanup rrc_gNB_decode_dcch(): use F1 message type, pass rrc pointer 2024-10-17 19:06:45 +02:00
Robert Schmidt da9f4cec18 Cleanup: pass UE context directly into handle_rrcReestablishmentComplete() 2024-10-17 19:06:45 +02:00
Robert Schmidt 118674ae4e Cleanup handle_ueCapabilityInformation()
Pass UE context pointer directly. In the switch, do not return to not
create memory leaks (after the switch, memory is freed). Move the
function up to make it appear before the use of the function.
2024-10-17 19:06:45 +02:00
Robert Schmidt 88d6117d99 Cleanup in securityModeFailure handling
The xer_fprintf() call is already present in rrc_gNB_decode_dcch()
above.
2024-10-17 19:06:45 +02:00
Robert Schmidt a5a746ee36 Cleanup: Pass UE context directly into rrc_gNB_generate_UECapabilityEnquiry() 2024-10-17 19:06:45 +02:00
Robert Schmidt cec54f1c89 Cleanup: Pass UE context directly into rrc_gNB_send_NGAP_UPLINK_NAS() 2024-10-17 19:06:45 +02:00
Robert Schmidt 098f45c14d Cleanup: Pass RRC/UE context directly into handle_rrcReconfigurationComplete() 2024-10-17 19:06:45 +02:00
Robert Schmidt 7836fe5090 Cleanup: Pass UE context into handle_rrcSetupComplete()
Pass UE context, without protocol_ctxt_t, for cleanup. Remove the return
from within the switch, as this would lead to memory leaks; nothing is
executed after the switch statement (except for freeing memory).
2024-10-17 19:06:45 +02:00
Robert Schmidt 0056ac7bc9 Cleanup: Pass UE context into rrc_gNB_process_MeasurementReport() 2024-10-17 19:06:45 +02:00
Robert Schmidt 30054b809e Handle faulty MeasurementReport gracefully
A UE might send a MeasurementReport without the actual IEs present
(intentionally or not). Check this and handle appropriately to avoid
assertion

    Assertion (measurementReport->criticalExtensions.present == NR_MeasurementReport__criticalExtensions_PR_measurementReport && measurementReport->criticalExtensions.choice.measurementReport != ((void*)0)) failed!
    In rrc_gNB_process_MeasurementReport() ../../../openair2/RRC/NR/rrc_gNB.c

Closes: #859
2024-10-17 19:06:45 +02:00
Robert Schmidt e815972492 Handle unsolicited UE Capability Information gracefully
A UE might send a UE Capability Information without unsolicitatedly
(intentionally or not). Check this and handle appropriately to avoid
assertion

    Assertion (UE->xids[xid] == RRC_UECAPABILITY_ENQUIRY) failed!
    In handle_ueCapabilityInformation() ../../../openair2/RRC/NR/rrc_gNB.c

Closes: #858
2024-10-17 19:06:45 +02:00
Robert Schmidt 542ef1c1c6 Handle fault rrcReestablishmentComplete gracefully
A UE might send a rrcReestablishmentComplete without the actual IEs
present (intentionally or not). Check this and handle appropriately to
avoid assertion

    Assertion (reestablishment_complete->criticalExtensions.present == NR_RRCReestablishmentComplete__criticalExtensions_PR_rrcReestablishmentComplete) failed!
    In handle_rrcReestablishmentComplete() ../../../openair2/RRC/NR/rrc_gNB.c:1364

Closes: #854
2024-10-17 19:06:45 +02:00
Robert Schmidt d71104da51 Handle repeated NGAP Initial Context Setup Request
Prior to this commit, if we receive an Initial Context Setup Request for
a UE that has AS security set up, the gNB asserts with

    Assertion (!ue_p->as_security_active) failed!
    In rrc_gNB_generate_SecurityModeCommand() openairinterface5g/openair2/RRC/NR/rrc_gNB.c:2590
    logic error: security already activ

However, TS 38.413 says:

> The AMF may initiate the Initial Context Setup procedure if a
> UE-associated logical NG-connection exists for the UE

(I interpret this as "it might happen anytime")

> store the received Security Key in the UE context and, if the NG-RAN
> node is required to activate security for the UE, take this security key
> into use.

(I interpret this as "do not set up AS security again")

In this commit, handle if we receive an Initial Context Setup Request
for an existing UE context. As said in the spec, we store the keys. If
security is not active, we trigger RRC Security Mode Command. If it is
active, we skip Security, and directly set up a PDU session. If there is
also no PDU session, we simply forward the NAS message, and acknowledge.

If there was no AS security, after security, the gNB would trigger the
setup of PDU sessions (if any), and then forward any NAS PDUs, which is
stated in the if block if AS security is already active.
2024-10-17 18:59:22 +02:00
Robert Schmidt 94a3a61e17 Reuse rrc_forward_ue_nas_message() for DL Information Transfer 2024-10-17 18:45:50 +02:00