mirror of
https://github.com/open5gs/open5gs.git
synced 2025-10-23 07:41:57 +00:00
[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:
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user