diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-12-02 15:40:52 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-12-02 15:40:52 +0000 |
commit | 085b6a1482c3241345b79c3f29ad9f4d64f4805f (patch) | |
tree | 9645ab7e0d3ff2b9bf845977f28b3d296f077f24 /pjsip/src/pjsua-lib | |
parent | a379832fa79e4ca211c85783b68eac1f070622f2 (diff) |
More ticket #421: fixed SIP messaging components to support IPv6 format
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1610 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 92 |
1 files changed, 85 insertions, 7 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index 53090c4a..829f5616 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -325,6 +325,8 @@ PJ_DEF(pj_status_t) pjsua_acc_add_local( pjsua_transport_id tid, { pjsua_acc_config cfg; pjsua_transport_data *t = &pjsua_var.tpdata[tid]; + const char *beginquote, *endquote; + char transport_param[32]; char uri[PJSIP_MAX_URL_SIZE]; /* ID must be valid */ @@ -339,13 +341,32 @@ PJ_DEF(pj_status_t) pjsua_acc_add_local( pjsua_transport_id tid, /* Lower the priority of local account */ --cfg.priority; + /* Enclose IPv6 address in square brackets */ + if (t->type & PJSIP_TRANSPORT_IPV6) { + beginquote = "["; + endquote = "]"; + } else { + beginquote = endquote = ""; + } + + /* Don't add transport parameter if it's UDP */ + if ((t->type & PJSIP_TRANSPORT_UDP) == 0) { + pj_ansi_snprintf(transport_param, sizeof(transport_param), + ";transport=%s", + pjsip_transport_get_type_name(t->type)); + } else { + transport_param[0] = '\0'; + } + /* Build URI for the account */ pj_ansi_snprintf(uri, PJSIP_MAX_URL_SIZE, - "<sip:%.*s:%d;transport=%s>", + "<sip:%s%.*s%s:%d%s>", + beginquote, (int)t->local_name.host.slen, t->local_name.host.ptr, + endquote, t->local_name.port, - pjsip_transport_get_type_name(t->type)); + transport_param); cfg.id = pj_str(uri); @@ -1361,6 +1382,9 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool, unsigned flag; int secure; int local_port; + const char *beginquote, *endquote; + char transport_param[32]; + PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL); acc = &pjsua_var.acc[acc_id]; @@ -1405,6 +1429,12 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool, if (tp_type == PJSIP_TRANSPORT_UNSPECIFIED) return PJSIP_EUNSUPTRANSPORT; + /* If destination URI specifies IPv6, then set transport type + * to use IPv6 as well. + */ + if (pj_strchr(suri, ':')) + tp_type = (pjsip_transport_type_e)(((int)tp_type) + PJSIP_TRANSPORT_IPV6); + flag = pjsip_transport_get_flag_from_type(tp_type); secure = (flag & PJSIP_TRANSPORT_SECURE) != 0; @@ -1418,10 +1448,28 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool, if (status != PJ_SUCCESS) return status; + /* Enclose IPv6 address in square brackets */ + if (tp_type & PJSIP_TRANSPORT_IPV6) { + beginquote = "["; + endquote = "]"; + } else { + beginquote = endquote = ""; + } + + /* Don't add transport parameter if it's UDP */ + if ((tp_type & PJSIP_TRANSPORT_UDP) == 0) { + pj_ansi_snprintf(transport_param, sizeof(transport_param), + ";transport=%s", + pjsip_transport_get_type_name(tp_type)); + } else { + transport_param[0] = '\0'; + } + + /* Create the contact header */ contact->ptr = (char*)pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE); contact->slen = pj_ansi_snprintf(contact->ptr, PJSIP_MAX_URL_SIZE, - "%.*s%s<%s:%.*s%s%.*s:%d;transport=%s>", + "%.*s%s<%s:%.*s%s%s%.*s%s:%d%s>", (int)acc->display.slen, acc->display.ptr, (acc->display.slen?" " : ""), @@ -1429,10 +1477,12 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool, (int)acc->user_part.slen, acc->user_part.ptr, (acc->user_part.slen?"@":""), + beginquote, (int)local_addr.slen, local_addr.ptr, + endquote, local_port, - pjsip_transport_get_type_name(tp_type)); + transport_param); return PJ_SUCCESS; } @@ -1461,6 +1511,8 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool, unsigned flag; int secure; int local_port; + const char *beginquote, *endquote; + char transport_param[32]; PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL); acc = &pjsua_var.acc[acc_id]; @@ -1508,10 +1560,16 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool, tp_type = PJSIP_TRANSPORT_UDP; } else tp_type = pjsip_transport_get_type_from_name(&sip_uri->transport_param); - + if (tp_type == PJSIP_TRANSPORT_UNSPECIFIED) return PJSIP_EUNSUPTRANSPORT; + /* If destination URI specifies IPv6, then set transport type + * to use IPv6 as well. + */ + if (pj_strchr(&sip_uri->host, ':')) + tp_type = (pjsip_transport_type_e)(((int)tp_type) + PJSIP_TRANSPORT_IPV6); + flag = pjsip_transport_get_flag_from_type(tp_type); secure = (flag & PJSIP_TRANSPORT_SECURE) != 0; @@ -1525,10 +1583,28 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool, if (status != PJ_SUCCESS) return status; + /* Enclose IPv6 address in square brackets */ + if (tp_type & PJSIP_TRANSPORT_IPV6) { + beginquote = "["; + endquote = "]"; + } else { + beginquote = endquote = ""; + } + + /* Don't add transport parameter if it's UDP */ + if ((tp_type & PJSIP_TRANSPORT_UDP) == 0) { + pj_ansi_snprintf(transport_param, sizeof(transport_param), + ";transport=%s", + pjsip_transport_get_type_name(tp_type)); + } else { + transport_param[0] = '\0'; + } + + /* Create the contact header */ contact->ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE); contact->slen = pj_ansi_snprintf(contact->ptr, PJSIP_MAX_URL_SIZE, - "%.*s%s<%s:%.*s%s%.*s:%d;transport=%s>", + "%.*s%s<%s:%.*s%s%s%.*s%s:%d%s>", (int)acc->display.slen, acc->display.ptr, (acc->display.slen?" " : ""), @@ -1536,10 +1612,12 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool, (int)acc->user_part.slen, acc->user_part.ptr, (acc->user_part.slen?"@":""), + beginquote, (int)local_addr.slen, local_addr.ptr, + endquote, local_port, - pjsip_transport_get_type_name(tp_type)); + transport_param); return PJ_SUCCESS; } |