接收消息处理流程
tport_wakeup_pri在profile clone线程中被触发。
1、接收消息
2、解析消息成结构体msg
3、找到leg去处理请求
4、创建irq
5、执行leg的回调函数,转到nua_handle层去处理。
6、找到method。
7、执行三部曲:init-->preprocess-->report
tport_wakeup_pri
=>tport_recv_event
=>tport_recv_data(self);
=>tport_parse(self, self->tp_pre_framed ? 1 : !again, self->tp_rtime);
=>n = msg_extract(msg);
=>tport_deliver(self, msg, next, self->tp_comp, now);
=>tport_base_deliver
=>(tp)->tp_master->mr_tpac->tpac_recv((tp)->tp_master->mr_stack, (tp), (msg), (tp)->tp_magic, (now))
=>agent_recv_message(nta_agent_t *agent, tport_t *tport, msg_t *msg, sip_via_t *tport_via, su_time_t now)
=>agent_recv_request(agent, msg, sip, tport);
=>agent_check_request_via(agent, msg, sip, sip->sip_via, tport);
=>irq = incoming_find(agent, sip, sip->sip_via,..);
=>leg = agent->sa_default_leg
=>leg_recv(leg, msg, sip, tport);
=>irq = incoming_create(agent, msg, sip, tport, tag)
=>status = incoming_callback(leg, irq, sip);
=>leg->leg_callback(leg->leg_magic, leg, irq, sip);
=>nua_stack_process_request(nua_handle_t *nh, nta_leg_t *leg, nta_incoming_t *irq, sip_t const *sip);
=>sm = nua_server_methods[method];
=>sm->sm_init(sr)
=>sm->sm_preprocess(sr)
=>nua_server_report(sr)
流程图
以注册消息为例: