diff --git a/ci-scripts/xml_files/container_sa_b200_quectel.xml b/ci-scripts/xml_files/container_sa_b200_quectel.xml index 121b8367690bb7acfd6fcad6a7ed7f54d2bcddde..0296ecfe93e395aad210aeda7e7f97a8d644f2c7 100644 --- a/ci-scripts/xml_files/container_sa_b200_quectel.xml +++ b/ci-scripts/xml_files/container_sa_b200_quectel.xml @@ -111,7 +111,7 @@ <testCase id="000002"> <class>IdleSleep</class> <desc>Sleep</desc> - <idle_sleep_time_in_sec>20</idle_sleep_time_in_sec> + <idle_sleep_time_in_sec>10</idle_sleep_time_in_sec> </testCase> @@ -168,14 +168,14 @@ <class>Custom_Command</class> <desc>Trigger Reestablishment</desc> <node>ofqot</node> - <command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'force-remove UE RNTI [0-9a-f]{4} from RLC to trigger reestablishment'</command> + <command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command> <command_fail>yes</command_fail> </testCase> <testCase id="060002"> <class>Custom_Command</class> <desc>Verify Reestablishment</desc> <node>ofqot</node> - <command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1 reconf_after_reestab 1'</command> + <command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command> <command_fail>yes</command_fail> </testCase> diff --git a/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml b/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml index 0d4dd8f27ee281345fd99463303aeb36017baa77..d603b3f1eab9ec73de5e0c55d8f1904ecf970870 100644 --- a/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml +++ b/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml @@ -105,7 +105,7 @@ <testCase id="200002"> <class>IdleSleep</class> <desc>Sleep</desc> - <idle_sleep_time_in_sec>20</idle_sleep_time_in_sec> + <idle_sleep_time_in_sec>10</idle_sleep_time_in_sec> </testCase> @@ -162,14 +162,14 @@ <class>Custom_Command</class> <desc>Trigger Reestablishment</desc> <node>ofqot</node> - <command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'force-remove UE RNTI [0-9a-f]{4} from RLC to trigger reestablishment'</command> + <command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command> <command_fail>yes</command_fail> </testCase> <testCase id="260002"> <class>Custom_Command</class> <desc>Verify Reestablishment</desc> <node>ofqot</node> - <command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1 reconf_after_reestab 1'</command> + <command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command> <command_fail>yes</command_fail> </testCase> diff --git a/common/utils/telnetsrv/telnetsrv_ci.c b/common/utils/telnetsrv/telnetsrv_ci.c index 3f4930d02bdaa3e1c7f6dc4d335bf6e757d27be8..2d7019b00edad1d9f128b02f5e8cb6385867b66e 100644 --- a/common/utils/telnetsrv/telnetsrv_ci.c +++ b/common/utils/telnetsrv/telnetsrv_ci.c @@ -28,15 +28,17 @@ #include <stdarg.h> #include "openair2/RRC/NR/rrc_gNB_UE_context.h" -#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h" +#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h" +#include "openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h" +#include "openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h" #define TELNETSERVERCODE #include "telnetsrv.h" #define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0) -static int get_single_ue_rnti(void) +static int get_single_ue_rnti_mac(void) { NR_UE_info_t *ue = NULL; UE_iterator(RC.nrmac[0]->UE_info.list, it) { @@ -48,11 +50,6 @@ static int get_single_ue_rnti(void) if (!ue) return -1; - // verify it exists in RRC as well - rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], ue->rnti); - if (!rrcue) - return -1; - return ue->rnti; } @@ -61,7 +58,7 @@ int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt) if (buf) ERROR_MSG_RET("no parameter allowed\n"); - int rnti = get_single_ue_rnti(); + int rnti = get_single_ue_rnti_mac(); if (rnti < 1) ERROR_MSG_RET("different number of UEs\n"); @@ -71,23 +68,32 @@ int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt) int get_reestab_count(char *buf, int debug, telnet_printfunc_t prnt) { + if (!RC.nrrrc) + ERROR_MSG_RET("no RRC present, cannot list counts\n"); + rrc_gNB_ue_context_t *ue = NULL; int rnti = -1; if (!buf) { - rnti = get_single_ue_rnti(); - if (rnti < 1) - ERROR_MSG_RET("no UE found\n"); + rrc_gNB_ue_context_t *l = NULL; + int n = 0; + RB_FOREACH(l, rrc_nr_ue_tree_s, &RC.nrrrc[0]->rrc_ue_head) { + if (ue == NULL) ue = l; + n++; + } + if (!ue) + ERROR_MSG_RET("could not find any UE in RRC\n"); + if (n > 1) + ERROR_MSG_RET("more than one UE in RRC present\n"); } else { rnti = strtol(buf, NULL, 16); if (rnti < 1 || rnti >= 0xfffe) ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n"); + ue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti); + if (!ue) + ERROR_MSG_RET("could not find UE with RNTI %04x in RRC\n"); } - rrc_gNB_ue_context_t *ue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti); - if (!ue) - ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti); - prnt("UE RNTI %04x reestab %d reconf_after_reestab %d\n", - rnti, + ue->ue_context.rnti, ue->ue_context.ue_reestablishment_counter, ue->ue_context.ue_reconfiguration_after_reestablishment_counter); return 0; @@ -95,9 +101,11 @@ int get_reestab_count(char *buf, int debug, telnet_printfunc_t prnt) int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt) { + if (!RC.nrmac) + ERROR_MSG_RET("no MAC/RLC present, cannot trigger reestablishment\n"); int rnti = -1; if (!buf) { - rnti = get_single_ue_rnti(); + rnti = get_single_ue_rnti_mac(); if (rnti < 1) ERROR_MSG_RET("no UE found\n"); } else { @@ -106,13 +114,9 @@ int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt) ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n"); } - // verify it exists in RRC as well - rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti); - if (!rrcue) - ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti); + nr_rlc_test_trigger_reestablishment(rnti); - nr_rlc_remove_ue(rnti); - prnt("force-remove UE RNTI %04x from RLC to trigger reestablishment\n", rnti); + prnt("Reset RLC counters of UE RNTI %04x to trigger reestablishment\n", rnti); return 0; } diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 53e2aca29ed1bfa8588f1dd637d3082ddea63f76..b6f1065d6c59839c65eaeb997f0b732aee2846a4 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -1010,6 +1010,24 @@ rlc_op_status_t rrc_rlc_remove_ue (const protocol_ctxt_t* const x) return RLC_OP_STATUS_OK; } +/* This function is for testing purposes. At least on a COTS UE, it will + * trigger a reestablishment. */ +void nr_rlc_test_trigger_reestablishment(int rnti) +{ + nr_rlc_manager_lock(nr_rlc_ue_manager); + nr_rlc_ue_t *ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rnti); + if (ue == NULL) { + nr_rlc_manager_unlock(nr_rlc_ue_manager); + LOG_E(RLC, "Cannot find RLC entity for UE %04x\n", rnti); + return; + } + /* we simply assume the SRB exists, because the scheduler creates it as soon + * as the UE context is created. */ + nr_rlc_entity_t *ent = ue->srb[0]; + ent->reestablishment(ent); + nr_rlc_manager_unlock(nr_rlc_ue_manager); +} + void nr_rlc_tick(int frame, int subframe) { if (frame != nr_rlc_current_time_last_frame || diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h index 3b4bce717637768b9a279cfac1a0d6cb7ba6b530..051b6ab078b6b30829508249487bb6abdd0ff530 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h @@ -44,6 +44,9 @@ void nr_rlc_add_drb(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_Beare void nr_rlc_remove_ue(int rnti); +/* test function for CI to trigger reestablishments */ +void nr_rlc_test_trigger_reestablishment(int rnti); + int nr_rlc_get_available_tx_space( const rnti_t rntiP, const logical_chan_id_t channel_idP);