]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[sofia-sip] Add urn: scheme support to sofia. (#445)
authorCAUCA 9-1-1 <60942644+cauca-signalwire@users.noreply.github.com>
Tue, 12 May 2020 18:58:33 +0000 (14:58 -0400)
committerGitHub <noreply@github.com>
Tue, 12 May 2020 18:58:33 +0000 (22:58 +0400)
As an effort to support NENA i3 specs for NG 9-1-1, this adds support
for INVITE URI appearing as urn:service:sos to request for emergency services.

Reference for URN support in RFC 6061 https://tools.ietf.org/html/rfc6061

libs/sofia-sip/.update
libs/sofia-sip/libsofia-sip-ua/nea/nea.c
libs/sofia-sip/libsofia-sip-ua/nta/nta.c
libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c
libs/sofia-sip/libsofia-sip-ua/nua/nua_register.c
libs/sofia-sip/libsofia-sip-ua/nua/nua_server.c
libs/sofia-sip/libsofia-sip-ua/sresolv/sres_sip.c
libs/sofia-sip/libsofia-sip-ua/url/sofia-sip/url.h
libs/sofia-sip/libsofia-sip-ua/url/torture_url.c
libs/sofia-sip/libsofia-sip-ua/url/url.c

index e6af7a2165222a4ce118bb2be308a08787067d25..f2ecef0016c3781777eacb4dca40d1a95a4b6239 100644 (file)
@@ -1 +1 @@
-Sat May 09 16:04:04 UTC 2020
+Tue May 12 18:04:14 UTC 2020
index 1f58a18e10f7f17f761132d1322cf48d26d08d50..29afcd71c405ad196f07f0a34fa60273e31c6cf5 100644 (file)
@@ -389,6 +389,7 @@ int response_to_subscribe(nea_t *nea,
 
       for (m = sip->sip_contact; m; m = m->m_next) {
        if (m->m_url->url_type == url_sip ||
+           m->m_url->url_type == url_urn ||
            m->m_url->url_type == url_sips)
          break;
       }
index 07bab4f6eb1e7f6d17a330ec0bbe647ab665cf94..d4ed20ed78eb9ea204f3291a7f9f4d57fcae9d26 100644 (file)
@@ -1581,7 +1581,7 @@ int agent_set_params(nta_agent_t *agent, tagi_t *tags)
 
     url_sanitize(dp);
 
-    if (dp == NULL || dp->url_type == url_sip || dp->url_type == url_sips) {
+    if (dp == NULL || dp->url_type == url_sip || dp->url_type == url_sips || dp->url_type == url_urn) {
       if (agent->sa_default_proxy)
        su_free(home, agent->sa_default_proxy);
       agent->sa_default_proxy = dp;
@@ -2160,7 +2160,7 @@ int nta_agent_add_tport(nta_agent_t *self,
   }
 
   if (!(url = url_hdup(self->sa_home, uri->us_url)) ||
-      (url->url_type != url_sip && url->url_type != url_sips)) {
+      (url->url_type != url_sip && url->url_type != url_sips && url->url_type != url_urn)) {
     if (url_string_p(uri))
       SU_DEBUG_1(("nta: %s: invalid bind URL\n", uri->us_str));
     else
@@ -2173,7 +2173,7 @@ int nta_agent_add_tport(nta_agent_t *self,
   tpn->tpn_host = url->url_host;
   tpn->tpn_port = url_port(url);
 
-  if (url->url_type == url_sip) {
+  if (url->url_type == url_sip || url->url_type == url_urn) {
     tpn->tpn_proto = "*";
     tports = tports_sip;
     if (!tpn->tpn_port || !tpn->tpn_port[0])
@@ -2660,6 +2660,7 @@ nta_tpn_by_url(su_home_t *home,
   }
 
   if (url->url_type != url_sip &&
+      url->url_type != url_urn &&
       url->url_type != url_sips &&
       url->url_type != url_im &&
       url->url_type != url_pres) {
index 969fff6e93c943bf789a9d1dc8892fb7660c7346..a3e692dea7c16826f3bedfaa315b4add9f6be0c9 100644 (file)
@@ -1280,6 +1280,7 @@ int can_redirect(sip_contact_t const *m, sip_method_t method)
     enum url_type_e type = (enum url_type_e)m->m_url->url_type;
     return
       type == url_sip ||
+      type == url_urn ||
       type == url_sips ||
       (type == url_tel &&
        (method == sip_method_invite || method == sip_method_message)) ||
index df375b54b7e5501c9f9c8a3b9b6253e0dc194aa2..5c2fa1a33b1af9bff4628a93eaed086b7e87a6ca 100644 (file)
@@ -887,6 +887,7 @@ static int nua_register_client_response(nua_client_request_t *cr,
 
     for (m = sip->sip_contact; m; m = m->m_next) {
       if (m->m_url->url_type != url_sip &&
+         m->m_url->url_type != url_urn &&
          m->m_url->url_type != url_sips)
        continue;
 
index cf8e23577deaa2765b2f0632adbe6ff890765239..0acfba5a878d2323d910bb5611ac1ed0ab15bde7 100644 (file)
@@ -122,6 +122,7 @@ int nua_stack_process_request(nua_handle_t *nh,
 
   switch (sip->sip_request->rq_url->url_type) {
   case url_sip:
+  case url_urn:
   case url_sips:
   case url_im:
   case url_pres:
index 9dd0e3f347263256161ef2e5d0eddb490178a66b..296cad5fb67b688ffd5f61a62ac18822070c380e 100644 (file)
@@ -278,7 +278,7 @@ sres_sip_new(sres_resolver_t *sres,
   srs->srs_url = u = url_hdup(srs->srs_home, (url_t *)uri);
   if (u == NULL)
     return sres_sip_fatal(srs, SRES_SIP_ERR_BAD_URI);
-  if (u->url_type != url_sip && u->url_type != url_sips)
+  if (u->url_type != url_sip && u->url_type != url_urn && u->url_type != url_sips)
     return sres_sip_fatal(srs, SRES_SIP_ERR_BAD_URI);
 
   /* RFC 3263:
index caeb2133b0a5c336f5dcb4f61b75c4690ef329ba..4ea520825acafb0d9ad418a22124cab18bc7edd8 100644 (file)
@@ -44,6 +44,7 @@ enum url_type_e {
   url_any = 0,         /**< "*" */
   url_sip,             /**< "sip:". @sa @RFC3261 */
   url_sips,            /**< "sips:". @sa @RFC3261 */
+  url_urn,             /**< "urn:". @sa @RFC6061 */
   url_tel,             /**< "tel:" @sa RFC3966 */
   url_fax,             /**< "fax:". @note Obsolete. @sa @RFC2806 */
   url_modem,           /**< "modem:". @note Obsolete. @sa @RFC2806  */
index 4af13fb4f0db80b0810a06b7b429b2966e15f392..f74b7f535578e71f5e65f1c9cd082531a28934d4 100644 (file)
@@ -257,6 +257,7 @@ int test_sip(void)
   BEGIN();
 
   TEST_S(url_scheme(url_sip), "sip");
+  TEST_S(url_scheme(url_urn), "urn");
   TEST_S(url_scheme(url_sips), "sips");
 
   memset(url, 255, sizeof url);
index 71544735e11d1ffcfd33bb43a1a28b66930ef0bf..81de531ddc895f4ade72e3d14a603aabe622c91b 100644 (file)
@@ -477,6 +477,7 @@ char const* url_scheme(enum url_type_e url_type)
   case url_cid:    return "cid";
   case url_msrp:   return "msrp";
   case url_msrps:  return "msrps";
+  case url_urn:    return "urn";
   case url_wv:     return "wv";
   default:
     assert(url_type == url_unknown);
@@ -535,6 +536,8 @@ enum url_type_e url_get_type(char const *scheme, size_t len)
     test_scheme(sip); test_scheme(sips); break;
   case 't': case 'T':
     test_scheme(tel); break;
+  case 'u': case 'U':
+    test_scheme(urn); break;
   case 'w': case 'W':
     test_scheme(wv); break;
 
@@ -1796,6 +1799,7 @@ char const *url_port_default(enum url_type_e url_type)
     return "9999";             /* XXXX */
 
   case url_tel:
+  case url_urn:
   case url_fax:
   case url_modem:
   case url_im:
@@ -1841,6 +1845,7 @@ char const *url_tport_default(enum url_type_e url_type)
   case url_im:
   case url_pres:
   case url_cid:
+  case url_urn:
   case url_wv:
 
   default:                     /* Unknown scheme */