mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-11-04 05:53:26 +00:00 
			
		
		
		
	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:
		
				
					committed by
					
						
						Neels Hofmeyr
					
				
			
			
				
	
			
			
			
						parent
						
							e98ba82d2b
						
					
				
				
					commit
					dbc72b37ee
				
			@@ -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);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user