osip源代码框架详解(6)

2018-12-04 22:40

Q/CT XXXX.1-2008

4.2.2.1 Exosip_read_message的处理

Exosip_read_message根据使用的传输层协议,调用传输层的tl_read_message函数从TCP/IP协议栈底层读取message。如果从传输层读取message成功,则交给

_eXosip_handle_incoming_message进行处理。在_eXosip_handle_incoming_message中,首先解析该message,如果解析成功,在解析完之后,检查message中的必要字段call_id number。如果管理程序在exosip中注册了message的消息处理函数,则回调注册该函数。然后根据message的类型,检查合法性并确定该message的产生的transaction的event的类型,因为是接收到message,所以类型全部为RCV_XXX类型,在发送message时,产生SND_XXX的event。因为是新接收到的message,有三种可能,一是能匹配已经存在的transaction,即是某个请求的应答或ACK;如果不能匹配,根据message中的状态码,如果是0,说明是一个请求,而且这个请求不能匹配已经存在的transaction,所以是一个新请求,对新请求的处理在函数eXosip_process_newrequest中;如果status不为0,则是一个response,因为response是对一个request的回应,而发送request的时候在本端肯定已经建立了新的transaction,如果逻辑处理正确,该response应该匹配到某一个存在的transaction,现在没有匹配到,说明该response是一个错误发送的response,对response的处理在函数

eXosip_process_response_out_of_transaction中。Exosip_read_message的处理流程如下:

中国IMS网络SIP协议规范总体技术要求 - 26 -

Q/CT XXXX.1-2008

eXosip_read_messageeXtl_udp.tl_read_messageeXtl_tcp.tl_read_messageeXtl_dtls.tl_read_messageeXtl_tls.tl_read_message_eXosip_handle_incoming_messageosip_message_initosip_message_parseeXosip.cbsipCallbackosip_message_fix_last_via_headerosip_find_transaction_and_add_eventFind transaction successNoMSG_IS_REQUESTYesNoeXosip_process_response_out_of_transactionYeseXosip_process_newrequest返回success

eXosip_process_newrequest的处理流程如下:

a) 根据message的类型,获取到ctx_type的类型,因为是接收端,所以本端为

server,如果message既不是INVITE,也不是ACK,同时不是其它REQUEST的情况,则直接释放这个message。

b) 如果是ACK,则肯定是对200的response的一个回应。不需要建立新的

transaction。

c) 如果是CANCEL,则直接转eXosip_process_cancel进行处理。

d) 查看该message是否属于某一个dialog,因为匹配dialog会比匹配transaction

的条件简答,多个transaction可以属于同一个dialog。如果匹配到某一个dialog,则检查该新的message的cseq_number和dialog中保存的cseq_number的大小,如果没有大于dialog中保存的remote cseq number,说明接收到的message是一个错误的request,则释放该message并返回。

中国IMS网络SIP协议规范总体技术要求 - 27 -

Q/CT XXXX.1-2008

e) 如果是INVITE并且没有定义最小化该协议栈操作的情况下,则先发送一个

100的临时应答。

f) 如果这个message匹配到某一个dialog

i.

并且不是ACK和BYE,则检查这个dialog是否已经结束,既该dialog已经发送或接收到过BYE请求,则根据sip协议标准发送一个481的错误提示应答。

如果不是ACK,因为已经通过协议的合法性检查,同时匹配到一个dialog,所以需要根据该message更新dialog的remote cseq。 如果message是INVITE

1. 检查这个dialog中最近的一个接收到的INVITE是否已经到结束状

态,如果没有,则根据sip协议标准将这个new INVITE删除,并发送一个500的提示错误应答。

2. 接着检查这个dialog中最近的一个发送出去的INVITE是否已经到结

束状态,如果没有,则根据sip协议标准将这个new INVITE删除,并发送一个491的提示错误应答。

3. 否则该INVITE是个合法的请求,则更新dialog的route set,因为该

INVITE并不是创建该dialog的第一个请求,所以调用eXosip_process_reinvite处理该INVITE请求。

如果message是BYE请求

1. 先检查该BYE请求的参数合法性,是否包含to tag,因为本端发送的

response里面肯定包含有to tag,所以对端发送的BYE应该是一个包含to tag的合法的message。

2. 检查dialog中是否已经接收到BYE,如果已经接收到BYE,说明对

方重发了BYE请求,直接回复500错误提示应答 3. 否则调用eXosip_process_bye处理BYE请求。 v. 如果是ACK,直接调用eXosip_process_ack处理该ACK请求 vi. 如果是其它请求,则调用eXosip_process_message_within_dialog处理该请

求。

g) 否则,没有匹到某一个dialog,说明是全新的一个请求 i. 如果是ACK,说明该200的ACK没有匹配到任何dialog,所以是一个错

误的ACK,直接释放message即可,因为是ACK,所以并没有建立transaction,不需要对transaction进行操作。 ii. 如果是INFO,直接回复481应答。 iv.

ii.

iii.

中国IMS网络SIP协议规范总体技术要求 - 28 -

Q/CT XXXX.1-2008

iii.

iv. v.

如果是INVITE,调用eXosip_process_new_invite处理这个新请求,如果该请求合法,则会生成一个新的call,并且在call上生成一个dialog,该dialog是服务端的dialog,因为本端是UAS。

如果是BYE请求,则和ACK一样,该BYE请求没有匹配到dialog,回复一个481的错误提示应答通知对端需要结束的dialog不存在。

如果是其它类型请求,则因为是不符合sip标准的请求方式,所以将创建的transaction添加到待删除的队列中即可。

4.2.2.2 eXosip_process_response_out_of_transaction的处理流程:

a) 因为message为应答,而且没有匹配到transaction,所以肯定是一个错误的应

答。先检查message本身的合法性,如果不合法,直接释放并返回

b) 查询所以的call的dialog,查看该response是否匹配到dialog或者是还没有建

立dialog的call

c) 如果没有匹配到某一个call,说明该response与call无关,直接释放。

d) 如果#ifndef MINISIZE,且匹配到某一个dialog,说明重复接收了200应答,

可能原因是对方还没有接收到本端发送的ACK,但是本端的transaction在接收到200应答时已经被kill了,所以没有匹配到transaction,但是匹配到了dialog。如果接收到200应答的cseq和本端发送的cseq的number相等,则重新发送ACK应答。处理完上述情况后,释放该message并返回。

e) 如果只是匹配到了call,说明dialog还没有建立,但是给200应答是一个错误

的应答,否则会匹配到call的c_out_tr transaction。则为该200应答临时建立一个dialog并发送ACK回应,然后发送一个BYE请求结束该call,因为该call已经发送错误了。

4.2.3 eXosip_automatic_action处理流程

该函数用于处理哪些认证失败的call、register、notify、publish等,在接收到认证服务器回应为401或407或需要转发的情况下,进行重新尝试。

a) 遍历所有的call: i. 如果c_id < 1则不用处理,call的id小于1的都是被删除的但是还没有被

清理出j_calls链表的call。 ii. 如果该call的dialog还没有建立起来,说明是本端发送第一个INVITE请

求建立的新call,如果是对端发送的第一个INVITE,则本端要回应一个response,在回应response的时候,dialog就被建立起来了。

1. 检查建立该call的第一个INVITE请求建立起来的transaction的状态,

如果已经终结,并且该call还没有到结束超时时间120秒,且接收到的回复的状态码为401或407,则重发送请求,并且从回复中提取认

中国IMS网络SIP协议规范总体技术要求 - 29 -

Q/CT XXXX.1-2008

证信息。重发次数最多为3次,如果3次都失败,则等待直到该call超时结束。

2. 同上,如果回复应答的status为[300, 399],则重新发送请求,并且转

换发送目的地,重复发送次数也限制为3次。这两种情况全部调用_eXosip_call_retry_request进行处理。

iii. 遍历call中所有的dialog,对于已经dialog信息存在的dialog进行处理,

处理方式同上,也是检查两类情况,一为应答status为401或407的认证失败错误提示,一为[300, 399]server端地址需要更改的转发提示。

b) 遍历所有的register,只处理r_id >=1 且有transaction的register,r_id < 1或者

没有last transaction的register是已经被删除的register,不需要处理。 i. 如果重发时间不为0,既该register需要一直重新发送注册,且注册时间

已经超时,该register从注册完到现在已经超过900秒,则调用函数eXosip_register_send_register进行重注册。 ii. 如果注册时间到现在为止 大于规定的重注册时间间隔-60秒,也发起重

注册,既如果设置了重注册时间间隔,必需在重注册时间间隔到达之前的60秒就开始发起重注册。

iii. 或者如果需要重注册,而且离上次注册时间已经超过120秒,并且没有接

收到注册服务器的应答或者应答不是成功注册的应答,则也发起重注册。

iv. 如果还未设置需要重注册,即第一次注册失败,且是因为认证失败而引起

的注册失败,则检查注册类型。如果是WPDIF注册方式,则检查回复中的认证码nonce是否和上一次注册失败时保存的nonce值相同,如果相同则发起重注册;如果注册方式不是WPDIF,则直接发起重注册。为了保证WPDIF注册方式的成功,在第一次注册失败时,需要提取当次服务器端的回复中的nonce值,以便在确定是否发起重注册的时候判断条件为真。

c) Notify、subscription、pub的处理同call。

4.3

Call的处理

在exosip lib库中除了一直在运行的处理对端发送过来的message的线程外,还提供了本端做为发送端发送各种request、ACK。

因为所有的message最终都属于某个transaction,而且对message的处理最终都放在transaction的event队列中进行处理,所以所有提供的包括call、notify、publish、register、subscription、refer等功能都是通过生成一个transaction上的event事件与一直运行的处理线程进行联系,当生成event之后,处理线程在轮询所有transaction时会处理到这些event,当某个event需要立即处理的时候,则可以手工启动event的处理线程,而不需要等到该处理线程处理到该transaction。

Exosip lib库提供了call的4类接口:第一次建立一个call的initial invite创建及发送接口;在dialog中创建及发送的其它request;在dialog中创建及发送对从对端发送过来的request的response;在invite请求中回应对端response的ACK的创建和发送。 4.3.1

创建Call的第一个INVITE

在excall_api.c文件中的eXosip_call_build_initial_invite和eXosip_call_send_initial_invite提供了本端发起一个新的call时的接口。

中国IMS网络SIP协议规范总体技术要求 - 30 -


osip源代码框架详解(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:意键险核保人员上岗资格考试(带答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: