summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg2011-08-06 17:56:06 +0200
committerAndreas Eversberg2011-08-06 17:56:06 +0200
commit210de12ec4ffa9a3ffc8a1cb81f60c30a834dee1 (patch)
tree371329b23cc754dc7768b96d93ace554ccca1cc4
parentFix of wong Classmark 1 on Location Updating and IMSI Detach (diff)
downloadosmocom-210de12ec4ffa9a3ffc8a1cb81f60c30a834dee1.tar.gz
osmocom-210de12ec4ffa9a3ffc8a1cb81f60c30a834dee1.tar.xz
osmocom-210de12ec4ffa9a3ffc8a1cb81f60c30a834dee1.zip
Fix of wong Classmark 2 when doing CM Service Request.
Same reason as the commit below... (3b2b3b09a) Thanx again to Dieter for pointing this out.
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h3
-rw-r--r--src/host/layer23/src/mobile/gsm48_mm.c6
-rw-r--r--src/host/layer23/src/mobile/gsm48_rr.c11
3 files changed, 13 insertions, 7 deletions
diff --git a/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h b/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h
index 756d302..1af09f4 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h
@@ -188,7 +188,8 @@ int gsm48_decode_lai(struct gsm48_loc_area_id *lai, uint16_t *mcc,
uint16_t *mnc, uint16_t *lac);
int gsm48_encode_lai(struct gsm48_loc_area_id *lai, uint16_t mcc,
uint16_t mnc, uint16_t lac);
-int gsm48_rr_enc_cm2(struct osmocom_ms *ms, struct gsm48_classmark2 *cm);
+int gsm48_rr_enc_cm2(struct osmocom_ms *ms, struct gsm48_classmark2 *cm,
+ uint16_t arfcn);
int gsm48_rr_tx_rand_acc(struct osmocom_ms *ms, struct msgb *msg);
int gsm48_rr_los(struct osmocom_ms *ms);
int gsm48_rr_rach_conf(struct osmocom_ms *ms, uint32_t fn);
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c
index ec393c2..ff936e3 100644
--- a/src/host/layer23/src/mobile/gsm48_mm.c
+++ b/src/host/layer23/src/mobile/gsm48_mm.c
@@ -2753,6 +2753,8 @@ static int gsm48_mm_tx_cm_serv_req(struct osmocom_ms *ms, int rr_prim,
uint8_t cm_serv)
{
struct gsm48_mmlayer *mm = &ms->mmlayer;
+ struct gsm48_rrlayer *rr = &ms->rrlayer;
+ struct gsm322_cellsel *cs = &ms->cellsel;
struct gsm_subscriber *subscr = &ms->subscr;
struct gsm_settings *set = &ms->settings;
struct msgb *nmsg;
@@ -2778,7 +2780,9 @@ static int gsm48_mm_tx_cm_serv_req(struct osmocom_ms *ms, int rr_prim,
nsr->cipher_key_seq = subscr->key_seq;
/* classmark 2 */
cm2lv[0] = sizeof(struct gsm48_classmark2);
- gsm48_rr_enc_cm2(ms, (struct gsm48_classmark2 *)(cm2lv + 1));
+ gsm48_rr_enc_cm2(ms, (struct gsm48_classmark2 *)(cm2lv + 1),
+ (rr_prim == GSM48_RR_EST_REQ) ? cs->sel_arfcn
+ : rr->cd_now.arfcn);
/* MI */
if (mm->est_cause == RR_EST_CAUSE_EMERGENCY && set->emergency_imsi[0]) {
LOGP(DMM, LOGL_INFO, "-> Using IMSI %s for emergency\n",
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c
index 7722a42..c1e386a 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -1159,13 +1159,13 @@ static int gsm48_rr_enc_cm3(struct osmocom_ms *ms, uint8_t *buf, uint8_t *len)
}
/* encode classmark 2 */
-int gsm48_rr_enc_cm2(struct osmocom_ms *ms, struct gsm48_classmark2 *cm)
+int gsm48_rr_enc_cm2(struct osmocom_ms *ms, struct gsm48_classmark2 *cm,
+ uint16_t arfcn)
{
- struct gsm48_rrlayer *rr = &ms->rrlayer;
struct gsm_support *sup = &ms->support;
struct gsm_settings *set = &ms->settings;
- cm->pwr_lev = gsm48_current_pwr_lev(set, rr->cd_now.arfcn);
+ cm->pwr_lev = gsm48_current_pwr_lev(set, arfcn);
cm->a5_1 = !set->a5_1;
cm->es_ind = sup->es_ind;
cm->rev_lev = sup->rev_lev;
@@ -1189,6 +1189,7 @@ static int gsm48_rr_tx_cm_change(struct osmocom_ms *ms)
{
struct gsm_support *sup = &ms->support;
struct gsm_settings *set = &ms->settings;
+ struct gsm48_rrlayer *rr = &ms->rrlayer;
struct msgb *nmsg;
struct gsm48_hdr *gh;
struct gsm48_cm_change *cc;
@@ -1207,7 +1208,7 @@ static int gsm48_rr_tx_cm_change(struct osmocom_ms *ms)
/* classmark 2 */
cc->cm2_len = sizeof(cc->cm2);
- gsm48_rr_enc_cm2(ms, &cc->cm2);
+ gsm48_rr_enc_cm2(ms, &cc->cm2, rr->cd_now.arfcn);
/* classmark 3 */
if (set->dcs || set->pcs || set->e_gsm || set->r_gsm || set->gsm_850
@@ -3174,7 +3175,7 @@ static int gsm48_rr_dl_est(struct osmocom_ms *ms)
pr->key_seq = subscr->key_seq;
/* classmark 2 */
pr->cm2_len = sizeof(pr->cm2);
- gsm48_rr_enc_cm2(ms, &pr->cm2);
+ gsm48_rr_enc_cm2(ms, &pr->cm2, rr->cd_now.arfcn);
/* mobile identity */
if (ms->subscr.tmsi != 0xffffffff
&& ms->subscr.mcc == cs->sel_mcc