Fixes on cell selection.
I hope that it fixes the crash issues. If a sysinfo was received when no cell is selected, it was written to a NULL-pointer. Also after selecting a cell (dedicated mode), it was not good to "continue" an already stopped search process, if the sync fails.
This commit is contained in:
parent
ba59a8cb51
commit
0f1ef214b6
|
@ -1668,6 +1668,7 @@ static int gsm322_cs_scan(struct osmocom_ms *ms)
|
||||||
#endif
|
#endif
|
||||||
/* unset selected cell */
|
/* unset selected cell */
|
||||||
cs->selected = 0;
|
cs->selected = 0;
|
||||||
|
cs->si = NULL;
|
||||||
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
||||||
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id
|
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id
|
||||||
= 0;
|
= 0;
|
||||||
|
@ -2315,10 +2316,11 @@ static int gsm322_l1_signal(unsigned int subsys, unsigned int signal,
|
||||||
ms = signal_data;
|
ms = signal_data;
|
||||||
cs = &ms->cellsel;
|
cs = &ms->cellsel;
|
||||||
|
|
||||||
LOGP(DCS, LOGL_INFO, "Sync error.\n");
|
stop_cs_timer(cs);
|
||||||
|
if (cs->selected)
|
||||||
/* tune to next cell */
|
gsm322_cs_loss(cs);
|
||||||
gsm322_cs_scan(ms);
|
else
|
||||||
|
gsm322_cs_timeout(cs);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2346,6 +2348,9 @@ static void gsm322_cs_loss(void *arg)
|
||||||
msgb_free(nmsg);
|
msgb_free(nmsg);
|
||||||
} else {
|
} else {
|
||||||
LOGP(DCS, LOGL_INFO, "Trigger RR abort.\n");
|
LOGP(DCS, LOGL_INFO, "Trigger RR abort.\n");
|
||||||
|
#ifdef TODO
|
||||||
|
must trigger RR abort.
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2378,6 +2383,7 @@ static int gsm322_c_plmn_search(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
|
|
||||||
/* unset selected cell */
|
/* unset selected cell */
|
||||||
cs->selected = 0;
|
cs->selected = 0;
|
||||||
|
cs->si = NULL;
|
||||||
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
||||||
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
||||||
|
|
||||||
|
@ -2432,6 +2438,7 @@ static int gsm322_c_stored_cell_sel(struct osmocom_ms *ms, struct gsm322_ba_list
|
||||||
|
|
||||||
/* unset selected cell */
|
/* unset selected cell */
|
||||||
cs->selected = 0;
|
cs->selected = 0;
|
||||||
|
cs->si = NULL;
|
||||||
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
||||||
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
||||||
|
|
||||||
|
@ -2464,6 +2471,7 @@ static int gsm322_c_normal_cell_sel(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
|
|
||||||
/* unset selected cell */
|
/* unset selected cell */
|
||||||
cs->selected = 0;
|
cs->selected = 0;
|
||||||
|
cs->si = NULL;
|
||||||
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
||||||
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
||||||
|
|
||||||
|
@ -2507,6 +2515,7 @@ static int gsm322_c_any_cell_sel(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
|
|
||||||
/* unset selected cell */
|
/* unset selected cell */
|
||||||
cs->selected = 0;
|
cs->selected = 0;
|
||||||
|
cs->si = NULL;
|
||||||
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
||||||
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
||||||
|
|
||||||
|
@ -2627,6 +2636,7 @@ if we return from dedicated mode and we have a ba range, we can use that for cel
|
||||||
|
|
||||||
/* unset selected cell */
|
/* unset selected cell */
|
||||||
cs->selected = 0;
|
cs->selected = 0;
|
||||||
|
cs->si = NULL;
|
||||||
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
memset(&cs->sel_si, 0, sizeof(cs->sel_si));
|
||||||
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0;
|
||||||
|
|
||||||
|
|
|
@ -1688,6 +1688,12 @@ static int gsm48_rr_rx_sysinfo1(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 1 "
|
||||||
|
"ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 1 "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 1 "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -1722,6 +1728,12 @@ static int gsm48_rr_rx_sysinfo2(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 2 "
|
||||||
|
"ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 2 "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 2 "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -1757,6 +1769,12 @@ static int gsm48_rr_rx_sysinfo2bis(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 2bis"
|
||||||
|
" ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 2bis "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 2bis "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -1792,6 +1810,12 @@ static int gsm48_rr_rx_sysinfo2ter(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 2ter"
|
||||||
|
" ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 2ter "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 2ter "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -1824,6 +1848,12 @@ static int gsm48_rr_rx_sysinfo3(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
int payload_len = msgb_l3len(msg) - sizeof(*si);
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 3 "
|
||||||
|
"ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 3 "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 3 "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -1868,6 +1898,12 @@ static int gsm48_rr_rx_sysinfo4(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
uint8_t *data = si->data;
|
uint8_t *data = si->data;
|
||||||
struct gsm48_chan_desc *cd;
|
struct gsm48_chan_desc *cd;
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 4 "
|
||||||
|
"ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
short_read:
|
short_read:
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 4 "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 4 "
|
||||||
|
@ -1928,6 +1964,12 @@ static int gsm48_rr_rx_sysinfo5(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 5 "
|
||||||
|
"ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 5 "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 5 "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -1959,6 +2001,12 @@ static int gsm48_rr_rx_sysinfo5bis(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 5bis"
|
||||||
|
" ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 5bis "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 5bis "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -1991,6 +2039,12 @@ static int gsm48_rr_rx_sysinfo5ter(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 5ter"
|
||||||
|
" ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 5ter "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 5ter "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
@ -2021,6 +2075,12 @@ static int gsm48_rr_rx_sysinfo6(struct osmocom_ms *ms, struct msgb *msg)
|
||||||
struct gsm48_sysinfo *s = ms->cellsel.si;
|
struct gsm48_sysinfo *s = ms->cellsel.si;
|
||||||
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
int payload_len = msgb_l3len(msg) - sizeof(*si) - 1;
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
LOGP(DRR, LOGL_INFO, "No cell selected, SYSTEM INFORMATION 6 "
|
||||||
|
"ignored\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (payload_len < 0) {
|
if (payload_len < 0) {
|
||||||
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 6 "
|
LOGP(DRR, LOGL_NOTICE, "Short read of SYSTEM INFORMATION 6 "
|
||||||
"message.\n");
|
"message.\n");
|
||||||
|
|
Loading…
Reference in New Issue