summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas.Eversberg <jolly@eversberg.eu>2010-08-11 16:11:28 +0000
committerAndreas.Eversberg <jolly@eversberg.eu>2010-08-11 16:11:28 +0000
commita5b023cd98c792c6fbf3bd7c6b04696fed987d9a (patch)
tree4eef3584752e2e4fb42a3d1b4fb9eb1291f2dd6b
parentcb73be0d0cfa6f5f2c8b437fa3ceb80909199302 (diff)
[layer23] Paging response depends on the supported channels: SDCCH, TCH/F, and TCH/H
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/support.h5
-rw-r--r--src/host/layer23/src/mobile/gsm48_rr.c35
-rw-r--r--src/host/layer23/src/mobile/support.c12
3 files changed, 46 insertions, 6 deletions
diff --git a/src/host/layer23/include/osmocom/bb/mobile/support.h b/src/host/layer23/include/osmocom/bb/mobile/support.h
index 9af4d1b6..782b6406 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/support.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/support.h
@@ -10,6 +10,10 @@
#define GSM_CIPHER_A5_7 6
#define GSM_CIPHER_RESERVED 7
+#define GSM_CAP_SDCCH 0
+#define GSM_CAP_SDCCH_TCHF 1
+#define GSM_CAP_SDCCH_TCHF_TCHH 2
+
struct gsm_support {
struct osmocom_ms *ms;
@@ -72,6 +76,7 @@ struct gsm_support {
uint8_t gps_conv;
/* radio */
+ uint8_t ch_cap; /* channel capability */
int8_t min_rxlev_db;
uint8_t scan_to;
uint8_t sync_to;
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c
index 21f86dd9..9bb6ab17 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -960,6 +960,7 @@ static int gsm48_rr_rx_cm_enq(struct osmocom_ms *ms, struct msgb *msg)
/* start random access */
static int gsm48_rr_chan_req(struct osmocom_ms *ms, int cause, int paging)
{
+ struct gsm_support *sup = &ms->support;
struct gsm48_rrlayer *rr = &ms->rrlayer;
struct gsm322_cellsel *cs = &ms->cellsel;
struct gsm48_sysinfo *s = cs->si;
@@ -1063,16 +1064,38 @@ cause = RR_EST_CAUSE_LOC_UPD;
chan_req_val);
break;
case RR_EST_CAUSE_ANS_PAG_TCH_F:
- /* ms supports no dual rate */
- chan_req_mask = 0x1f;
- chan_req_val = 0x80;
+ switch (sup->ch_cap) {
+ case GSM_CAP_SDCCH_TCHF:
+ chan_req_mask = 0x1f;
+ chan_req_val = 0x80;
+ break;
+ case GSM_CAP_SDCCH_TCHF_TCHH:
+ chan_req_mask = 0x0f;
+ chan_req_val = 0x20;
+ break;
+ case GSM_CAP_SDCCH:
+ chan_req_mask = 0x0f;
+ chan_req_val = 0x10;
+ break;
+ }
LOGP(DRR, LOGL_INFO, "CHANNEL REQUEST: %02x (PAGING TCH/F)\n",
chan_req_val);
break;
case RR_EST_CAUSE_ANS_PAG_TCH_ANY:
- /* ms supports no dual rate */
- chan_req_mask = 0x1f;
- chan_req_val = 0x80;
+ switch (sup->ch_cap) {
+ case GSM_CAP_SDCCH_TCHF:
+ chan_req_mask = 0x1f;
+ chan_req_val = 0x80;
+ break;
+ case GSM_CAP_SDCCH_TCHF_TCHH:
+ chan_req_mask = 0x0f;
+ chan_req_val = 0x30;
+ break;
+ case GSM_CAP_SDCCH:
+ chan_req_mask = 0x0f;
+ chan_req_val = 0x10;
+ break;
+ }
LOGP(DRR, LOGL_INFO, "CHANNEL REQUEST: %02x (PAGING TCH/H or "
"TCH/F)\n", chan_req_val);
break;
diff --git a/src/host/layer23/src/mobile/support.c b/src/host/layer23/src/mobile/support.c
index 40cf1b09..68906586 100644
--- a/src/host/layer23/src/mobile/support.c
+++ b/src/host/layer23/src/mobile/support.c
@@ -100,6 +100,7 @@ void gsm_support_init(struct osmocom_ms *ms)
//sup->sm_val = ;
/* radio */
+ sup->ch_cap = GSM_CAP_SDCCH_TCHF;
sup->min_rxlev_db = -100; // TODO
sup->sync_to = 6; /* how long to wait sync (0.9 s) */
sup->scan_to = 4; /* how long to wait for all sysinfos (>=4 s) */
@@ -148,6 +149,17 @@ void gsm_support_dump(struct gsm_support *sup,
print(priv, " A5/6 : %s\n", (sup->a5_6) ? "yes" : "no");
print(priv, " A5/7 : %s\n", (sup->a5_7) ? "yes" : "no");
print(priv, " A5/1 : %s\n", (sup->a5_1) ? "yes" : "no");
+ switch (sup->ch_cap) {
+ case GSM_CAP_SDCCH:
+ print(priv, " Channels : SDCCH only\n");
+ break;
+ case GSM_CAP_SDCCH_TCHF:
+ print(priv, " Channels : SDCCH + TCH/F\n");
+ break;
+ case GSM_CAP_SDCCH_TCHF_TCHH:
+ print(priv, " Channels : SDCCH + TCH/F + TCH/H\n");
+ break;
+ }
print(priv, " Min RXLEV: %d\n", sup->min_rxlev_db);
}