call forwarding介绍
call forwarding是call增值业务;在TS24082中有详细的介绍 呼叫转移有3方用户
- A:呼叫方;(Calling mobile subscriber side)
- B:被叫方且设置有呼叫转移业务;(Served mobile subscriber side)
- C:呼叫转移接受方,即B设置的呼叫转移的接受方;(Forwarded-to mobile subscriber side)
整个流程即:
- 前提条件 B设置了呼叫转移给C方
- A打电话给B
- 满足呼叫转移的4个条件之一, B转移电话给C
- A和C进行通话
各种呼叫转移流程
CFU 无条件呼叫转移
- A方流程
MS
Network SETUP ------------------------------------------------------------------> FACILITY <----------------------------------------------------------------- Facility (Invoke = NotifySS (CFU, SS-Notification)) - B方 没有动作;
- C方
MS
Network SETUP < ---------------------------------------------------------------- Facility (Invoke = NotifySS (CFU, SS-Notification)) Redirecting party BCD number (screening indicator, presentation indicator, redirecting party digits), Redirecting party subaddress
CFB 用户忙时呼叫转移
- A方流程
MS
Network SETUP ----------------------------------------------------------------------> FACILITY <--------------------------------------------------------------------- Facility (Invoke = NotifySS (CFB, SS-Notification)) - B方
MS
Network SETUP <----------------------------------------------------------------------- RELEASE COMPLETE/RELEASE/DISCONNECT -------------------------------------------------------------------------> ....Transaction Identifier (A-B).... ....Cause # 17 (User Busy).... FACILITY (TI=B-X) <------------------------------------------------------------------------ Facility (Invoke = NotifySS (CFB, SS-Notification)) - C方
MS
Network SETUP < ---------------------------------------------------------------------- Facility (Invoke = NotifySS (CFB, SS-Notification)) Redirecting party BCD number (screening indicator, presentation indicator, redirecting party digits), Redirecting party subaddress
CFNRy 无回应呼叫转移
- A方流程
MS
Network SETUP ---------------------------------------------------------------------------------> FACILITY <------------------------------------------------------------------------ Facility (Invoke = NotifySS (CFNRy, SS-Notification)) - B方
MS
Network FACILITY <----------------------------------------------------------------------- Facility (Invoke = NotifySS (CFNRy, SS-Notification))
- C方
MS
Network SETUP < ------------------------------------------------------------------- Facility (Invoke = NotifySS (CFNRc, SS-Notification))Redirecting party BCD number (screening indicator, presentation indicator, redirecting party digits)
CFNRc 用户不可达呼叫转移
- A方流程
MS
Network SETUP -----------------------------------------------------------------------> FACILITY <------------------------------------------------------------------------- Facility (Invoke = NotifySS (CFNRc, SS-Notification)) - B方 没有动作;
- C方
MS
Network SETUP < ---------------------------------------------------------------- Facility (Invoke = NotifySS (CFNRc, SS-Notification))Redirecting party BCD number (screening indicator, presentation indicator, redirecting party digits)
设置呼叫转移
MS Network
REGISTER
------------------------------------------------------------------------>
Facility (Invoke = ActivateSS (呼叫转移类型, BasicServiceCode))
RELEASE COMPLETE
<-----------------------------------------------------------------------
Facility (Return result = DeactivateSS (SS-Status))
注册失败情况:从网络发以下请求中其中一种:
RELEASE COMPLETE
<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ----
Facility (Return error (Error))
RELEASE COMPLETE
<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Facility (Reject (Invoke_problem))
取消呼叫转移
MS Network
REGISTER
--------------------------------------------------------------------------->
Facility (Invoke = DeactivateSS (呼叫转移类型, BasicServiceCode))
RELEASE COMPLETE
<---------------------------------------------------------------------------
Facility (Return result = DeactivateSS (SS-Status))
取消呼叫转移失败情况:从网络发以下请求中其中一种:
RELEASE COMPLETE
<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Facility (Return error (Error))
RELEASE COMPLETE
<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Facility (Reject (Invoke_problem))
呼叫转移代码实现
呼叫转移界面显示实现
主要在callnotifer.java中getSuppSvcNotificationTe
主要分下面2个方面(A 打电话给B,B设置呼叫转移到C;)
- 呼出MO
- MO_CODE_UNCONDITIONAL_CF_ACTIVE/MO_CODE_SOME_CF_ACTIVE: B激活了呼叫转移功能,若B拨打电话出去时,当modem侧上报Alerting消息里包含了faclity的消息,根据B设置的callforwarding的条件,显示给用户;
- MO_CODE_CALL_FORWARDED: A拨打电话给B,呼叫转移给C,接收到网络端发过来的facility消息,在用户A上显示此电话是一个呼叫转移call;
- 呼入MT
- MT_CODE_FORWARDED_CALL:用户C接到呼叫转移过来的call,接收到网络端发过来的facility消息,在用户C上显示这是一个呼叫转移call;
- MT_CODE_ADDITIONAL_CALL_FORWARDED:当用户B设置为CFB 或是 CFNRy ,若发生了呼叫转移,接收到网络端发过来的facility消息,在用户B上显示该call已呼叫转移;(CFNRy 没有确定)
SETUP消息中包含facility消息表明此为一个forwarding call
- cmcall.c
- cmcall_rpt_proc() 底层上报facility消息到CM侧;
- cmwcall_rpt_call()
- 根据cm_rpt_ptr->hdr.cmd ,case:CM_MT_CALL_SS_IND 处理;
- 若是一个forwarding call,则通知上层,消息为:CM_CALL_EVENT_CALL_BEING_FORWARDED
- qmi_voice_cm_if.h
- 把底层上报的消息修改为qmi侧能识别的消息;CM_CALL_EVENT_CALL_BEING_FORWARDED--->QMI_VOICE_CM_IF_EVT_CALL_BEING_FORWARDED
- qmi_voice_cm_if_fill_and_send_sups_notification_ind()对该消息进行处理;
- 赋值notify_type然后调用qmi_voice_cm_if_unsol_response();header=QMI_VOICE_CM_IF_CMD_SUPS_NOTIFICATION_IND;
- qmi_voice_cm_if_unsol_response()对header=QMI_VOICE_CM_IF_CMD_SUPS_NOTIFICATION_IND
- 再一次进行那个赋值
- dcc_send_cmd(DCC_QMI_VOICE_CMD, data_ptr);
- DCC_QMI_VOICE_CMD的情况由qmi_voice_process_cmd()处理
- qmi_voice.c
- qmi_voice_process_cmd() header:QMI_VOICE_CM_IF_CMD_SUPS_NOTIFICATION_IND;
- qmi_voicei_sups_notification_ind()
- qmi_svc_send_ind(xx,xx,VOICEI_CMD_VAL_SUPS_NOTIFICATION_IND【0x0032】,ind),上报到qcril侧;
- voice_service_v02.h
- QMI_VOICE_SUPS_NOTIFICATION_IND_V02 0x0032
- qcril_qmi_voice.c
- qcril_qmi_voice_unsol_ind_cb_helper()
- case:QMI_VOICE_SUPS_NOTIFICATION_IND_V02 --->qcril_qmi_voice_sups_notification_ind_hdlr()
- qcril_qmi_voice_sups_notification_ind_hdlr()
- 根据notification_type进行处理。若来电时forwarding call,符合case:NOTIFICATION_TYPE_INCOMING_FORWARDED_CALL_V02;则标明此为forwarding call;上报给RIL侧;
- 上报消息RIL_UNSOL_SUPP_SVC_NOTIFICATION;该上报没有标明这是什么条件的呼叫转移,只是说明此为一个呼叫转移的电话。
- qcril_qmi_voice_unsol_ind_cb_helper()