gprs_gmm.c: Make TLLI handling specific to Gb interface

Soem of the operations we perform in the GMM layer are specific to the
GPRS/EDGE radio access network and its Gb interface.  Let's make them
conditional to that in preparation of supporting an Iu interface.

Change-Id: I3efb7c5087afe8e2331ec17bd9fac5029f4bee6c
This commit is contained in:
Harald Welte
2015-12-25 22:23:27 +01:00
committed by Neels Hofmeyr
parent e98ba82d2b
commit dbc72b37ee

View File

@@ -904,8 +904,10 @@ static int gsm48_rx_gmm_att_req(struct sgsn_mm_ctx *ctx, struct msgb *msg,
strncpy(ctx->imsi, mi_string, sizeof(ctx->imsi) - 1); strncpy(ctx->imsi, mi_string, sizeof(ctx->imsi) - 1);
#endif #endif
} }
ctx->gb.tlli = msgb_tlli(msg); if (ctx->ran_type == MM_CTX_T_GERAN_Gb) {
ctx->gb.llme = llme; ctx->gb.tlli = msgb_tlli(msg);
ctx->gb.llme = llme;
}
msgid2mmctx(ctx, msg); msgid2mmctx(ctx, msg);
break; break;
case GSM_MI_TYPE_TMSI: case GSM_MI_TYPE_TMSI:
@@ -920,8 +922,10 @@ static int gsm48_rx_gmm_att_req(struct sgsn_mm_ctx *ctx, struct msgb *msg,
ctx = sgsn_mm_ctx_alloc(msgb_tlli(msg), &ra_id); ctx = sgsn_mm_ctx_alloc(msgb_tlli(msg), &ra_id);
ctx->p_tmsi = tmsi; ctx->p_tmsi = tmsi;
} }
ctx->gb.tlli = msgb_tlli(msg); if (ctx->ran_type == MM_CTX_T_GERAN_Gb) {
ctx->gb.llme = llme; ctx->gb.tlli = msgb_tlli(msg);
ctx->gb.llme = llme;
}
msgid2mmctx(ctx, msg); msgid2mmctx(ctx, msg);
break; break;
default: default:
@@ -932,7 +936,8 @@ static int gsm48_rx_gmm_att_req(struct sgsn_mm_ctx *ctx, struct msgb *msg,
} }
/* Update MM Context with currient RA and Cell ID */ /* Update MM Context with currient RA and Cell ID */
ctx->ra = ra_id; ctx->ra = ra_id;
ctx->gb.cell_id = cid; if (ctx->ran_type == MM_CTX_T_GERAN_Gb)
ctx->gb.cell_id = cid;
/* Update MM Context with other data */ /* Update MM Context with other data */
ctx->drx_parms = drx_par; ctx->drx_parms = drx_par;
ctx->ms_radio_access_capa.len = ms_ra_acc_cap_len; ctx->ms_radio_access_capa.len = ms_ra_acc_cap_len;
@@ -950,13 +955,16 @@ static int gsm48_rx_gmm_att_req(struct sgsn_mm_ctx *ctx, struct msgb *msg,
} }
ctx->mm_state = GMM_COMMON_PROC_INIT; ctx->mm_state = GMM_COMMON_PROC_INIT;
#endif #endif
/* Even if there is no P-TMSI allocated, the MS will switch from
* foreign TLLI to local TLLI */
ctx->gb.tlli_new = gprs_tmsi2tlli(ctx->p_tmsi, TLLI_LOCAL);
/* Inform LLC layer about new TLLI but keep old active */ if (ctx->ran_type == MM_CTX_T_GERAN_Gb) {
gprs_llgmm_assign(ctx->gb.llme, ctx->gb.tlli, ctx->gb.tlli_new, /* Even if there is no P-TMSI allocated, the MS will
GPRS_ALGO_GEA0, NULL); * switch from foreign TLLI to local TLLI */
ctx->gb.tlli_new = gprs_tmsi2tlli(ctx->p_tmsi, TLLI_LOCAL);
/* Inform LLC layer about new TLLI but keep old active */
gprs_llgmm_assign(ctx->gb.llme, ctx->gb.tlli, ctx->gb.tlli_new,
GPRS_ALGO_GEA0, NULL);
}
ctx->pending_req = GSM48_MT_GMM_ATTACH_REQ; ctx->pending_req = GSM48_MT_GMM_ATTACH_REQ;
return gsm48_gmm_authorize(ctx); return gsm48_gmm_authorize(ctx);
@@ -1218,8 +1226,10 @@ static int gsm48_rx_gmm_ra_upd_req(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
/* Update the MM context with the new RA-ID */ /* Update the MM context with the new RA-ID */
bssgp_parse_cell_id(&mmctx->ra, msgb_bcid(msg)); bssgp_parse_cell_id(&mmctx->ra, msgb_bcid(msg));
/* Update the MM context with the new (i.e. foreign) TLLI */ if (mmctx->ran_type == MM_CTX_T_GERAN_Gb) {
mmctx->gb.tlli = msgb_tlli(msg); /* Update the MM context with the new (i.e. foreign) TLLI */
mmctx->gb.tlli = msgb_tlli(msg);
}
/* FIXME: Update the MM context with the MS radio acc capabilities */ /* FIXME: Update the MM context with the MS radio acc capabilities */
/* FIXME: Update the MM context with the MS network capabilities */ /* FIXME: Update the MM context with the MS network capabilities */
@@ -1244,13 +1254,16 @@ static int gsm48_rx_gmm_ra_upd_req(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
sig_data.mm = mmctx; sig_data.mm = mmctx;
osmo_signal_dispatch(SS_SGSN, S_SGSN_UPDATE, &sig_data); osmo_signal_dispatch(SS_SGSN, S_SGSN_UPDATE, &sig_data);
#endif #endif
/* Even if there is no P-TMSI allocated, the MS will switch from if (mmctx->ran_type == MM_CTX_T_GERAN_Gb) {
* foreign TLLI to local TLLI */ /* Even if there is no P-TMSI allocated, the MS will switch from
mmctx->gb.tlli_new = gprs_tmsi2tlli(mmctx->p_tmsi, TLLI_LOCAL); * foreign TLLI to local TLLI */
mmctx->gb.tlli_new = gprs_tmsi2tlli(mmctx->p_tmsi, TLLI_LOCAL);
/* Inform LLC layer about new TLLI but keep old active */ /* Inform LLC layer about new TLLI but keep old active */
gprs_llgmm_assign(mmctx->gb.llme, mmctx->gb.tlli, mmctx->gb.tlli_new, gprs_llgmm_assign(mmctx->gb.llme, mmctx->gb.tlli,
GPRS_ALGO_GEA0, NULL); mmctx->gb.tlli_new, GPRS_ALGO_GEA0,
NULL);
}
/* Look at PDP Context Status IE and see if MS's view of /* Look at PDP Context Status IE and see if MS's view of
* activated/deactivated NSAPIs agrees with our view */ * activated/deactivated NSAPIs agrees with our view */
@@ -1270,10 +1283,13 @@ rejected:
rc = gsm48_tx_gmm_ra_upd_rej(msg, reject_cause); rc = gsm48_tx_gmm_ra_upd_rej(msg, reject_cause);
if (mmctx) if (mmctx)
mm_ctx_cleanup_free(mmctx, "GPRS RA UPDATE REJ"); mm_ctx_cleanup_free(mmctx, "GPRS RA UPDATE REJ");
else else {
/* TLLI unassignment */ if (llme) {
gprs_llgmm_assign(llme, llme->tlli, 0xffffffff, GPRS_ALGO_GEA0, /* TLLI unassignment */
NULL); gprs_llgmm_assign(llme, llme->tlli, 0xffffffff,
GPRS_ALGO_GEA0, NULL);
}
}
return rc; return rc;
} }
@@ -1387,10 +1403,13 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
mmctx->t3350_mode = GMM_T3350_MODE_NONE; mmctx->t3350_mode = GMM_T3350_MODE_NONE;
mmctx->p_tmsi_old = 0; mmctx->p_tmsi_old = 0;
mmctx->pending_req = 0; mmctx->pending_req = 0;
/* Unassign the old TLLI */ if (mmctx->ran_type == MM_CTX_T_GERAN_Gb) {
mmctx->gb.tlli = mmctx->gb.tlli_new; /* Unassign the old TLLI */
gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff, mmctx->gb.tlli_new, mmctx->gb.tlli = mmctx->gb.tlli_new;
GPRS_ALGO_GEA0, NULL); gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff,
mmctx->gb.tlli_new,
GPRS_ALGO_GEA0, NULL);
}
mmctx->mm_state = GMM_REGISTERED_NORMAL; mmctx->mm_state = GMM_REGISTERED_NORMAL;
rc = 0; rc = 0;
@@ -1407,10 +1426,12 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
mmctx->t3350_mode = GMM_T3350_MODE_NONE; mmctx->t3350_mode = GMM_T3350_MODE_NONE;
mmctx->p_tmsi_old = 0; mmctx->p_tmsi_old = 0;
mmctx->pending_req = 0; mmctx->pending_req = 0;
/* Unassign the old TLLI */ if (mmctx->ran_type == MM_CTX_T_GERAN_Gb) {
mmctx->gb.tlli = mmctx->gb.tlli_new; /* Unassign the old TLLI */
gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff, mmctx->gb.tlli_new, mmctx->gb.tlli = mmctx->gb.tlli_new;
GPRS_ALGO_GEA0, NULL); gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff, mmctx->gb.tlli_new,
GPRS_ALGO_GEA0, NULL);
}
mmctx->mm_state = GMM_REGISTERED_NORMAL; mmctx->mm_state = GMM_REGISTERED_NORMAL;
rc = 0; rc = 0;
@@ -1426,9 +1447,11 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
mmctx->t3350_mode = GMM_T3350_MODE_NONE; mmctx->t3350_mode = GMM_T3350_MODE_NONE;
mmctx->p_tmsi_old = 0; mmctx->p_tmsi_old = 0;
mmctx->pending_req = 0; mmctx->pending_req = 0;
/* Unassign the old TLLI */ if (mmctx->ran_type == MM_CTX_T_GERAN_Gb) {
mmctx->gb.tlli = mmctx->gb.tlli_new; /* Unassign the old TLLI */
//gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff, mmctx->gb.tlli_new, GPRS_ALGO_GEA0, NULL); mmctx->gb.tlli = mmctx->gb.tlli_new;
//gprs_llgmm_assign(mmctx->gb.llme, 0xffffffff, mmctx->gb.tlli_new, GPRS_ALGO_GEA0, NULL);
}
rc = 0; rc = 0;
break; break;
case GSM48_MT_GMM_AUTH_CIPH_RESP: case GSM48_MT_GMM_AUTH_CIPH_RESP:
@@ -2109,7 +2132,8 @@ int gsm0408_gprs_force_reattach_oldmsg(struct msgb *msg)
int gsm0408_gprs_force_reattach(struct sgsn_mm_ctx *mmctx) int gsm0408_gprs_force_reattach(struct sgsn_mm_ctx *mmctx)
{ {
int rc; int rc;
gprs_llgmm_reset(mmctx->gb.llme); if (mmctx->ran_type == MM_CTX_T_GERAN_Gb)
gprs_llgmm_reset(mmctx->gb.llme);
rc = gsm48_tx_gmm_detach_req( rc = gsm48_tx_gmm_detach_req(
mmctx, GPRS_DET_T_MT_REATT_REQ, GMM_CAUSE_IMPL_DETACHED); mmctx, GPRS_DET_T_MT_REATT_REQ, GMM_CAUSE_IMPL_DETACHED);