[HR] Support Xn/N2 handover for Home-Routed Roaming (Direct Forwarding only) (#2194)

This commit adds Xn and N2 handover procedures to the Home-Routed Roaming code.
Direct forwarding is now fully operational.

Indirect forwarding for N2 handovers is not yet supported.

To preserve the GTP-U header and extension header (even without QER)
along the source gNB -> V-UPF -> target gNB path, future work will create
PDRs without Outer Header Removal IE and FARs without Outer Header Creation IE
and implement the necessary UPF logic.
This commit is contained in:
Sukchan Lee
2025-07-14 22:03:32 +09:00
parent f21bc06054
commit 7b75746fe8
11 changed files with 278 additions and 85 deletions

View File

@@ -77,6 +77,21 @@ extern "C" {
#define SEND_UE_CONTEXT_RELEASE_COMMAND_IN_INTEGRITY_UNPROTECTED 0
#define SEND_UE_CONTEXT_RELEASE_COMMAND_IN_INTEGRITY_PROTECTED 1
/*
* [VONR]
* Disable vonr/test8_func when running Home Routed Roaming tests,
* to prevent V-SMF from skipping Update Response (step 14)
* and avoid subsequent SBI timeout and PFCP No Context errors.
*
* [HANDOVER]]
* Normally, with 2 QoS Flows, the system waits for 2 End Markers.
* However, in Home Routed Roaming, the V-SMF uses only a single QoS Flow
* even when multiple QoS Flows are present.
* Therefore, only one End Marker should be awaited.
*/
#define HOME_ROUTED_ROAMING_TEST 0
#undef OGS_TEST_INSIDE
#ifdef __cplusplus

View File

@@ -849,10 +849,12 @@ static void direct_complete_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#if !HOME_ROUTED_ROAMING_TEST
/* Receive End Mark */
recvbuf = test_gtpu_read(gtpu1);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#endif
/* Receive UEContextReleaseCommand */
amf_ue_ngap_id = test_ue->amf_ue_ngap_id;
@@ -966,10 +968,12 @@ static void direct_complete_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#if !HOME_ROUTED_ROAMING_TEST
/* Receive End Mark */
recvbuf = test_gtpu_read(gtpu2);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#endif
/* Receive UEContextReleaseCommand */
amf_ue_ngap_id = test_ue->amf_ue_ngap_id;
@@ -1881,10 +1885,12 @@ static void indirect_complete_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#if !HOME_ROUTED_ROAMING_TEST
/* Receive End Mark */
recvbuf = test_gtpu_read(gtpu1);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#endif
/* Receive UEContextReleaseCommand */
amf_ue_ngap_id = test_ue->amf_ue_ngap_id;
@@ -2029,10 +2035,12 @@ static void indirect_complete_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#if !HOME_ROUTED_ROAMING_TEST
/* Receive End Mark */
recvbuf = test_gtpu_read(gtpu2);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#endif
/* Receive UEContextReleaseCommand */
amf_ue_ngap_id = test_ue->amf_ue_ngap_id;
@@ -2534,10 +2542,12 @@ static void indirect_cancel_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#if !HOME_ROUTED_ROAMING_TEST
/* Receive End Mark */
recvbuf = test_gtpu_read(gtpu1);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#endif
/* Receive UEContextReleaseCommand */
amf_ue_ngap_id = test_ue->amf_ue_ngap_id;

View File

@@ -318,10 +318,12 @@ static void test_two_qos_flows(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#if !HOME_ROUTED_ROAMING_TEST
/* Receive End Mark */
recvbuf = test_gtpu_read(gtpu1);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#endif
/* Receive Path Switch Ack */
recvbuf = testgnb_ngap_read(ngap2);
@@ -365,10 +367,12 @@ static void test_two_qos_flows(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#if !HOME_ROUTED_ROAMING_TEST
/* Receive End Mark */
recvbuf = test_gtpu_read(gtpu2);
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
#endif
/* Receive Path Switch Ack */
recvbuf = testgnb_ngap_read(ngap1);

View File

@@ -3966,13 +3966,6 @@ static void test7_func(abts_case *tc, void *data)
test_ue_remove(test_ue);
}
/*
* Disable test8_func when running Home Routed Roaming tests,
* to prevent V-SMF from skipping Update Response (step 14)
* and avoid subsequent SBI timeout and PFCP No Context errors.
*/
#define HOME_ROUTED_ROAMING_TEST 0
#if !HOME_ROUTED_ROAMING_TEST
/**
* test8_func: