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

📄 nta.c

📁 this is simple sip stack.
💻 C
📖 第 1 页 / 共 5 页
字号:
    if (agent_timer_init(agent) < 0) {      SU_DEBUG_0(("nta_agent_create: failure with %s\n", "timer"));      goto deinit;    }    SU_DEBUG_9(("nta_agent_create: initialized %s\n", "timer"));    if (agent_launch_terminator(agent) == 0)      SU_DEBUG_9(("nta_agent_create: initialized %s\n", "threads"));#if HAVE_SOFIA_SRESOLV    agent->sa_resolver = sres_resolver_create(root, NULL, ta_tags(ta));    if (!agent->sa_resolver) {      SU_DEBUG_0(("nta_agent_create: failure with %s\n", "resolver"));    }    SU_DEBUG_9(("nta_agent_create: initialized %s\n", "resolver"));#endif    ta_end(ta);    return agent;  deinit:    nta_agent_destroy(agent);  }  ta_end(ta);  return NULL;}/** * Destroy an NTA agent object. * * @param agent the NTA agent object to be destroyed. * */void nta_agent_destroy(nta_agent_t *agent){  if (agent) {    size_t i;    outgoing_htable_t *oht = agent->sa_outgoing;    incoming_htable_t *iht = agent->sa_incoming;    /* Currently, this is pretty pointless, as legs don't keep any resources */    leg_htable_t *lht;    nta_leg_t *leg;    for (i = 0, lht = agent->sa_dialogs; i < lht->lht_size; i++) {      if ((leg = lht->lht_table[i])) {	SU_DEBUG_3(("nta_agent_destroy: destroying dialog with <"		    URL_PRINT_FORMAT ">\n",		    URL_PRINT_ARGS(leg->leg_remote->a_url)));	leg_free(agent, leg);      }    }    for (i = 0, lht = agent->sa_defaults; i < lht->lht_size; i++) {      if ((leg = lht->lht_table[i])) {	SU_DEBUG_3(("%s: destroying leg for <" 		    URL_PRINT_FORMAT ">\n",		    __func__, URL_PRINT_ARGS(leg->leg_url)));	leg_free(agent, leg);      }    }    if (agent->sa_default_leg)      leg_free(agent, agent->sa_default_leg);    for (i = iht->iht_size; i-- > 0; )      while (iht->iht_table[i]) {	nta_incoming_t *irq = iht->iht_table[i];	if (!irq->irq_destroyed)	  SU_DEBUG_3(("%s: destroying %s server transaction from <"		      URL_PRINT_FORMAT ">\n",		      __func__, irq->irq_rq->rq_method_name,		      URL_PRINT_ARGS(irq->irq_from->a_url)));	incoming_free(irq);      }    for (i = oht->oht_size; i-- > 0;)      while (oht->oht_table[i]) {	nta_outgoing_t *orq = oht->oht_table[i];	if (!orq->orq_destroyed)	  SU_DEBUG_3(("%s: destroying %s client transaction to <"		      URL_PRINT_FORMAT ">\n",		      __func__, orq->orq_method_name,		      URL_PRINT_ARGS(orq->orq_to->a_url)));	outgoing_free(orq);      }    su_timer_destroy(agent->sa_timer), agent->sa_timer = NULL;#   if HAVE_SOFIA_SRESOLV    sres_resolver_destroy(agent->sa_resolver), agent->sa_resolver = NULL;#   endif    tport_destroy(agent->sa_tports), agent->sa_tports = NULL;    agent_kill_terminator(agent);    su_home_unref(agent->sa_home);  }}/** Return agent context. */nta_agent_magic_t *nta_agent_magic(nta_agent_t const *agent){  return agent ? agent->sa_magic : NULL;}/** Return @b Contact header. * * The function nta_agent_contact() returns a @b Contact header, which can be * used to reach @a agent. * * @param agent NTA agent object * * @return The function nta_agent_contact() returns a sip_contact_t object * corresponding to the @a agent. * * User agents can insert the @b Contact header in the outgoing REGISTER, * INVITE, and ACK requests and replies to incoming INVITE and OPTIONS * transactions. * * Proxies can use the @b Contact header to create appropriate @b Record-Route * headers: * @code * r_r = sip_record_route_create(msg_home(msg), *	 			 sip->sip_request->rq_url, *				 contact->m_url); * @endcode */sip_contact_t *nta_agent_contact(nta_agent_t const *agent){  return agent ? agent->sa_contact : NULL;}/** Return a list of @b Via headers. * * The function nta_agent_via() returns @b Via headers for all activated * transport. * * @param agent NTA agent object * * @return The function nta_agent_via() returns a list of sip_via_t objects * used by the @a agent. */sip_via_t *nta_agent_via(nta_agent_t const *agent){  return agent ? agent->sa_vias : NULL;}/** Return a list of public (UPnP, STUN) @b Via headers. * * The function nta_agent_public_via() returns public @b Via headers for all activated * transports. * * @param agent NTA agent object * * @return The function nta_agent_public_via() returns a list of sip_via_t objects * used by the @a agent. */sip_via_t *nta_agent_public_via(nta_agent_t const *agent){  return agent ? agent->sa_public_vias : NULL;}/** Return @b User-Agent header. * * The function nta_agent_name() returns a @b User-Agent information with * NTA version. * * @param agent NTA agent object * * @return The function nta_agent_contact() returns a string containing the * @a agent version. */char const *nta_agent_version(nta_agent_t const *agent){  return "nta" "/" VERSION;}/** Initialize default tag */static int agent_tag_init(nta_agent_t *self){  sip_contact_t *m = self->sa_contact;  uint32_t hash = 1;  if (m) {    if (m->m_url->url_user)      hash = 914715421U * hash + msg_hash_string(m->m_url->url_user);    if (m->m_url->url_host)      hash = 914715421U * hash + msg_hash_string(m->m_url->url_host);    if (m->m_url->url_port)      hash = 914715421U * hash + msg_hash_string(m->m_url->url_port);    if (m->m_url->url_params)      hash = 914715421U * hash + msg_hash_string(m->m_url->url_params);  }  if (hash == 0)    hash = 914715421U;  self->sa_branch = NTA_BRANCH_PRIME * su_ntp_now();  self->sa_branch *= hash;  self->sa_tags = NTA_TAG_PRIME * self->sa_branch;  return 0;}/** Initialize agent timer. */staticint agent_timer_init(nta_agent_t *agent){  return su_timer_set(agent->sa_timer =		      su_timer_create(su_root_task(agent->sa_root),				      NTA_SIP_T1 / 8),		      agent_timer,		      agent);}/** * Agent timer routine. */staticvoid agent_timer(su_root_magic_t *rm, su_timer_t *timer, nta_agent_t *agent){  su_duration_t now = su_time_ms(agent->sa_now = su_now());  int again;  now += now == 0;  agent->sa_millisec = now;  again = outgoing_timer(agent, now);  again = incoming_timer(agent, now) || again;  agent->sa_millisec = 0;  if (again)    su_timer_set_at(timer, agent_timer, agent, su_time_add(su_now(), 1));  else    su_timer_set(timer, agent_timer, agent);}/** Calculate nonzero value for timer */static inlinesu_duration_t set_timeout(nta_agent_t const *agent, su_duration_t offset){  su_duration_t now;#if 0  if (agent->sa_millisec)    now = agent->sa_millisec;  else#endif    now = (su_duration_t)su_time_ms(su_now());  now += offset;  return now ? now : 1;}/** Return current timeval. */staticsu_time_t agent_now(nta_agent_t const *agent){  return agent->sa_millisec ? agent->sa_now : 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 @b Via headers are generated. * * @note  * Setting the parameters NTATAG_MAXSIZE(), NTATAG_UDP_MTU(), * 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_CANCEL_2543(), NTATAG_CANCEL_487(), NTATAG_DEBUG_DROP_PROB(), * NTATAG_DEFAULT_PROXY(), NTATAG_EXTRA_100(), NTATAG_MAXSIZE(), * NTATAG_UDP_MTU(), NTATAG_MERGE_482(), NTATAG_PASS_100(), * NTATAG_PRELOAD(), NTATAG_REL100(), NTATAG_RPORT(), NTATAG_SERVER_RPORT(), * NTATAG_TCP_RPORT(), * NTATAG_SIPFLAGS(), NTATAG_SIP_T1X64(), NTATAG_SIP_T1(), NTATAG_SIP_T2(), * NTATAG_SIP_T4(), NTATAG_SMIME(), NTATAG_STATELESS(), NTATAG_TAG_3261(), * NTATAG_TIMEOUT_408(), NTATAG_PASS_408(), NTATAG_UA(), NTATAG_USER_VIA(), * and NTATAG_USE_TIMESTAMP(). */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, m;  unsigned bad_req_mask = agent->sa_bad_req_mask;  unsigned bad_resp_mask = agent->sa_bad_resp_mask;  unsigned maxsize    = agent->sa_maxsize;  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 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;  int 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 *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_MCLASS_REF(mclass),	      NTATAG_BAD_REQ_MASK_REF(bad_req_mask),	      NTATAG_BAD_RESP_MASK_REF(bad_resp_mask),	      NTATAG_ALIASES_REF(aliases),	      NTATAG_UA_REF(ua),	      NTATAG_STATELESS_REF(stateless),	      NTATAG_MAXSIZE_REF(maxsize),	      NTATAG_UDP_MTU_REF(udp_mtu),	      NTATAG_SIP_T1_REF(sip_t1),	      NTATAG_SIP_T2_REF(sip_t2),	      NTATAG_SIP_T4_REF(sip_t4),	      NTATAG_SIP_T1X64_REF(sip_t1x64),	      NTATAG_PROGRESS_REF(progress),	      NTATAG_BLACKLIST_REF(blacklist),	      NTATAG_DEBUG_DROP_PROB_REF(drop_prob),	      NTATAG_USER_VIA_REF(user_via),	      NTATAG_EXTRA_100_REF(extra_100),	      NTATAG_PASS_100_REF(pass_100),	      NTATAG_TIMEOUT_408_REF(timeout_408),	      NTATAG_PASS_408_REF(pass_408),	      NTATAG_MERGE_482_REF(merge_482),	      NTATAG_DEFAULT_PROXY_REF(proxy),	      NTATAG_CANCEL_2543_REF(cancel_2543),	      NTATAG_CANCEL_487_REF(cancel_487),	      NTATAG_REL100_REF(invite_100rel),	      NTATAG_USE_TIMESTAMP_REF(use_timestamp),	      NTATAG_USE_NAPTR_REF(use_naptr),	      NTATAG_USE_SRV_REF(use_srv),#if HAVE_SOFIA_SMIME	      NTATAG_SMIME_REF(smime),#endif	      NTATAG_SIPFLAGS_REF(flags),	      NTATAG_RPORT_REF(rport),	      NTATAG_SERVER_RPORT_REF(server_rport),	      NTATAG_TCP_RPORT_REF(tcp_rport),	      NTATAG_PRELOAD_REF(preload),#ifdef TPTAG_THRPSIZE	      /* If threadpool is enabled, start a separate "reaper thread" */	      TPTAG_THRPSIZE_REF(threadpool),#endif	      NTATAG_SIGCOMP_OPTIONS_REF(sigcomp),	      NTATAG_SIGCOMP_ALGORITHM_REF(algorithm),	      TAG_END());  if (mclass != NONE)    agent->sa_mclass = mclass ? mclass : sip_default_mclass();  m = 0;  for (tport = agent->sa_tports; tport; tport = tport_next(tport)) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -