From aaeec591b6b4def06396b7b159f0a59dd81bb726 Mon Sep 17 00:00:00 2001 From: Ismael Gomez Date: Tue, 14 Aug 2018 19:50:03 +0200 Subject: [PATCH 1/3] Fix race condition in phy recv --- srsue/hdr/phy/phch_recv.h | 14 ++++++++++++-- srsue/src/phy/phch_recv.cc | 1 - 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/srsue/hdr/phy/phch_recv.h b/srsue/hdr/phy/phch_recv.h index 78559d3cd..f58bc64a1 100644 --- a/srsue/hdr/phy/phch_recv.h +++ b/srsue/hdr/phy/phch_recv.h @@ -309,6 +309,10 @@ private: state_t run_state() { pthread_mutex_lock(&inside); cur_state = next_state; + if (state_setting) { + state_setting = false; + state_changing = true; + } pthread_cond_broadcast(&cvar); pthread_mutex_unlock(&inside); return cur_state; @@ -322,6 +326,8 @@ private: } else { next_state = IDLE; } + state_changing = false; + pthread_cond_broadcast(&cvar); pthread_mutex_unlock(&inside); } void force_sfn_sync() { @@ -383,13 +389,16 @@ private: pthread_cond_init(&cvar, NULL); cur_state = IDLE; next_state = IDLE; + state_setting = false; + state_changing = false; } private: void go_state(state_t s) { pthread_mutex_lock(&inside); next_state = s; - while(cur_state != s) { + state_setting = true; + while(state_setting) { pthread_cond_wait(&cvar, &inside); } pthread_mutex_unlock(&inside); @@ -398,12 +407,13 @@ private: /* Waits until there is a call to set_state() and then run_state(). Returns when run_state() returns */ void wait_state_change(state_t prev_state) { pthread_mutex_lock(&inside); - while(cur_state == prev_state) { + while(state_changing) { pthread_cond_wait(&cvar, &inside); } pthread_mutex_unlock(&inside); } + bool state_changing, state_setting; state_t cur_state, next_state; pthread_mutex_t inside, outside; pthread_cond_t cvar; diff --git a/srsue/src/phy/phch_recv.cc b/srsue/src/phy/phch_recv.cc index 9f9ef945d..c7b63cd4f 100644 --- a/srsue/src/phy/phch_recv.cc +++ b/srsue/src/phy/phch_recv.cc @@ -135,7 +135,6 @@ void phch_recv::reset() current_earfcn = -1; sfn_p.reset(); search_p.reset(); - phy_state.go_idle(); } From 327002a6cbfcc17d896f815d2becd3e814de55dc Mon Sep 17 00:00:00 2001 From: Ismael Gomez Date: Sat, 28 Jul 2018 10:16:01 +0200 Subject: [PATCH 2/3] Fix NCC=1 HO in second round --- srsue/hdr/upper/usim.h | 1 + srsue/src/upper/usim.cc | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/srsue/hdr/upper/usim.h b/srsue/hdr/upper/usim.h index ce42e3022..f436f47a6 100644 --- a/srsue/hdr/upper/usim.h +++ b/srsue/hdr/upper/usim.h @@ -132,6 +132,7 @@ private: uint8_t k_enb_star[32]; uint32_t current_ncc; + bool is_first_ncc; bool initiated; diff --git a/srsue/src/upper/usim.cc b/srsue/src/upper/usim.cc index f13469517..18df7527e 100644 --- a/srsue/src/upper/usim.cc +++ b/srsue/src/upper/usim.cc @@ -271,7 +271,8 @@ void usim::generate_as_keys(uint8_t *k_asme, k_up_enc, k_up_int); - current_ncc = 0; + current_ncc = 0; + is_first_ncc = true; } void usim::generate_as_keys_ho(uint32_t pci, @@ -293,10 +294,11 @@ void usim::generate_as_keys_ho(uint32_t pci, // Generate successive NH while(current_ncc != (uint32_t) ncc) { uint8_t *sync = NULL; - if (current_ncc) { - sync = nh; - } else { + if (is_first_ncc) { sync = k_enb_initial; + is_first_ncc = false; + } else { + sync = nh; } // Generate NH security_generate_nh(k_asme, From e94cbded673b39c1a6329dd3e7be5d7f51c59b09 Mon Sep 17 00:00:00 2001 From: Xavier Arteaga Date: Mon, 27 Aug 2018 11:19:20 +0200 Subject: [PATCH 3/3] Fixed vector test failure criteria for conversions --- lib/src/phy/utils/test/vector_test.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/src/phy/utils/test/vector_test.c b/lib/src/phy/utils/test/vector_test.c index 85b1c3fb9..35156acaa 100644 --- a/lib/src/phy/utils/test/vector_test.c +++ b/lib/src/phy/utils/test/vector_test.c @@ -448,8 +448,11 @@ TEST(srslte_vec_convert_fi, TEST_CALL(srslte_vec_convert_fi(x, scale, z, block_size)) for (int i = 0; i < block_size; i++) { - gold = (short) ((x[i] * scale)); - mse += cabsf((float)gold - (float) z[i]); + gold = (short) ((x[i] * scale)); + double err = cabsf((float)gold - (float) z[i]); + if (err > mse) { + mse = err; + } } free(x); @@ -470,8 +473,11 @@ TEST(srslte_vec_convert_if, TEST_CALL(srslte_vec_convert_if(x, scale, z, block_size)) for (int i = 0; i < block_size; i++) { - gold = ((float)x[i]) * k; - mse += fabsf(gold - z[i]); + gold = ((float)x[i]) * k; + double err = cabsf((float)gold - (float) z[i]); + if (err > mse) { + mse = err; + } } free(x);