From 210de12ec4ffa9a3ffc8a1cb81f60c30a834dee1 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sat, 6 Aug 2011 17:56:06 +0200 Subject: 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. --- src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h | 3 ++- src/host/layer23/src/mobile/gsm48_mm.c | 6 +++++- src/host/layer23/src/mobile/gsm48_rr.c | 11 ++++++----- 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 -- cgit v1.2.3-55-g7522