📄 nta.c
字号:
}/** Return current timeval. */staticsu_time_t agent_now(nta_agent_t const *agent){ if (agent && agent->sa_millisec != 0) return agent->sa_now; else return su_now();}/** Launch transaction terminator task */staticint agent_launch_terminator(nta_agent_t *agent){#ifdef TPTAG_THRPSIZE if (agent->sa_tport_threadpool) { su_home_threadsafe(agent->sa_home); return su_clone_start(agent->sa_root, agent->sa_terminator, NULL, NULL, NULL); }#endif return -1;}/** Kill transaction terminator task */staticvoid agent_kill_terminator(nta_agent_t *agent){ su_clone_wait(agent->sa_root, agent->sa_terminator);}/**Set NTA Parameters. * * The nta_agent_set_params() function sets the stack parameters. The * parameters determine the way NTA handles the retransmissions, how long * NTA keeps transactions alive, does NTA apply proxy or user-agent logic to * INVITE transactions, or how the @Via headers are generated. * * @note * Setting the parameters NTATAG_MAXSIZE(), NTATAG_UDP_MTU(), NTATAG_MAX_PROCEEDING(), * NTATAG_SIP_T1X64(), NTATAG_SIP_T1(), NTATAG_SIP_T2(), NTATAG_SIP_T4() to * 0 selects the default value. * * @TAGS * NTATAG_ALIASES(), * NTATAG_BAD_REQ_MASK(), NTATAG_BAD_RESP_MASK(), NTATAG_BLACKLIST(), * NTATAG_CANCEL_2543(), NTATAG_CANCEL_487(), NTATAG_CLIENT_RPORT(), * NTATAG_DEBUG_DROP_PROB(), NTATAG_DEFAULT_PROXY(), * NTATAG_EXTRA_100(), NTATAG_GRAYLIST(), * NTATAG_MAXSIZE(), NTATAG_MAX_FORWARDS(), NTATAG_MERGE_482(), NTATAG_MCLASS() * NTATAG_PASS_100(), NTATAG_PASS_408(), NTATAG_PRELOAD(), NTATAG_PROGRESS(), * NTATAG_REL100(), * NTATAG_SERVER_RPORT(), * NTATAG_SIPFLAGS(), * NTATAG_SIP_T1X64(), NTATAG_SIP_T1(), NTATAG_SIP_T2(), NTATAG_SIP_T4(), * NTATAG_STATELESS(), * NTATAG_TAG_3261(), NTATAG_TCP_RPORT(), NTATAG_TIMEOUT_408(), * NTATAG_TIMER_C(), NTATAG_MAX_PROCEEDING(), * NTATAG_UA(), NTATAG_UDP_MTU(), NTATAG_USER_VIA(), * NTATAG_USE_NAPTR(), NTATAG_USE_SRV() and NTATAG_USE_TIMESTAMP(). * * @note The value from following tags are stored, but they currently do nothing: * NTATAG_SIGCOMP_ALGORITHM(), NTATAG_SIGCOMP_OPTIONS(), NTATAG_SMIME() */int nta_agent_set_params(nta_agent_t *agent, tag_type_t tag, tag_value_t value, ...){ int retval; if (agent) { ta_list ta; ta_start(ta, tag, value); retval = agent_set_params(agent, ta_args(ta)); ta_end(ta); } else { su_seterrno(EINVAL); retval = -1; } return retval;}/** Internal function for setting tags */staticint agent_set_params(nta_agent_t *agent, tagi_t *tags){ int n, nC, m; unsigned bad_req_mask = agent->sa_bad_req_mask; unsigned bad_resp_mask = agent->sa_bad_resp_mask; usize_t maxsize = agent->sa_maxsize; usize_t max_proceeding = agent->sa_max_proceeding; unsigned max_forwards = agent->sa_max_forwards->mf_count; unsigned udp_mtu = agent->sa_udp_mtu; unsigned sip_t1 = agent->sa_t1; unsigned sip_t2 = agent->sa_t2; unsigned sip_t4 = agent->sa_t4; unsigned sip_t1x64 = agent->sa_t1x64; unsigned timer_c = agent->sa_timer_c; unsigned graylist = agent->sa_graylist; unsigned blacklist = agent->sa_blacklist; int ua = agent->sa_is_a_uas; unsigned progress = agent->sa_progress; int stateless = agent->sa_is_stateless; unsigned drop_prob = agent->sa_drop_prob; int user_via = agent->sa_user_via; int extra_100 = agent->sa_extra_100; int pass_100 = agent->sa_pass_100; int timeout_408 = agent->sa_timeout_408; int pass_408 = agent->sa_pass_408; int merge_482 = agent->sa_merge_482; int cancel_2543 = agent->sa_cancel_2543; int cancel_487 = agent->sa_cancel_487; int invite_100rel = agent->sa_invite_100rel; int use_timestamp = agent->sa_timestamp; int use_naptr = agent->sa_use_naptr; int use_srv = agent->sa_use_srv; void *smime = agent->sa_smime; uint32_t flags = agent->sa_flags; int rport = agent->sa_rport; unsigned server_rport = agent->sa_server_rport; int tcp_rport = agent->sa_tcp_rport; unsigned preload = agent->sa_preload; unsigned threadpool = agent->sa_tport_threadpool; char const *sigcomp = agent->sa_sigcomp_options; char const *algorithm = NONE; msg_mclass_t const *mclass = NONE; sip_contact_t const *aliases = NONE; url_string_t const *proxy = NONE; tport_t *tport; su_home_t *home = agent->sa_home; n = tl_gets(tags, NTATAG_ALIASES_REF(aliases), NTATAG_BAD_REQ_MASK_REF(bad_req_mask), NTATAG_BAD_RESP_MASK_REF(bad_resp_mask), NTATAG_BLACKLIST_REF(blacklist), NTATAG_CANCEL_2543_REF(cancel_2543), NTATAG_CANCEL_487_REF(cancel_487), NTATAG_DEBUG_DROP_PROB_REF(drop_prob), NTATAG_DEFAULT_PROXY_REF(proxy), NTATAG_EXTRA_100_REF(extra_100), NTATAG_GRAYLIST_REF(graylist), NTATAG_MAXSIZE_REF(maxsize), NTATAG_MAX_PROCEEDING_REF(max_proceeding), NTATAG_MAX_FORWARDS_REF(max_forwards), NTATAG_MCLASS_REF(mclass), NTATAG_MERGE_482_REF(merge_482), NTATAG_PASS_100_REF(pass_100), NTATAG_PASS_408_REF(pass_408), NTATAG_PRELOAD_REF(preload), NTATAG_PROGRESS_REF(progress), NTATAG_REL100_REF(invite_100rel), NTATAG_RPORT_REF(rport), NTATAG_SERVER_RPORT_REF(server_rport), NTATAG_SIGCOMP_ALGORITHM_REF(algorithm), NTATAG_SIGCOMP_OPTIONS_REF(sigcomp), NTATAG_SIPFLAGS_REF(flags), NTATAG_SIP_T1X64_REF(sip_t1x64), NTATAG_SIP_T1_REF(sip_t1), NTATAG_SIP_T2_REF(sip_t2), NTATAG_SIP_T4_REF(sip_t4),#if HAVE_SOFIA_SMIME NTATAG_SMIME_REF(smime),#endif NTATAG_STATELESS_REF(stateless), NTATAG_TCP_RPORT_REF(tcp_rport), NTATAG_TIMEOUT_408_REF(timeout_408), NTATAG_UA_REF(ua), NTATAG_UDP_MTU_REF(udp_mtu), NTATAG_USER_VIA_REF(user_via), NTATAG_USE_NAPTR_REF(use_naptr), NTATAG_USE_SRV_REF(use_srv), NTATAG_USE_TIMESTAMP_REF(use_timestamp),#ifdef TPTAG_THRPSIZE /* If threadpool is enabled, start a separate "reaper thread" */ TPTAG_THRPSIZE_REF(threadpool),#endif TAG_END()); nC = tl_gets(tags, NTATAG_TIMER_C_REF(timer_c), TAG_END()); n += nC; if (mclass != NONE) agent->sa_mclass = mclass ? mclass : sip_default_mclass(); m = 0; for (tport = agent->sa_tports; tport; tport = tport_next(tport)) { m = tport_set_params(tport, TAG_NEXT(tags)); } if (m == -1) return m; n += m; if (aliases != NONE) { sip_contact_t const *m, *m_next; m = agent->sa_aliases; agent->sa_aliases = sip_contact_dup(home, aliases); for (; m; m = m_next) { /* Free old aliases */ m_next = m->m_next; su_free(home, (void *)m); } } if (proxy != NONE) { url_t *dp = url_hdup(home, proxy->us_url); url_sanitize(dp); if (dp == NULL || dp->url_type == url_sip || dp->url_type == url_sips) { if (agent->sa_default_proxy) su_free(home, agent->sa_default_proxy); agent->sa_default_proxy = dp; } else n = -1; } if (algorithm != NONE) agent->sa_algorithm = su_strdup(home, algorithm); if (str0cmp(sigcomp, agent->sa_sigcomp_options)) { msg_param_t const *l = NULL; char *s = su_strdup(home, sigcomp); char *s1 = su_strdup(home, s), *s2 = s1; if (s && s2 && msg_avlist_d(home, &s2, &l) == 0 && *s2 == '\0') { su_free(home, (void *)agent->sa_sigcomp_options); su_free(home, (void *)agent->sa_sigcomp_option_list); agent->sa_sigcomp_options = s; agent->sa_sigcomp_option_free = s1; agent->sa_sigcomp_option_list = l; } else { su_free(home, s); su_free(home, s1); su_free(home, (void *)l); n = -1; } } if (maxsize == 0) maxsize = 2 * 1024 * 1024; if (maxsize > UINT32_MAX) maxsize = UINT32_MAX; agent->sa_maxsize = maxsize; if (max_proceeding == 0) max_proceeding = SIZE_MAX; agent->sa_max_proceeding = max_proceeding; if (max_forwards == 0) max_forwards = 70; /* Default value */ agent->sa_max_forwards->mf_count = max_forwards; if (udp_mtu == 0) udp_mtu = 1300; if (udp_mtu > 65535) udp_mtu = 65535; if (agent->sa_udp_mtu != udp_mtu) { agent->sa_udp_mtu = udp_mtu; agent_set_udp_params(agent, udp_mtu); } if (sip_t1 == 0) sip_t1 = NTA_SIP_T1; if (sip_t1 > NTA_TIME_MAX) sip_t1 = NTA_TIME_MAX; agent->sa_t1 = sip_t1; if (sip_t2 == 0) sip_t2 = NTA_SIP_T2; if (sip_t2 > NTA_TIME_MAX) sip_t2 = NTA_TIME_MAX; agent->sa_t2 = sip_t2; if (sip_t4 == 0) sip_t4 = NTA_SIP_T4; if (sip_t4 > NTA_TIME_MAX) sip_t4 = NTA_TIME_MAX; if (agent->sa_t4 != sip_t4) { incoming_queue_adjust(agent, agent->sa_in.inv_confirmed, sip_t4); outgoing_queue_adjust(agent, agent->sa_out.completed, sip_t4); } agent->sa_t4 = sip_t4; if (sip_t1x64 == 0) sip_t1x64 = NTA_SIP_T1 * 64; if (sip_t1x64 > NTA_TIME_MAX) sip_t1x64 = NTA_TIME_MAX; if (agent->sa_t1x64 != sip_t1x64) { incoming_queue_adjust(agent, agent->sa_in.preliminary, sip_t1x64); incoming_queue_adjust(agent, agent->sa_in.completed, sip_t1x64); incoming_queue_adjust(agent, agent->sa_in.inv_completed, sip_t1x64); outgoing_queue_adjust(agent, agent->sa_out.trying, sip_t1x64); outgoing_queue_adjust(agent, agent->sa_out.inv_calling, sip_t1x64); } agent->sa_t1x64 = sip_t1x64; if (nC == 1) { agent->sa_use_timer_c = 1; if (timer_c == 0) timer_c = 185 * 1000; agent->sa_timer_c = timer_c; outgoing_queue_adjust(agent, agent->sa_out.inv_proceeding, timer_c); } if (graylist > 24 * 60 * 60) graylist = 24 * 60 * 60; agent->sa_graylist = graylist; if (blacklist > 24 * 60 * 60) blacklist = 24 * 60 * 60; agent->sa_blacklist = blacklist; if (progress == 0) progress = 60 * 1000; agent->sa_progress = progress; if (server_rport > 2) server_rport = 1; agent->sa_server_rport = server_rport; agent->sa_bad_req_mask = bad_req_mask; agent->sa_bad_resp_mask = bad_resp_mask; agent->sa_is_a_uas = ua != 0; agent->sa_is_stateless = stateless != 0; agent->sa_drop_prob = drop_prob < 1000 ? drop_prob : 1000; agent->sa_user_via = user_via != 0; agent->sa_extra_100 = extra_100 != 0; agent->sa_pass_100 = pass_100 != 0; agent->sa_timeout_408 = timeout_408 != 0; agent->sa_pass_408 = pass_408 != 0; agent->sa_merge_482 = merge_482 != 0; agent->sa_cancel_2543 = cancel_2543 != 0; agent->sa_cancel_487 = cancel_487 != 0; agent->sa_invite_100rel = invite_100rel != 0; agent->sa_timestamp = use_timestamp != 0; agent->sa_use_naptr = use_naptr != 0; agent->sa_use_srv = use_srv != 0; agent->sa_smime = smime; agent->sa_flags = flags & MSG_FLG_USERMASK; agent->sa_rport = rport != 0; agent->sa_tcp_rport = tcp_rport != 0; agent->sa_preload = preload; agent->sa_tport_threadpool = threadpool; return n;}static void agent_set_udp_params(nta_agent_t *self, usize_t udp_mtu){ tport_t *tp; /* Set via fields for the tports */ for (tp = tport_primaries(self->sa_tports); tp; tp = tport_next(tp)) { if (tport_is_udp(tp)) tport_set_params(tp, TPTAG_TIMEOUT(2 * self->sa_t1x64), TPTAG_MTU(udp_mtu), TAG_END()); }}/**Get NTA Parameters. * * The nta_agent_get_params() function retrieves the stack parameters. The * parameters determine the way NTA handles the retransmissions, how long * NTA keeps transactions alive, does NTA apply proxy or user-agent logic to * INVITE transactions, or how the @Via headers are generated. * * @TAGS * NTATAG_ALIASES_REF(), NTATAG_BLACKLIST_REF(), * NTATAG_CANCEL_2543_REF(), NTATAG_CANCEL_487_REF(), * NTATAG_CLIENT_RPORT_REF(), NTATAG_CONTACT_REF(), * NTATAG_DEBUG_DROP_PROB_REF(), NTATAG_DEFAULT_PROXY_REF(), * NTATAG_EXTRA_100_REF(), NTATAG_GRAYLIST_REF(), * NTATAG_MAXSIZE_REF(), NTATAG_MAX_FORWARDS_REF(), NTATAG_MCLASS_REF(), * NTATAG_MERGE_482_REF(), NTATAG_MAX_PROCEEDING_REF(), * NTATAG_PASS_100_REF(), NTATAG_PASS_408_REF(), NTATAG_PRELOAD_REF(), * NTATAG_PROGRESS_REF(), * NTATAG_REL100_REF(), * NTATAG_SERVER_RPORT_REF(), * NTATAG_SIGCOMP_ALGORITHM_REF(), NTATAG_SIGCOMP_OPTIONS_REF(), * NTATAG_SIPFLAGS_REF(), * NTATAG_SIP_T1_REF(), NTATAG_SIP_T1X64_REF(), NTATAG_SIP_T2_REF(), * NTATAG_SIP_T4_REF(), NTATAG_SMIME_REF(), NTATAG_STATELESS_REF(), * NTATAG_TAG_3261_REF(), NTATAG_TIMEOUT_408_REF(), NTATAG_TIMER_C_REF(), * NTATAG_UA_REF(), NTATAG_UDP_MTU_REF(), NTATAG_USER_VIA_REF(), * NTATAG_USE_NAPTR_REF(), NTATAG_USE_SRV_REF(), * and NTATAG_USE_TIMESTAMP_REF(). * */int nta_agent_get_params(nta_agent_t *agent, tag_type_t tag, tag_value_t value, ...){ int n; ta_list ta; if (agent) { ta_start(ta, tag, value); n = agent_get_params(agent, ta_args(ta)); ta_end(ta); return n; } su_seterrno(EINVAL); return -1;}/** Get NTA parameters */staticint agent_get_params(nta_agent_t *agent, tagi_t *tags){ return tl_tgets(tags, NTATAG_ALIASES(agent->sa_aliases), NTATAG_BLACKLIST(agent->sa_blacklist), NTATAG_CANCEL_2543(agent->sa_cancel_2543), NTATAG_CANCEL_487(agent->sa_cancel_487), NTATAG_CLIENT_RPORT(agent->sa_rport), NTATAG_CONTACT(agent->sa_contact), NTATAG_DEBUG_DROP_PROB(agent->sa_drop_prob), NTATAG_DEFAULT_PROXY(agent->sa_default_proxy), NTATAG_EXTRA_100(agent->sa_extra_100), NTATAG_GRAYLIST(agent->sa_graylist), NTATAG_MAXSIZE(agent->sa_maxsize), NTATAG_MAX_PROCEEDING(agent->sa_max_proceeding), NTATAG_MAX_FORWARDS(agent->sa_max_forwards->mf_count), NTATAG_MCLASS(agent->sa_mclass), NTATAG_MERGE_482(agent->sa_merge_482), NTATAG_PASS_100(agent->sa_pass_100),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -