From 0dfe13700911eb3755628f78a1a9653a34dd2510 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Mon, 5 Mar 2018 20:29:47 +0700 Subject: common/l1sap.c: clean up noise / ghost RACH filtering It makes sense to combine both existing BER (Bit Error Rate) and ToA (Timing of Arrival) checks into a separate funcition, so this code may be also used for handover RACH. Change-Id: I1ddda238d5212a88a3dd5c4fc5dfcfea018151bd --- src/common/l1sap.c | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/common/l1sap.c b/src/common/l1sap.c index a96e7939..9648caa1 100644 --- a/src/common/l1sap.c +++ b/src/common/l1sap.c @@ -797,13 +797,6 @@ static int l1sap_ph_rts_ind(struct gsm_bts_trx *trx, return 1; } -static int check_acc_delay(struct ph_rach_ind_param *rach_ind, - struct gsm_bts_role_bts *btsb, uint8_t *acc_delay) -{ - *acc_delay = rach_ind->acc_delay; - return *acc_delay <= btsb->max_ta; -} - /* special case where handover RACH is detected */ static int l1sap_handover_rach(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap, struct ph_rach_ind_param *rach_ind) @@ -1180,6 +1173,28 @@ static int l1sap_tch_ind(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap, return 0; } +static bool rach_pass_filter(struct ph_rach_ind_param *rach_ind, + struct gsm_bts_role_bts *btsb) +{ + /* Check for RACH exceeding BER threshold (ghost RACH) */ + if (rach_ind->ber10k > btsb->max_ber10k_rach) { + LOGPFN(DL1C, LOGL_INFO, rach_ind->fn, "Ignoring RACH request: " + "BER10k(%u) > BER10k_MAX(%u)\n", + rach_ind->ber10k, btsb->max_ber10k_rach); + return false; + } + + /* Make sure that ToA (Timing of Arrival) is acceptable */ + if (rach_ind->acc_delay > btsb->max_ta) { + LOGPFN(DL1C, LOGL_INFO, rach_ind->fn, "Ignoring RACH request: " + "ToA(%u) exceeds the maximal allowed TA(%u) value\n", + rach_ind->acc_delay, btsb->max_ta); + return false; + } + + return true; +} + /* RACH received from bts model */ static int l1sap_ph_rach_ind(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap, struct ph_rach_ind_param *rach_ind) @@ -1187,7 +1202,6 @@ static int l1sap_ph_rach_ind(struct gsm_bts_trx *trx, struct gsm_bts *bts = trx->bts; struct gsm_bts_role_bts *btsb = bts->role; struct lapdm_channel *lc; - uint8_t acc_delay; DEBUGPFN(DL1P, rach_ind->fn, "Rx PH-RA.ind"); @@ -1203,18 +1217,8 @@ static int l1sap_ph_rach_ind(struct gsm_bts_trx *trx, if (rach_ind->rssi >= btsb->load.rach.busy_thresh) btsb->load.rach.busy++; - /* check for RACH exceeding BER threshold (ghost RACH) */ - if (rach_ind->ber10k > btsb->max_ber10k_rach) { - DEBUGPFN(DL1C, rach_ind->fn, "ignoring RACH request: %u > %u (max BER)\n", - rach_ind->ber10k, btsb->max_ber10k_rach); - rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_RACH_DROP); - return 0; - } - - /* check for under/overflow / sign */ - if (!check_acc_delay(rach_ind, btsb, &acc_delay)) { - LOGPFN(DL1C, LOGL_INFO, rach_ind->fn, "ignoring RACH request %u > max_ta(%u)\n", - acc_delay, btsb->max_ta); + /* Filter out noise / interference / ghosts */ + if (!rach_pass_filter(rach_ind, btsb)) { rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_RACH_DROP); return 0; } @@ -1225,7 +1229,8 @@ static int l1sap_ph_rach_ind(struct gsm_bts_trx *trx, lc = &trx->ts[0].lchan[CCCH_LCHAN].lapdm_ch; /* According to 3GPP TS 48.058 ยง 9.3.17 Access Delay is expressed same way as TA (number of symbols) */ - set_ms_to_data(get_lchan_by_chan_nr(trx, rach_ind->chan_nr), acc_delay, false); + set_ms_to_data(get_lchan_by_chan_nr(trx, rach_ind->chan_nr), + rach_ind->acc_delay, false); /* check for packet access */ if ((trx == bts->c0 && L1SAP_IS_PACKET_RACH(rach_ind->ra)) || -- cgit v1.2.3