Potential issues when IPv6 is disabled (#3835)

This commit is contained in:
Nanang Izzuddin 2024-01-23 12:52:53 +07:00 committed by GitHub
parent 712b06407f
commit 569aac1b1c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 60 additions and 13 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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);