diff --git a/libs/libdingaling/src/libdingaling.c b/libs/libdingaling/src/libdingaling.c index ef6e7447a1..1af67f69c6 100644 --- a/libs/libdingaling/src/libdingaling.c +++ b/libs/libdingaling/src/libdingaling.c @@ -2471,6 +2471,11 @@ int ldl_handle_running(ldl_handle_t *handle) } +void ldl_session_set_gateway(ldl_session_t *session) +{ + ldl_set_flag(session, LDL_FLAG_GATEWAY); +} + int ldl_session_gateway(ldl_session_t *session) { return ldl_test_flag(session, LDL_FLAG_GATEWAY) ? 1 : 0; diff --git a/libs/libdingaling/src/libdingaling.h b/libs/libdingaling/src/libdingaling.h index d78643810c..c32b9363d9 100644 --- a/libs/libdingaling/src/libdingaling.h +++ b/libs/libdingaling/src/libdingaling.h @@ -593,6 +593,7 @@ ldl_status ldl_handle_init(ldl_handle_t **handle, void ldl_handle_run(ldl_handle_t *handle); int ldl_session_gateway(ldl_session_t *handle); +void ldl_session_set_gateway(ldl_session_t *session); /*! \brief Stop a libDingaLing handle diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index 69ce125d0f..e8704a9fa8 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -1002,7 +1002,7 @@ static int do_candidates(struct private_object *tech_pvt, int force) switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Send Candidate %s:%d [%s]\n", cand[0].address, cand[0].port, cand[0].username); - if (ldl_session_gateway(tech_pvt->dlsession)) { + if (ldl_session_gateway(tech_pvt->dlsession) && switch_test_flag(tech_pvt, TFLAG_OUTBOUND)) { tech_pvt->cand_id = ldl_session_transport(tech_pvt->dlsession, cand, 1); } else { tech_pvt->cand_id = ldl_session_candidates(tech_pvt->dlsession, cand, 1); @@ -2980,6 +2980,8 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi tech_pvt->flags |= profile->flags; channel = switch_core_session_get_channel(session); switch_core_session_set_private(session, tech_pvt); + tech_pvt->dlsession = dlsession; + tech_pvt->session = session; tech_pvt->codec_index = -1; tech_pvt->profile = profile; @@ -3025,6 +3027,24 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi cid_num = tech_pvt->recip; } + + if (switch_stristr("voice.google.com", from)) { + char *id = switch_core_session_strdup(session, from); + char *p; + + if ((p = strchr(id, '@'))) { + *p++ = '\0'; + cid_name = "Google Voice"; + cid_num = id; + } + + ldl_session_set_gateway(dlsession); + + do_candidates(tech_pvt, 1); + } + + + /* context of "_auto_" means set it to the domain */ if (profile->context && !strcmp(profile->context, "_auto_")) { context = profile->name; @@ -3047,7 +3067,7 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi switch_safe_free(tmp); } - + if (!tech_pvt->caller_profile) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Creating an identity for %s %s <%s> %s\n", ldl_session_get_id(dlsession), cid_name, cid_num, exten); @@ -3079,7 +3099,7 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi } switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Creating a session for %s\n", ldl_session_get_id(dlsession)); ldl_session_set_private(dlsession, session); - tech_pvt->dlsession = dlsession; + switch_channel_set_name(channel, "DingaLing/new"); switch_channel_set_state(channel, CS_INIT); if (switch_core_session_thread_launch(session) != SWITCH_STATUS_SUCCESS) { @@ -3230,6 +3250,7 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi } } } + } break; @@ -3259,7 +3280,15 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi if (profile->acl_count) { for (x = 0; x < len; x++) { uint32_t y = 0; + + if (strcasecmp(candidates[x].protocol, "udp")) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "candidate %s:%d has an unsupported protocol!\n", + candidates[x].address, candidates[x].port); + continue; + } + for (y = 0; y < profile->acl_count; y++) { + if (switch_check_network_list_ip(candidates[x].address, profile->acl[y])) { choice = x; ok = 1; @@ -3268,7 +3297,7 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi if (ok) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "candidate %s:%d PASS ACL %s\n", candidates[x].address, candidates[x].port, profile->acl[y]); - break; + goto end_candidates; } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "candidate %s:%d FAIL ACL %s\n", candidates[x].address, candidates[x].port, profile->acl[y]); @@ -3311,6 +3340,8 @@ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsessi } } + end_candidates: + if (ok) { ldl_payload_t payloads[5];