⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nta.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 5 页
字号:
}/** 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 + -