语音呼叫流程L2+L3
2013-03-20 18:26
316 查看
从cdma_sa开始写
里面有个系统接入主循环,一个呼叫事件都在这个循环里面处理。
对于语音呼叫,当接到cm发下来的orig事件时cdma.curr_state=CDMA_ORIG=new_state
调用mccsa_send_origination_msg往基站发Origination消息,返回的状态还是没变,然后等待基站的回复
new_state = mccsa_wait_for_access_response( new_state )
这个函数里面是个循环并阻塞等待基站的响应,同时响应消息也是在里面处理。
从上面的流程图知道,发完orig之后,基站会给相应的Ack Order
这个街道的page/Order消息中有几个消息字段如下:
pc_ord.order=CAI_BS_ACK_ORD=0X10=16
gen_pc.msg_type/msg_id=CAI_PC_ORD_MSG=7
next_state = mccsa_process_layer3( &mccsa_matched_msg, curr_state )
这个函数处理order,但是在代码里对这个CAI_BS_ACK_ORD没做处理继续的处理,所以此处返回的next_state还是curr_state
服务连接请求消息对应的消息类型是CAI_SRV_CON_MSG=0x14
连接完成消息对应的id=CAI_SRV_CMP_MSG=0x0e
信道分配消息CAI_EXT_CHN_ASN_MSG=0x15
当得到信道指配消息时,他是需要发ack的,在处理lay3前先发 BS_ACK_ORD给bs,代码如下
next_state = mccsa_check_if_chan_assgn_is_okay(matched_msg_ptr, curr_state, &status);
if (matched_msg_ptr->chnasn.hdr.ack_req) { /* ------------------------------------------------------- ** We need to send an ack before processing the layer 3 of ** this message. Save the layer 3 and send a BS_ACK_ORD. ** ------------------------------------------------------- */ mccsa_layer2.pending_msg = *matched_msg_ptr; mccsa_layer2.pending_msg_flag = TRUE; /* Mark that duplicate detction has been done on this msg */ mccsa_layer2.dup_detect_done = TRUE;注意只有处在Page Response and Origination Substates时才会处理信道指配消息的。我们的情况是接到信道指配消息不需要发ack,则会调用mccsa_process_chan_assign_msg,跳转到CDMA_TC状态,这个函数有几条重要的语句
if ((ca_ptr->am0.encrypt_mode != CAI_ENCRYPTION_DISABLED) && (ca_ptr->am0.encrypt_mode != CAI_ENCRYPT_CALL_CTL_MSGS) ) #endif /* FEATURE_IS2000_REL_A_AES */ { QSR_MSG_ERROR( 2722419535ULL, "Encrypt mode %d not supported, changed to DISABLED", ca_ptr->am0.encrypt_mode, 0, 0);//auto-gen, to change remove 'QSR_' and first param ca_ptr->am0.encrypt_mode = CAI_ENCRYPTION_DISABLED; }
信道分配消息里面的ca_ptr->am0.encrypt_mode=CAI_ENCRYPTION_DISABLED表示不加密
如果
if ((msg_type == CAI_CHN_ASN_MSG) && (asgn_mode == CAI_TRAFFIC_CHAN_ASSIGN)) { /* This assign mode implies not to use service negotiation */ cdma.serv_neg = FALSE; }
我们采用的是CAI_EXT_CHN_ASN_MSG,所以cdma.serv_neg=true
cdma.ho_state = CDMA_IDLE_HO;
tc的初始化
接到的ccam中granted_mode=CAI_GRANT_STR,表示不进行服务协商
srv_neg_needed = FALSE;
tmp_so = so;呼叫传进来的服务选项
tmp_mux = SNM_DEFAULT_MUX;
srv_subf = SRV_WF_CON_SUBF;//这个很重要/* Waiting for service connect message subfunction */
srv_current_cfg里面保存了初始化时设置的服务协商选项配置信息
在tc状态接到服务连接请求消息的处理如下
相关文章推荐
- 简易VC语音呼叫系统
- 【SIP基础】SIP协议基本呼叫流程
- SIP呼叫流程
- 典型的SS7呼叫信令流程(真)
- freeswitch系列四 通过实例学习sip协议的注册、呼叫、挂断流程
- 主叫基本呼叫流程分析
- freeswitch呼叫流程分析
- 网吧用的语音呼叫软件
- WCDMA呼叫流程
- SIP呼叫流程典型流程图解及其详细解释
- SIP协议呼叫流程及协议分析
- 清晰认清L2 L3 L4 Switch
- C#控制语音卡实现呼叫、录音以及来电弹屏
- 一个完整的SIP呼叫流程
- 呼叫流程
- 【LTE基础】SRVCC(Single Radio Voice Call Continuity 双模单待无线语音呼叫连续性)技术研究背景
- cache 是什么意思 它包括的L1,L2,L3分别是什么东西
- gem5: 在缓存代码中如何识别缓存是L1,L2还是L3呢?