从handle_request_invite入口,invite请求此处处理replace请求头,如果为replace则认为是咨询,此时不会创建新的通道,而是找到一个通道植入(masqued),大多数情况下是根据invite创建新的请求,所以此处我们从这里开始,不考虑咨询情况
首先检查此请求是否为重复请求,if (!req->ignore) ,接下来调用check_via检查via头域,这个函数涉及到nat穿越问题,此函数解析rport头域参数,如果via头域有rport= ,则设置标记此请求包含rport 域标志,同时检查maddr= 域是否存在,如果此处rport=存在则设置nat mode 为 nat,否则为no nat, 至此check_via结束。
返回 invite函数,这里 invite 有两种情况,一个为 call-id已经存在,则asterisk认为此请求是re-invite(!p->owner),否则认为是一个新的invite,关于re-invite有很多故事,涉及到asterisk是b2bua还是proxy的问题,下面先讨论非 re-invite请求。
从打印信息看到
ast_verbose("Using INVITE request as basis request - %s/n", p->callid);
Using INVITE request as basis request - ZjRiYjZkYzYzZDNjNDRmMjhmMmNlNzdmODE4NTYzZmE.
如果开启sip history 可以看到会调用,
append_history(p, "Invite", "New call: %s", p->callid);
接下来调用parse_ok_contact ()函数保存 此invite的contact头域,以备将来做响应(200 ok,bye, re-invite)
fullcontact 变量保存 全部cantact头域,用来做bye,re-invite,okcontacturi保存uri of acks, bye, re-invite.
接下来调用 下面代码:
if (!p->lastinvite && !req->ignore && !p->owner) { // 全新invite
/* This is a new invite */
/* Handle authentication if this is our first invite */
int cc_recall_core_id = -1;
set_pvt_allowed_methods(p, req);
res = check_user_full(p, req, SIP_INVITE, e, XMIT_RELIABLE, addr, &authpeer);
if (res == AUTH_CHALLENGE_SENT) {
p->invitestate = INV_COMPLETED; /* Needs to restart in another INVITE transaction */
res = 0;
goto request_invite_cleanup;
}
对于第一次请求会做验证,调用check_user_full,下面分析一下此函数。
此函数用 请求的 from 头域 的usr name 和 peer的 ip/port做匹配,check_user_full 调用get_calleridname 从from头域分理出
callid_name,最终调用 check_peer_ok ,check_peer_ok内部查找 peer name 是否在 peers 链表中存在。这里先尝试用
from 头域中的 user name查找,找不到则用 ip/port查找。
这里找到后 输出如下。
if (debug)
ast_verbose("Found peer '%s' for '%s' from %s/n",
peer->name, of, ast_sockaddr_stringify(&p->recv));
Found peer '1501159973' for '1501159973' from 10.10.10.84:59584
然后 把peer 相关属性拷贝到为此peer创建的channle中,如 acc,language,amaflags。callgroup,fullcontact等,
设置定时器管理 事务。。。
接下来调用 dialog_initialize_rtp函数初始化此peer的rtp信息。
是否peer有RTP,有则设置编码。设置RTP 引擎,这里需要说明的是 asterisk1.8开始RTP协议栈改动很大,默认使用Asteirsk提供的rtp协议栈,开发者可以自己嵌入其他rtp协议栈。
设置完协议栈后设置此peer 建立rtp会话的默认编码规则。
Found peer '1501159973' for '1501159973' from 10.10.10.84:59584
[Dec 21 15:30:13] DEBUG[28437]: rtp_engine.c:344 ast_rtp_instance_new: Using