diff options
author | Andreas.Eversberg <jolly@eversberg.eu> | 2010-09-26 10:35:46 +0000 |
---|---|---|
committer | Andreas.Eversberg <jolly@eversberg.eu> | 2010-09-26 10:35:46 +0000 |
commit | 4ed601ae4e48e8d480c3e0f5e82160434e6a32c8 (patch) | |
tree | f3ec61df2af05361485c3e8377793a145f351558 /src/host/layer23/src/mobile/gsm322.c | |
parent | 4c11da77906c6a7ca08b739b02c7475ec07d4577 (diff) |
[layer23] Adding application generated measurement report
The cell provides SYSTEM INFORMATION 5* and 6. These are used to create a
list of neighbor cells to monitor. Because there is no neighbor cell
monitoring supported by layer1, the list has no valid results yet.
Currently the average RX level of received frames are used to generate a new
report every second. The report is transmitted to layer1 and used there
whenever a measurement report has to be transmitted.
The timing advance and the current transmit power (as requested by network),
is included with every report.
Diffstat (limited to 'src/host/layer23/src/mobile/gsm322.c')
-rw-r--r-- | src/host/layer23/src/mobile/gsm322.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/host/layer23/src/mobile/gsm322.c b/src/host/layer23/src/mobile/gsm322.c index fb8b85bd..3b707f55 100644 --- a/src/host/layer23/src/mobile/gsm322.c +++ b/src/host/layer23/src/mobile/gsm322.c @@ -260,6 +260,8 @@ static int gsm322_sync_to_cell(struct gsm322_cellsel *cs) static void gsm322_unselect_cell(struct gsm322_cellsel *cs) { cs->selected = 0; + if (cs->si) + cs->si->si5 = 0; /* unset SI5* */ cs->si = NULL; memset(&cs->sel_si, 0, sizeof(cs->sel_si)); cs->sel_mcc = cs->sel_mnc = cs->sel_lac = cs->sel_id = 0; @@ -1996,9 +1998,10 @@ struct gsm322_ba_list *gsm322_cs_sysinfo_sacch(struct osmocom_ms *ms) llist_add_tail(&ba->entry, &cs->ba_list); } /* update (add) ba list */ - memcpy(freq, ba->freq, sizeof(freq)); + memset(freq, 0, sizeof(freq)); for (i = 0; i <= 1023; i++) { - if ((s->freq[i].mask & FREQ_TYPE_REP)) + if ((s->freq[i].mask & (FREQ_TYPE_SERV + | FREQ_TYPE_NCELL | FREQ_TYPE_REP))) freq[i >> 3] |= (1 << (i & 7)); } if (!!memcmp(freq, ba->freq, sizeof(freq))) { @@ -2036,7 +2039,7 @@ static int gsm322_store_ba_list(struct gsm322_cellsel *cs, freq[cs->arfcn >> 3] |= (1 << (cs->arfcn & 7)); for (i = 0; i <= 1023; i++) { if ((s->freq[i].mask & - (FREQ_TYPE_SERV | FREQ_TYPE_NCELL))) + (FREQ_TYPE_SERV | FREQ_TYPE_NCELL | FREQ_TYPE_REP))) freq[i >> 3] |= (1 << (i & 7)); } if (!!memcmp(freq, ba->freq, sizeof(freq))) { @@ -2385,6 +2388,7 @@ static int gsm322_l1_signal(unsigned int subsys, unsigned int signal, struct osmocom_ms *ms; struct gsm322_cellsel *cs; struct osmobb_meas_res *mr; + struct osmobb_fbsb_res *fr; int i; int8_t rxlev; @@ -2420,12 +2424,16 @@ static int gsm322_l1_signal(unsigned int subsys, unsigned int signal, gsm322_cs_powerscan(ms); break; case S_L1CTL_FBSB_RESP: - ms = signal_data; + fr = signal_data; + ms = fr->ms; cs = &ms->cellsel; if (cs->ccch_state == GSM322_CCCH_ST_INIT) { - LOGP(DCS, LOGL_INFO, "Channel synched. (ARFCN=%d)\n", - cs->arfcn); + LOGP(DCS, LOGL_INFO, "Channel synched. (ARFCN=%d, " + "snr=%u, BSIC=%u)\n", cs->arfcn, fr->snr, + fr->bsic); cs->ccch_state = GSM322_CCCH_ST_SYNC; + if (cs->si) + cs->si->bsic = fr->bsic; #if 0 stop_cs_timer(cs); |