summaryrefslogtreecommitdiffstats
path: root/src/host/layer23/src/mobile/gsm322.c
diff options
context:
space:
mode:
authorAndreas.Eversberg <jolly@eversberg.eu>2010-09-26 10:35:46 +0000
committerAndreas.Eversberg <jolly@eversberg.eu>2010-09-26 10:35:46 +0000
commit4ed601ae4e48e8d480c3e0f5e82160434e6a32c8 (patch)
treef3ec61df2af05361485c3e8377793a145f351558 /src/host/layer23/src/mobile/gsm322.c
parent4c11da77906c6a7ca08b739b02c7475ec07d4577 (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.c20
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);