HO: fix minor issues found by coverity
handover_decision_2: - lchan->conn should never be NULL, but if it is, don't crash in LOGPHO* macros. - make certain to avoid modulo-zero. It's cosmetic since that config item is not allowed to be zero. handover_test: - check return value of gsm_generate_si(). - safer evaluation of main()'s argv. Fixes: CID#182929, CID#182928, CID#182927, CID#182926 Change-Id: I68e8ed3a1e8659edb47ac3e8a10508f17a3f5670
This commit is contained in:
parent
162a3fe5dd
commit
00727558a9
|
@ -46,7 +46,7 @@
|
||||||
lchan->ts->nr, \
|
lchan->ts->nr, \
|
||||||
lchan->nr, \
|
lchan->nr, \
|
||||||
gsm_pchan_name(lchan->ts->pchan), \
|
gsm_pchan_name(lchan->ts->pchan), \
|
||||||
bsc_subscr_name(lchan->conn->bsub), \
|
bsc_subscr_name(lchan->conn? lchan->conn->bsub : NULL), \
|
||||||
## args)
|
## args)
|
||||||
|
|
||||||
#define LOGPHOLCHANTOBTS(lchan, new_bts, level, fmt, args...) \
|
#define LOGPHOLCHANTOBTS(lchan, new_bts, level, fmt, args...) \
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
lchan->nr, \
|
lchan->nr, \
|
||||||
gsm_pchan_name(lchan->ts->pchan), \
|
gsm_pchan_name(lchan->ts->pchan), \
|
||||||
new_bts->nr, \
|
new_bts->nr, \
|
||||||
bsc_subscr_name(lchan->conn->bsub), \
|
bsc_subscr_name(lchan->conn? lchan->conn->bsub : NULL), \
|
||||||
## args)
|
## args)
|
||||||
|
|
||||||
#define REQUIREMENT_A_TCHF 0x01
|
#define REQUIREMENT_A_TCHF 0x01
|
||||||
|
@ -1114,6 +1114,7 @@ static void on_measurement_report(struct gsm_meas_rep *mr)
|
||||||
struct gsm_lchan *lchan = mr->lchan;
|
struct gsm_lchan *lchan = mr->lchan;
|
||||||
struct gsm_bts *bts = lchan->ts->trx->bts;
|
struct gsm_bts *bts = lchan->ts->trx->bts;
|
||||||
int av_rxlev = -EINVAL, av_rxqual = -EINVAL;
|
int av_rxlev = -EINVAL, av_rxqual = -EINVAL;
|
||||||
|
unsigned int pwr_interval;
|
||||||
|
|
||||||
/* we currently only do handover for TCH channels */
|
/* we currently only do handover for TCH channels */
|
||||||
switch (mr->lchan->type) {
|
switch (mr->lchan->type) {
|
||||||
|
@ -1234,8 +1235,12 @@ static void on_measurement_report(struct gsm_meas_rep *mr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* pwr_interval's range is 1-99, clarifying that no div-zero shall happen in modulo below: */
|
||||||
|
pwr_interval = ho_get_hodec2_pwr_interval(bts->ho);
|
||||||
|
OSMO_ASSERT(pwr_interval);
|
||||||
|
|
||||||
/* try handover to a better cell */
|
/* try handover to a better cell */
|
||||||
if (av_rxlev >= 0 && (mr->nr % ho_get_hodec2_pwr_interval(bts->ho)) == 0) {
|
if (av_rxlev >= 0 && (mr->nr % pwr_interval) == 0) {
|
||||||
LOGPHOLCHAN(lchan, LOGL_INFO, "Looking whether a cell has better RXLEV\n");
|
LOGPHOLCHAN(lchan, LOGL_INFO, "Looking whether a cell has better RXLEV\n");
|
||||||
global_ho_reason = HO_REASON_BETTER_CELL;
|
global_ho_reason = HO_REASON_BETTER_CELL;
|
||||||
find_alternative_lchan(lchan, false);
|
find_alternative_lchan(lchan, false);
|
||||||
|
|
|
@ -1223,7 +1223,6 @@ static char **test_cases[] = {
|
||||||
test_case_26,
|
test_case_26,
|
||||||
test_case_27,
|
test_case_27,
|
||||||
test_case_28,
|
test_case_28,
|
||||||
NULL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct log_info_cat log_categories[] = {
|
static const struct log_info_cat log_categories[] = {
|
||||||
|
@ -1269,21 +1268,21 @@ int main(int argc, char **argv)
|
||||||
int bts_num = 0;
|
int bts_num = 0;
|
||||||
struct gsm_lchan *lchan[256];
|
struct gsm_lchan *lchan[256];
|
||||||
int lchan_num = 0;
|
int lchan_num = 0;
|
||||||
int test_count = 0;
|
|
||||||
int i;
|
int i;
|
||||||
int algorithm;
|
int algorithm;
|
||||||
struct bsc_api bsc_api = {};
|
struct bsc_api bsc_api = {};
|
||||||
|
int test_case_i;
|
||||||
|
int last_test_i;
|
||||||
|
|
||||||
for (i = 0; test_cases[i]; i++)
|
test_case_i = argc > 1? atoi(argv[1]) : -1;
|
||||||
test_count++;
|
last_test_i = ARRAY_SIZE(test_cases) - 1;
|
||||||
|
|
||||||
if (argc <= 1 || atoi(argv[1]) >= test_count) {
|
if (test_case_i < 0 || test_case_i > last_test_i) {
|
||||||
for (i = 0; test_cases[i]; i++) {
|
for (i = 0; i <= last_test_i; i++) {
|
||||||
printf("Test #%d (algorithm %s):\n%s\n", i,
|
printf("Test #%d (algorithm %s):\n%s\n", i,
|
||||||
test_cases[i][0], test_cases[i][1]);
|
test_cases[i][0], test_cases[i][1]);
|
||||||
}
|
}
|
||||||
printf("\nPlease specify test case number 0..%d\n",
|
printf("\nPlease specify test case number 0..%d\n", last_test_i);
|
||||||
test_count - 1);
|
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1320,11 +1319,11 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
bts_model_sysmobts_init();
|
bts_model_sysmobts_init();
|
||||||
|
|
||||||
test_case = test_cases[atoi(argv[1])];
|
test_case = test_cases[test_case_i];
|
||||||
|
|
||||||
fprintf(stderr, "--------------------\n");
|
fprintf(stderr, "--------------------\n");
|
||||||
fprintf(stderr, "Performing the following test %d (algorithm %s):\n%s",
|
fprintf(stderr, "Performing the following test %d (algorithm %s):\n%s",
|
||||||
atoi(argv[1]), test_case[0], test_case[1]);
|
test_case_i, test_case[0], test_case[1]);
|
||||||
algorithm = atoi(test_case[0]);
|
algorithm = atoi(test_case[0]);
|
||||||
test_case += 2;
|
test_case += 2;
|
||||||
fprintf(stderr, "--------------------\n");
|
fprintf(stderr, "--------------------\n");
|
||||||
|
@ -1343,9 +1342,10 @@ int main(int argc, char **argv)
|
||||||
"TS(1-4) are TCH/F, TS(5-6) are TCH/H)\n", n);
|
"TS(1-4) are TCH/F, TS(5-6) are TCH/H)\n", n);
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
bts[bts_num + i] = create_bts(arfcn++);
|
bts[bts_num + i] = create_bts(arfcn++);
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++) {
|
||||||
gsm_generate_si(bts[bts_num + i],
|
if (gsm_generate_si(bts[bts_num + i], SYSINFO_TYPE_2))
|
||||||
SYSINFO_TYPE_2);
|
fprintf(stderr, "Error generating SI2\n");
|
||||||
|
}
|
||||||
bts_num += n;
|
bts_num += n;
|
||||||
test_case += 2;
|
test_case += 2;
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in New Issue