From 569aac1b1ccbf71063ee5688d0d95a5edb917c2c Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 23 Jan 2024 12:52:53 +0700 Subject: [PATCH] Potential issues when IPv6 is disabled (#3835) --- pjsip/src/pjsua-lib/pjsua_acc.c | 45 ++++++++++++++++++++++++++----- pjsip/src/pjsua-lib/pjsua_core.c | 10 +++++-- pjsip/src/pjsua-lib/pjsua_media.c | 18 +++++++++---- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index b2a4df929..40d10765a 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -462,6 +462,12 @@ PJ_DEF(pj_status_t) pjsua_acc_add( const pjsua_acc_config *cfg, PJ_ASSERT_RETURN(pjsua_var.acc_cnt < PJ_ARRAY_SIZE(pjsua_var.acc), PJ_ETOOMANY); +#if !PJ_HAS_IPV6 + PJ_ASSERT_RETURN(cfg->ipv6_sip_use == PJSUA_IPV6_DISABLED, PJ_EINVAL); + PJ_ASSERT_RETURN(cfg->ipv6_media_use == PJSUA_IPV6_DISABLED, PJ_EINVAL); + PJ_ASSERT_RETURN(cfg->nat64_opt == PJSUA_IPV6_DISABLED, PJ_EINVAL); +#endif + /* Must have a transport */ PJ_ASSERT_RETURN(pjsua_var.tpdata[0].data.ptr != NULL, PJ_EINVALIDOP); @@ -845,6 +851,12 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id, PJ_ASSERT_RETURN(acc_id>=0 && acc_id<(int)PJ_ARRAY_SIZE(pjsua_var.acc), PJ_EINVAL); +#if !PJ_HAS_IPV6 + PJ_ASSERT_RETURN(cfg->ipv6_sip_use == PJSUA_IPV6_DISABLED, PJ_EINVAL); + PJ_ASSERT_RETURN(cfg->ipv6_media_use == PJSUA_IPV6_DISABLED, PJ_EINVAL); + PJ_ASSERT_RETURN(cfg->nat64_opt == PJSUA_IPV6_DISABLED, PJ_EINVAL); +#endif + PJ_LOG(4,(THIS_FILE, "Modifying account %d", acc_id)); pj_log_push_indent(); @@ -1009,6 +1021,13 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id, unreg_first = PJ_TRUE; } + /* SIP IP version preference */ + if (acc->cfg.ipv6_sip_use != cfg->ipv6_sip_use) { + acc->cfg.ipv6_sip_use = cfg->ipv6_sip_use; + update_reg = PJ_TRUE; + unreg_first = PJ_TRUE; + } + /* User data */ acc->cfg.user_data = cfg->user_data; @@ -1375,8 +1394,10 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id, acc->cfg.rtp_cfg.bound_addr = b_addr; } - acc->cfg.nat64_opt = cfg->nat64_opt; - acc->cfg.ipv6_media_use = cfg->ipv6_media_use; + acc->cfg.nat64_opt = PJ_HAS_IPV6? cfg->nat64_opt : + PJSUA_NAT64_DISABLED; + acc->cfg.ipv6_media_use = PJ_HAS_IPV6? cfg->ipv6_media_use : + PJSUA_IPV6_DISABLED; acc->cfg.enable_rtcp_mux = cfg->enable_rtcp_mux; acc->cfg.lock_codec = cfg->lock_codec; acc->cfg.enable_rtcp_xr = cfg->enable_rtcp_xr; @@ -2732,15 +2753,21 @@ static pj_status_t pjsua_regc_init(int acc_id) pj_bool_t pjsua_sip_acc_is_using_ipv6(pjsua_acc_id acc_id) { +#if PJ_HAS_IPV6 pjsua_acc *acc = &pjsua_var.acc[acc_id]; return ((acc->tp_type & PJSIP_TRANSPORT_IPV6) == PJSIP_TRANSPORT_IPV6 || pjsua_var.acc[acc_id].cfg.ipv6_sip_use == PJSUA_IPV6_ENABLED_USE_IPV6_ONLY); +#else + PJ_UNUSED_ARG(acc_id); + return PJ_FALSE; +#endif } static int sip_acc_get_pref_ip_ver(pjsua_acc_id acc_id) { +#if PJ_HAS_IPV6 pjsua_acc *acc = &pjsua_var.acc[acc_id]; if ((acc->tp_type & PJSIP_TRANSPORT_IPV6) == PJSIP_TRANSPORT_IPV6 || @@ -2765,6 +2792,10 @@ static int sip_acc_get_pref_ip_ver(pjsua_acc_id acc_id) */ return 0; } +#else + PJ_UNUSED_ARG(acc_id); + return 4; +#endif } pj_bool_t pjsua_sip_acc_is_using_stun(pjsua_acc_id acc_id) @@ -3551,10 +3582,10 @@ pj_status_t pjsua_acc_get_uac_addr(pjsua_acc_id acc_id, goto on_return; } - if (ip_addr_ver == 6 || sip_pref_ip == 6) { + if (PJ_HAS_IPV6 && (ip_addr_ver == 6 || sip_pref_ip == 6)) { /* Get IPv6 address if dest host is IPv6 or we prefer IPv6. */ af = pj_AF_INET6(); - } else if (ip_addr_ver == 4 || sip_pref_ip == 4) { + } else if (!PJ_HAS_IPV6 || ip_addr_ver == 4 || sip_pref_ip == 4) { /* Get IPv4 address if dest host is IPv4 or we prefer IPv4. */ af = pj_AF_INET(); } else { @@ -3574,7 +3605,9 @@ pj_status_t pjsua_acc_get_uac_addr(pjsua_acc_id acc_id, /* Get fallback address, only if the host is not IP address and * account is not bound to a certain transport. */ - if (ip_addr_ver == 0 && acc->tp_type == PJSIP_TRANSPORT_UNSPECIFIED) { + if (PJ_HAS_IPV6 && ip_addr_ver == 0 && + acc->tp_type == PJSIP_TRANSPORT_UNSPECIFIED) + { unsigned cnt = 1; /* If first address is IPv4, fallback to IPv6, and vice versa. */ @@ -3870,7 +3903,7 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool, pjsua_sip_acc_is_using_ipv6(acc_id) || (rdata->tp_info.transport->key.type & PJSIP_TRANSPORT_IPV6)) { - if (acc->cfg.ipv6_sip_use == PJSUA_IPV6_DISABLED) + if (!PJ_HAS_IPV6 || acc->cfg.ipv6_sip_use == PJSUA_IPV6_DISABLED) return PJSIP_EUNSUPTRANSPORT; tp_type = (pjsip_transport_type_e) (((int)tp_type) | PJSIP_TRANSPORT_IPV6); diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 76fc296f1..4b8edbccc 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -373,8 +373,10 @@ PJ_DEF(void) pjsua_acc_config_default(pjsua_acc_config *cfg) cfg->register_on_acc_add = PJ_TRUE; cfg->mwi_expires = PJSIP_MWI_DEFAULT_EXPIRES; - cfg->ipv6_sip_use = PJSUA_IPV6_ENABLED_NO_PREFERENCE; - cfg->ipv6_media_use = PJSUA_IPV6_ENABLED_PREFER_IPV4; + cfg->ipv6_sip_use = PJ_HAS_IPV6? PJSUA_IPV6_ENABLED_NO_PREFERENCE : + PJSUA_IPV6_DISABLED; + cfg->ipv6_media_use = PJ_HAS_IPV6? PJSUA_IPV6_ENABLED_PREFER_IPV4 : + PJSUA_IPV6_DISABLED; cfg->media_stun_use = PJSUA_STUN_RETRY_ON_FAILURE; cfg->ip_change_cfg.shutdown_tp = PJ_TRUE; @@ -1215,6 +1217,10 @@ PJ_DEF(pj_status_t) pjsua_init( const pjsua_config *ua_cfg, } } +#if !PJ_HAS_IPV6 + pjsua_var.ua_cfg.stun_try_ipv6 = PJ_FALSE; +#endif + /* Start resolving STUN server */ status = resolve_stun_server(PJ_FALSE, PJ_FALSE, 0); if (status != PJ_SUCCESS && status != PJ_EPENDING) { diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index f70eb18fd..d079787a5 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -249,6 +249,8 @@ pj_status_t pjsua_media_subsys_destroy(unsigned flags) static int get_media_ip_version(pjsua_call_media *call_med, const pjmedia_sdp_session *rem_sdp) { +#if PJ_HAS_IPV6 + pjsua_ipv6_use ipv6_use; ipv6_use = pjsua_var.acc[call_med->call->acc_id].cfg.ipv6_media_use; @@ -276,6 +278,10 @@ static int get_media_ip_version(pjsua_call_media *call_med, return 6; } } +#else + PJ_UNUSED_ARG(call_med); + PJ_UNUSED_ARG(rem_sdp); +#endif /* Use IPv4. */ return 4; @@ -304,7 +310,7 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med, pj_sock_t sock[2]; use_ipv6 = (get_media_ip_version(call_med, rem_sdp) == 6); - use_nat64 = (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED); + use_nat64 = PJ_HAS_IPV6 && (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED); af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET(); /* Make sure STUN server resolution has completed */ @@ -757,7 +763,7 @@ static pj_status_t create_loop_media_transport( pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id]; use_ipv6 = (get_media_ip_version(call_med, rem_sdp) == 6); - use_nat64 = (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED); + use_nat64 = PJ_HAS_IPV6 && (acc->cfg.nat64_opt != PJSUA_NAT64_DISABLED); af = (use_ipv6 || use_nat64) ? pj_AF_INET6() : pj_AF_INET(); pjmedia_loop_tp_setting_default(&opt); @@ -1015,7 +1021,7 @@ static pj_status_t create_ice_media_transport( acc_cfg = &pjsua_var.acc[call_med->call->acc_id].cfg; use_ipv6 = (get_media_ip_version(call_med, remote_sdp) == 6); - use_nat64 = (acc_cfg->nat64_opt != PJSUA_NAT64_DISABLED); + use_nat64 = PJ_HAS_IPV6 && (acc_cfg->nat64_opt != PJSUA_NAT64_DISABLED); /* Make sure STUN server resolution has completed */ if (pjsua_media_acc_is_using_stun(call_med->call->acc_id)) { @@ -2811,9 +2817,11 @@ pj_status_t pjsua_media_channel_create_sdp(pjsua_call_id call_id, pj_bool_t use_ipv6; pj_bool_t use_nat64; - use_ipv6 = (pjsua_var.acc[call->acc_id].cfg.ipv6_media_use != + use_ipv6 = PJ_HAS_IPV6 && + (pjsua_var.acc[call->acc_id].cfg.ipv6_media_use != PJSUA_IPV6_DISABLED); - use_nat64 = (pjsua_var.acc[call->acc_id].cfg.nat64_opt != + use_nat64 = PJ_HAS_IPV6 && + (pjsua_var.acc[call->acc_id].cfg.nat64_opt != PJSUA_NAT64_DISABLED); m->conn = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_conn);