Asterisk 1.8 sip 协议栈分析(2)

本文详细介绍了Asterisk 1.8中处理INVITE请求的过程,包括检查请求重复、验证、处理RTP信息、初始化SDP以及检查呼叫限制。在处理过程中,涉及到了NAT穿越、认证、RTP引擎配置、SDP解析和Dialplan应用等关键步骤。
摘要由CSDN通过智能技术生成

从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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值