您的位置:首页 > 其它

语音呼叫流程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状态接到服务连接请求消息的处理如下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: