帮同学宣传一下http://shop57644665.taobao.com/

MMR_NREG_REQ

需要发送MMR_NREG_REQ的情况有如下3种。CS_SIM_REM,CS_POW_OFF,CS_SOFT_OFF。

这个过程将会进行如下操作

TIMERSTOP (T3212);

然后调用mm_mmr_nreg_req函数进行处理。

对于此时MM处于不同的状态,MM会执行对应的操作。

MM_NULL:

CS_POW_OFF和CS_SOFT_OFF会先清除register data,复制sim发给mm的sim_insert_info到mm的register data中,然后清除sim_insert_info然后向GMM发送MMGMM_NREG_CNF原语。

CS_SIM_REM也会清除register data,然后会对是否需要再次注册进行判断,然后向GMM发送MMGMM_NREG_IND原语,最后如果STATE_REG_TYPE为REG_REMOTE_CONTROLLED的话,会将STATE_REG_TYPE设置为REG_CELL_SEARCH_ONLY,STATE_GPRS_CM_EST为CM_GPRS_EST_IDLE。

MM_LUP_INITIATED,MM_LUP_REJECTED:

先向RR发送RR_SYNC_REQ,然后设置状态为MM无效的update state。然后执行同MM状态为MM_WAIT_FOR_OUTG_MM_CONN,MM_CONN_ACTIVE,MM_PROCESS_PROMPT,MM_WAIT_FOR_NW_CMD一样的操作。

MM_WAIT_FOR_OUTG_MM_CONN,MM_CONN_ACTIVE,MM_PROCESS_PROMPT,MM_WAIT_FOR_NW_CMD:

如果MM此时允许attach,ms已经updated,detach_done为MMGMM_PERFORM_DETACH则进行如下操作

先将所有CM connections的类型为CM_NOT_IDLE的连接释放。停止timer T3210,T3211,T3212,T3213,T3230,T3240,然后向RR发送imsi_detach_message,启动timer T3220,将MM状态设置为MM_IMSI_DETACH_INIT。

如果MM状态不满足要求则执行同MM状态为MM_WAIT_FOR_RR_CONN_LUP,MM_WAIT_FOR_RR_CONN_MM,MM_WAIT_FOR_REESTABLISH一样的操作。

MM_WAIT_FOR_RR_CONN_LUP,MM_WAIT_FOR_RR_CONN_MM,MM_WAIT_FOR_REESTABLISH:

依然先将所有CM connections的类型为CM_NOT_IDLE的连接释放,停止timer T3210,T3211,T3212,T3213,T3230,T3240,如果是CS_POW_OFF和CS_SOFT_OFF则会向RR发送RR_ABORT_REQ,原因设置为normal abort,而CS_SIM_REM则会将原因设置为sim remove。最后将MM状态设置为MM_IMSI_DETACH_INIT。

MM_IMSI_DETACH_INIT,MM_WAIT_FOR_RR_CONN_DETACH:

设置mm_data->nreg_cause = nreg_cause;

MM_WAIT_FOR_RR_ACTIVE:RR is searching for a cell

为什么此时RR is searching for a cell?根据04.08

“If no RR connection exists, the MM sublayer within the mobile

* station will request the RR sublayer to establish a RR

* connection. If establishment of the RR connection is not possible

* because a suitable cell is not (or not yet) available then, the

* mobile station shall try for a period of at least 5 seconds and for

* not more than a period of 20 seconds to find a suitable cell. If a

* suitable cell is found during this time then, the mobile station shall

* request the RR sublayer to establish an RR connection, otherwise the

* IMSI detach is aborted.

CS_POW_OFF和CS_SOFT_OFF向DL层发送MDL_RELEASE_REQ(SAPI 0),这个其实应该是RR层做的。接着向RR发送RR_DEACTIVATE_REQ,清除register data,停止所有MM timer,最后将MM状态设置为MM_NULL。最后还会执行MM状态为MM_NULL同样的操作。

CS_SIM_REM先向RR发送RR_ABORT_REQ,原因是sim remove,然后执行MM状态为MM_NULL同样的操作。

MM_LOCATION_UPDATING_PENDING,MM_IMSI_DETACH_PENDING,MM_IDLE_LUP_NEEDED,
MM_IDLE_NORMAL_SERVICE,MM_IDLE_ATTEMPT_TO_UPDATE:

停止timer T3212,T3213。如果MM此时允许attach,ms已经updated,detach_done为MMGMM_PERFORM_DETACH则创建imsi_detach_message,然后处理mobile originated call by SS or SMS,设置状态为MM_WAIT_FOR_RR_CONN_DETACH。

如果MM状态不满足要求则执行同MM状态为MM_IDLE_LIMITED_SERVICE,MM_IDLE_NO_IMSI同样的操作。

MM_IDLE_LIMITED_SERVICE,MM_IDLE_NO_IMSI:

停止timer T3211,T3212,T3213。CS_POW_OFF和CS_SOFT_OFF先向DL层发送MDL_RELEASE_REQ(SAPI 0),接着向RR发送RR_DEACTIVATE_REQ,清除register data,设置MM状态为NO_SERVICE。

CS_SIM_REM先向DL层发送MDL_RELEASE_REQ(SAPI 0),然后向RR发送RR_ABORT_REQ,原因是sim remove,清除register data,如果(mm_data->mm_idle_no_imsi_marker EQ 0)则mm_data->mm_idle_no_imsi_marker = 17;设置MM状态为MM_IDLE_NO_IMSI,执行同MM状态为MM_NULL同样的操作,不过将service改为LIMITED_SERVICE。

MM_IDLE_NO_CELL_AVAILABLE:

基本上同MM_IDLE_LIMITED_SERVICE,MM_IDLE_NO_IMSI一样,只是CS_SIM_REM最后的service不是LIMITED_SERVICE而是NO_SERVICE。

MM_IDLE_PLMN_SEARCH,MM_PLMN_SEARCH_NORMAL_SERVICE:

返回network search开始时MM的状态

SET_STATE (STATE_MM, mm_data->idle_substate);

然后再次调用本函数进行状态处理。

mm_mmr_nreg_req (nreg_cause, detach_done);