This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
laforge gerrit-no-reply at lists.osmocom.orglaforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/21988 ) Change subject: hodec2: add ho_candidate.{current,target}.free_tch ...................................................................... hodec2: add ho_candidate.{current,target}.free_tch Store the number of free lchans and the min-free-slots settings in ho_candidate, instead of figuring those out in various places, to make it easier to read. Prepare for upcoming patch which also requires these values to fix a bug. Change-Id: Ie6ca5af5e8d0ebb8deaaaa637e2728008ecba517 --- M src/osmo-bsc/handover_decision_2.c 1 file changed, 46 insertions(+), 32 deletions(-) Approvals: laforge: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c index 4cf0e8a..b296bd1 100644 --- a/src/osmo-bsc/handover_decision_2.c +++ b/src/osmo-bsc/handover_decision_2.c @@ -104,6 +104,8 @@ struct gsm_lchan *lchan; struct gsm_bts *bts; int rxlev; + int free_tch; + int min_free_tch; } current; struct { struct neighbor_ident_key nik; /* neighbor ARFCN+BSIC */ @@ -111,6 +113,10 @@ struct gsm_bts *bts; int rxlev; int rxlev_afs_bias; + int free_tchf; + int min_free_tchf; + int free_tchh; + int min_free_tchh; } target; }; @@ -433,9 +439,8 @@ * * The number of free slots are checked for TCH/F and TCH/H slot types * individually. */ -static void check_requirements(struct ho_candidate *c, int tchf_count, int tchh_count) +static void check_requirements(struct ho_candidate *c) { - int count; uint8_t requirement = 0; unsigned int penalty_time; c->requirements = 0; @@ -521,12 +526,12 @@ } /* remove slot types that are not available */ - if (!tchf_count && requirement & REQUIREMENT_A_TCHF) { + if (!c->target.free_tchf && (requirement & REQUIREMENT_A_TCHF)) { LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "removing TCH/F, since all TCH/F lchans are in use\n"); requirement &= ~(REQUIREMENT_A_TCHF); } - if (!tchh_count && requirement & REQUIREMENT_A_TCHH) { + if (!c->target.free_tchh && (requirement & REQUIREMENT_A_TCHH)) { LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "removing TCH/H, since all TCH/H lchans are in use\n"); requirement &= ~(REQUIREMENT_A_TCHH); @@ -610,11 +615,11 @@ /* the minimum free timeslots that are defined for this cell must * be maintained _after_ handover/assignment */ if (requirement & REQUIREMENT_A_TCHF) { - if (tchf_count - 1 >= ho_get_hodec2_tchf_min_slots(c->target.bts->ho)) + if (c->target.free_tchf - 1 >= c->target.min_free_tchf) requirement |= REQUIREMENT_B_TCHF; } if (requirement & REQUIREMENT_A_TCHH) { - if (tchh_count - 1 >= ho_get_hodec2_tchh_min_slots(c->target.bts->ho)) + if (c->target.free_tchh - 1 >= c->target.min_free_tchh) requirement |= REQUIREMENT_B_TCHH; } @@ -622,15 +627,12 @@ /* the nr of free timeslots of the target cell must be >= the * free slots of the current cell _after_ handover/assignment */ - count = bts_count_free_ts(c->current.bts, - (c->current.lchan->type == GSM_LCHAN_TCH_H) ? - GSM_PCHAN_TCH_H : GSM_PCHAN_TCH_F); if (requirement & REQUIREMENT_A_TCHF) { - if (tchf_count - 1 >= count + 1) + if (c->target.free_tchf - 1 >= c->current.free_tch + 1) requirement |= REQUIREMENT_C_TCHF; } if (requirement & REQUIREMENT_A_TCHH) { - if (tchh_count - 1 >= count + 1) + if (c->target.free_tchh - 1 >= c->current.free_tch + 1) requirement |= REQUIREMENT_C_TCHH; } @@ -826,12 +828,11 @@ " less-or-equal congestion")) /* verbosely log about a handover candidate */ -static inline void debug_candidate(struct ho_candidate *candidate, - int tchf_count, int tchh_count) +static inline void debug_candidate(struct ho_candidate *candidate) { #define HO_CANDIDATE_FMT(tchx, TCHX) "TCH/" #TCHX "={free %d (want %d), " REQUIREMENTS_FMT "}" #define HO_CANDIDATE_ARGS(tchx, TCHX) \ - tch##tchx##_count, ho_get_hodec2_tch##tchx##_min_slots(candidate->target.bts->ho), \ + candidate->target.free_tch##tchx, candidate->target.min_free_tch##tchx, \ REQUIREMENTS_ARGS(candidate->requirements, TCHX) if (!candidate->target.bts && !candidate->target.cil) @@ -858,17 +859,32 @@ HO_CANDIDATE_ARGS(f, F), HO_CANDIDATE_ARGS(h, H)); } +static void candidate_set_free_tch(struct ho_candidate *c) +{ + c->current.free_tch = bts_count_free_ts(c->current.bts, c->current.lchan->ts->pchan_is); + switch (c->current.lchan->ts->pchan_is) { + case GSM_PCHAN_TCH_F: + c->current.min_free_tch = ho_get_hodec2_tchf_min_slots(c->current.bts->ho); + break; + case GSM_PCHAN_TCH_H: + c->current.min_free_tch = ho_get_hodec2_tchh_min_slots(c->current.bts->ho); + break; + default: + break; + } + c->target.free_tchf = bts_count_free_ts(c->target.bts, GSM_PCHAN_TCH_F); + c->target.min_free_tchf = ho_get_hodec2_tchf_min_slots(c->target.bts->ho); + c->target.free_tchh = bts_count_free_ts(c->target.bts, GSM_PCHAN_TCH_H); + c->target.min_free_tchh = ho_get_hodec2_tchh_min_slots(c->target.bts->ho); +} + /* add candidate for re-assignment within the current cell */ static void collect_assignment_candidate(struct gsm_lchan *lchan, struct ho_candidate *clist, unsigned int *candidates, int rxlev_current) { struct gsm_bts *bts = lchan->ts->trx->bts; - int tchf_count, tchh_count; struct ho_candidate c; - tchf_count = bts_count_free_ts(bts, GSM_PCHAN_TCH_F); - tchh_count = bts_count_free_ts(bts, GSM_PCHAN_TCH_H); - c = (struct ho_candidate){ .current = { .lchan = lchan, @@ -880,9 +896,10 @@ .rxlev = rxlev_current, /* same cell, same rxlev */ }, }; - check_requirements(&c, tchf_count, tchh_count); + candidate_set_free_tch(&c); + check_requirements(&c); - debug_candidate(&c, tchf_count, tchh_count); + debug_candidate(&c); if (!c.requirements) return; @@ -898,8 +915,6 @@ int *neighbors_count) { struct gsm_bts *bts = lchan->ts->trx->bts; - int tchf_count = 0; - int tchh_count = 0; struct gsm_bts *neighbor_bts; const struct gsm0808_cell_id_list2 *neighbor_cil; struct neighbor_ident_key ni = { @@ -958,6 +973,7 @@ .rxlev = neigh_meas_avg(nmp, ho_get_hodec2_rxlev_neigh_avg_win(bts->ho)), }, }; + candidate_set_free_tch(&c); /* Heed rxlev hysteresis only if the RXLEV/RXQUAL/TA levels of the MS aren't critically bad and * we're just looking for an improvement. If levels are critical, we desperately need a handover @@ -985,13 +1001,11 @@ } if (neighbor_bts) { - tchf_count = bts_count_free_ts(neighbor_bts, GSM_PCHAN_TCH_F); - tchh_count = bts_count_free_ts(neighbor_bts, GSM_PCHAN_TCH_H); - check_requirements(&c, tchf_count, tchh_count); + check_requirements(&c); } else check_requirements_remote_bss(&c); - debug_candidate(&c, tchf_count, tchh_count); + debug_candidate(&c); if (!c.requirements) return; @@ -1751,7 +1765,7 @@ static void bts_congestion_check(struct gsm_bts *bts) { int min_free_tchf, min_free_tchh; - int tchf_count, tchh_count; + int free_tchf, free_tchh; global_ho_reason = HO_REASON_CONGESTION; @@ -1777,19 +1791,19 @@ return; } - tchf_count = bts_count_free_ts(bts, GSM_PCHAN_TCH_F); - tchh_count = bts_count_free_ts(bts, GSM_PCHAN_TCH_H); + free_tchf = bts_count_free_ts(bts, GSM_PCHAN_TCH_F); + free_tchh = bts_count_free_ts(bts, GSM_PCHAN_TCH_H); LOGPHOBTS(bts, LOGL_INFO, "Congestion check: (free/want-free) TCH/F=%d/%d TCH/H=%d/%d\n", - tchf_count, min_free_tchf, tchh_count, min_free_tchh); + free_tchf, min_free_tchf, free_tchh, min_free_tchh); /* only check BTS if congested */ - if (tchf_count >= min_free_tchf && tchh_count >= min_free_tchh) { + if (free_tchf >= min_free_tchf && free_tchh >= min_free_tchh) { LOGPHOBTS(bts, LOGL_DEBUG, "Not congested\n"); return; } LOGPHOBTS(bts, LOGL_DEBUG, "Attempting to resolve congestion...\n"); - bts_resolve_congestion(bts, min_free_tchf - tchf_count, min_free_tchh - tchh_count); + bts_resolve_congestion(bts, min_free_tchf - free_tchf, min_free_tchh - free_tchh); } void hodec2_congestion_check(struct gsm_network *net) -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/21988 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: Ie6ca5af5e8d0ebb8deaaaa637e2728008ecba517 Gerrit-Change-Number: 21988 Gerrit-PatchSet: 5 Gerrit-Owner: neels <nhofmeyr at sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge at osmocom.org> Gerrit-Reviewer: pespin <pespin at sysmocom.de> Gerrit-MessageType: merged -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210112/1883a66e/attachment.htm>