mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-06-07 05:29:22 +00:00
FS-9197
This commit is contained in:
parent
79229cdb8a
commit
46b9ace417
@ -3342,10 +3342,10 @@ static switch_bool_t ip_possible(switch_media_handle_t *smh, const char *ip)
|
|||||||
static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_session_t *sdp, sdp_media_t *m)
|
static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t type, sdp_session_t *sdp, sdp_media_t *m)
|
||||||
{
|
{
|
||||||
switch_rtp_engine_t *engine = &smh->engines[type];
|
switch_rtp_engine_t *engine = &smh->engines[type];
|
||||||
sdp_attribute_t *attr;
|
sdp_attribute_t *attr = NULL, *attrs[2] = { 0 };
|
||||||
int i = 0, got_rtcp_mux = 0;
|
int i = 0, got_rtcp_mux = 0;
|
||||||
const char *val;
|
const char *val;
|
||||||
int ice_seen = 0, cid = 0, ai = 0;
|
int ice_seen = 0, cid = 0, ai = 0, attr_idx = 0, cand_seen = 0;
|
||||||
|
|
||||||
if (switch_true(switch_channel_get_variable_dup(smh->session->channel, "ignore_sdp_ice", SWITCH_FALSE, -1))) {
|
if (switch_true(switch_channel_get_variable_dup(smh->session->channel, "ignore_sdp_ice", SWITCH_FALSE, -1))) {
|
||||||
return SWITCH_STATUS_BREAK;
|
return SWITCH_STATUS_BREAK;
|
||||||
@ -3364,157 +3364,161 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t
|
|||||||
engine->remote_ssrc = 0;
|
engine->remote_ssrc = 0;
|
||||||
|
|
||||||
if (m) {
|
if (m) {
|
||||||
attr = m->m_attributes;
|
attrs[0] = m->m_attributes;
|
||||||
|
attrs[1] = sdp->sdp_attributes;
|
||||||
} else {
|
} else {
|
||||||
attr = sdp->sdp_attributes;
|
attrs[0] = sdp->sdp_attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; attr; attr = attr->a_next) {
|
for (attr_idx = 0; attr_idx < 2 && !(ice_seen && cand_seen); attr_idx++) {
|
||||||
char *data;
|
for (attr = attrs[attr_idx]; attr; attr = attr->a_next) {
|
||||||
char *fields[15];
|
char *data;
|
||||||
int argc = 0, j = 0;
|
char *fields[15];
|
||||||
|
int argc = 0, j = 0;
|
||||||
|
|
||||||
if (zstr(attr->a_name)) {
|
if (zstr(attr->a_name)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcasecmp(attr->a_name, "ice-ufrag")) {
|
if (!strcasecmp(attr->a_name, "ice-ufrag")) {
|
||||||
if (engine->ice_in.ufrag && !strcmp(engine->ice_in.ufrag, attr->a_value)) {
|
if (engine->ice_in.ufrag && !strcmp(engine->ice_in.ufrag, attr->a_value)) {
|
||||||
engine->new_ice = 0;
|
engine->new_ice = 0;
|
||||||
} else {
|
|
||||||
engine->ice_in.ufrag = switch_core_session_strdup(smh->session, attr->a_value);
|
|
||||||
engine->new_ice = 1;
|
|
||||||
}
|
|
||||||
ice_seen++;
|
|
||||||
} else if (!strcasecmp(attr->a_name, "ice-pwd")) {
|
|
||||||
if (!engine->ice_in.pwd || strcmp(engine->ice_in.pwd, attr->a_value)) {
|
|
||||||
engine->ice_in.pwd = switch_core_session_strdup(smh->session, attr->a_value);
|
|
||||||
}
|
|
||||||
} else if (!strcasecmp(attr->a_name, "ice-options")) {
|
|
||||||
engine->ice_in.options = switch_core_session_strdup(smh->session, attr->a_value);
|
|
||||||
} else if (!strcasecmp(attr->a_name, "setup")) {
|
|
||||||
if (!strcasecmp(attr->a_value, "passive") || !strcasecmp(attr->a_value, "actpass")) {
|
|
||||||
if (!engine->dtls_controller) {
|
|
||||||
engine->new_dtls = 1;
|
|
||||||
engine->new_ice = 1;
|
|
||||||
}
|
|
||||||
engine->dtls_controller = 1;
|
|
||||||
} else if (!strcasecmp(attr->a_value, "active")) {
|
|
||||||
if (engine->dtls_controller) {
|
|
||||||
engine->new_dtls = 1;
|
|
||||||
engine->new_ice = 1;
|
|
||||||
}
|
|
||||||
engine->dtls_controller = 0;
|
|
||||||
}
|
|
||||||
} else if (switch_rtp_has_dtls() && dtls_ok(smh->session) && !strcasecmp(attr->a_name, "fingerprint") && !zstr(attr->a_value)) {
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
engine->remote_dtls_fingerprint.type = switch_core_session_strdup(smh->session, attr->a_value);
|
|
||||||
|
|
||||||
if ((p = strchr(engine->remote_dtls_fingerprint.type, ' '))) {
|
|
||||||
*p++ = '\0';
|
|
||||||
|
|
||||||
if (switch_channel_test_flag(smh->session->channel, CF_REINVITE) && !switch_channel_test_flag(smh->session->channel, CF_RECOVERING) &&
|
|
||||||
!zstr(engine->remote_dtls_fingerprint.str) && !strcmp(engine->remote_dtls_fingerprint.str, p)) {
|
|
||||||
engine->new_dtls = 0;
|
|
||||||
} else {
|
} else {
|
||||||
switch_set_string(engine->remote_dtls_fingerprint.str, p);
|
engine->ice_in.ufrag = switch_core_session_strdup(smh->session, attr->a_value);
|
||||||
engine->new_dtls = 1;
|
|
||||||
engine->new_ice = 1;
|
engine->new_ice = 1;
|
||||||
}
|
}
|
||||||
}
|
ice_seen++;
|
||||||
|
} else if (!strcasecmp(attr->a_name, "ice-pwd")) {
|
||||||
|
if (!engine->ice_in.pwd || strcmp(engine->ice_in.pwd, attr->a_value)) {
|
||||||
|
engine->ice_in.pwd = switch_core_session_strdup(smh->session, attr->a_value);
|
||||||
|
}
|
||||||
|
} else if (!strcasecmp(attr->a_name, "ice-options")) {
|
||||||
|
engine->ice_in.options = switch_core_session_strdup(smh->session, attr->a_value);
|
||||||
|
} else if (!strcasecmp(attr->a_name, "setup")) {
|
||||||
|
if (!strcasecmp(attr->a_value, "passive") || !strcasecmp(attr->a_value, "actpass")) {
|
||||||
|
if (!engine->dtls_controller) {
|
||||||
|
engine->new_dtls = 1;
|
||||||
|
engine->new_ice = 1;
|
||||||
|
}
|
||||||
|
engine->dtls_controller = 1;
|
||||||
|
} else if (!strcasecmp(attr->a_value, "active")) {
|
||||||
|
if (engine->dtls_controller) {
|
||||||
|
engine->new_dtls = 1;
|
||||||
|
engine->new_ice = 1;
|
||||||
|
}
|
||||||
|
engine->dtls_controller = 0;
|
||||||
|
}
|
||||||
|
} else if (switch_rtp_has_dtls() && dtls_ok(smh->session) && !strcasecmp(attr->a_name, "fingerprint") && !zstr(attr->a_value)) {
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
engine->remote_dtls_fingerprint.type = switch_core_session_strdup(smh->session, attr->a_value);
|
||||||
|
|
||||||
|
if ((p = strchr(engine->remote_dtls_fingerprint.type, ' '))) {
|
||||||
|
*p++ = '\0';
|
||||||
|
|
||||||
|
if (switch_channel_test_flag(smh->session->channel, CF_REINVITE) && !switch_channel_test_flag(smh->session->channel, CF_RECOVERING) &&
|
||||||
|
!zstr(engine->remote_dtls_fingerprint.str) && !strcmp(engine->remote_dtls_fingerprint.str, p)) {
|
||||||
|
engine->new_dtls = 0;
|
||||||
|
} else {
|
||||||
|
switch_set_string(engine->remote_dtls_fingerprint.str, p);
|
||||||
|
engine->new_dtls = 1;
|
||||||
|
engine->new_ice = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//if (strcasecmp(engine->remote_dtls_fingerprint.type, "sha-256")) {
|
//if (strcasecmp(engine->remote_dtls_fingerprint.type, "sha-256")) {
|
||||||
// switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Unsupported fingerprint type.\n");
|
// switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Unsupported fingerprint type.\n");
|
||||||
//engine->local_dtls_fingerprint.type = NULL;
|
//engine->local_dtls_fingerprint.type = NULL;
|
||||||
//engine->remote_dtls_fingerprint.type = NULL;
|
//engine->remote_dtls_fingerprint.type = NULL;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
||||||
generate_local_fingerprint(smh, type);
|
generate_local_fingerprint(smh, type);
|
||||||
switch_channel_set_flag(smh->session->channel, CF_DTLS);
|
switch_channel_set_flag(smh->session->channel, CF_DTLS);
|
||||||
|
|
||||||
} else if (!engine->remote_ssrc && !strcasecmp(attr->a_name, "ssrc") && attr->a_value) {
|
} else if (!engine->remote_ssrc && !strcasecmp(attr->a_name, "ssrc") && attr->a_value) {
|
||||||
engine->remote_ssrc = (uint32_t) atol(attr->a_value);
|
engine->remote_ssrc = (uint32_t) atol(attr->a_value);
|
||||||
|
|
||||||
if (engine->rtp_session && engine->remote_ssrc) {
|
if (engine->rtp_session && engine->remote_ssrc) {
|
||||||
switch_rtp_set_remote_ssrc(engine->rtp_session, engine->remote_ssrc);
|
switch_rtp_set_remote_ssrc(engine->rtp_session, engine->remote_ssrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef RTCP_MUX
|
#ifdef RTCP_MUX
|
||||||
} else if (!strcasecmp(attr->a_name, "rtcp-mux")) {
|
} else if (!strcasecmp(attr->a_name, "rtcp-mux")) {
|
||||||
engine->rtcp_mux = SWITCH_TRUE;
|
engine->rtcp_mux = SWITCH_TRUE;
|
||||||
engine->remote_rtcp_port = engine->cur_payload_map->remote_sdp_port;
|
engine->remote_rtcp_port = engine->cur_payload_map->remote_sdp_port;
|
||||||
got_rtcp_mux++;
|
got_rtcp_mux++;
|
||||||
#endif
|
#endif
|
||||||
} else if (!strcasecmp(attr->a_name, "candidate")) {
|
} else if (!strcasecmp(attr->a_name, "candidate")) {
|
||||||
switch_channel_set_flag(smh->session->channel, CF_ICE);
|
switch_channel_set_flag(smh->session->channel, CF_ICE);
|
||||||
|
|
||||||
if (!engine->cand_acl_count) {
|
if (!engine->cand_acl_count) {
|
||||||
engine->cand_acl[engine->cand_acl_count++] = "wan.auto";
|
engine->cand_acl[engine->cand_acl_count++] = "wan.auto";
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "NO candidate ACL defined, Defaulting to wan.auto\n");
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "NO candidate ACL defined, Defaulting to wan.auto\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!switch_stristr(" udp ", attr->a_value)) {
|
if (!switch_stristr(" udp ", attr->a_value)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = switch_core_session_strdup(smh->session, attr->a_value);
|
data = switch_core_session_strdup(smh->session, attr->a_value);
|
||||||
|
|
||||||
argc = switch_split(data, ' ', fields);
|
argc = switch_split(data, ' ', fields);
|
||||||
|
|
||||||
cid = fields[1] ? atoi(fields[1]) - 1 : 0;
|
cid = fields[1] ? atoi(fields[1]) - 1 : 0;
|
||||||
|
|
||||||
if (argc < 5 || engine->ice_in.cand_idx[cid] >= MAX_CAND - 1) {
|
if (argc < 5 || engine->ice_in.cand_idx[cid] >= MAX_CAND - 1) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Invalid data\n");
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Invalid data\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < argc; i++) {
|
for (i = 0; i < argc; i++) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG1, "CAND %d [%s]\n", i, fields[i]);
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG1, "CAND %d [%s]\n", i, fields[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ip_possible(smh, fields[4])) {
|
if (!ip_possible(smh, fields[4])) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG,
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG,
|
||||||
"Drop %s Candidate cid: %d proto: %s type: %s addr: %s:%s (no network path)\n",
|
"Drop %s Candidate cid: %d proto: %s type: %s addr: %s:%s (no network path)\n",
|
||||||
type == SWITCH_MEDIA_TYPE_VIDEO ? "video" : "audio",
|
type == SWITCH_MEDIA_TYPE_VIDEO ? "video" : "audio",
|
||||||
cid+1, fields[2], fields[7], fields[4], fields[5]);
|
cid+1, fields[2], fields[7], fields[4], fields[5]);
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG,
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG,
|
||||||
"Save %s Candidate cid: %d proto: %s type: %s addr: %s:%s\n",
|
"Save %s Candidate cid: %d proto: %s type: %s addr: %s:%s\n",
|
||||||
type == SWITCH_MEDIA_TYPE_VIDEO ? "video" : "audio",
|
type == SWITCH_MEDIA_TYPE_VIDEO ? "video" : "audio",
|
||||||
cid+1, fields[2], fields[7], fields[4], fields[5]);
|
cid+1, fields[2], fields[7], fields[4], fields[5]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].foundation = switch_core_session_strdup(smh->session, fields[0]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].foundation = switch_core_session_strdup(smh->session, fields[0]);
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].component_id = atoi(fields[1]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].component_id = atoi(fields[1]);
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].transport = switch_core_session_strdup(smh->session, fields[2]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].transport = switch_core_session_strdup(smh->session, fields[2]);
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].priority = atol(fields[3]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].priority = atol(fields[3]);
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].con_addr = switch_core_session_strdup(smh->session, fields[4]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].con_addr = switch_core_session_strdup(smh->session, fields[4]);
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].con_port = (switch_port_t)atoi(fields[5]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].con_port = (switch_port_t)atoi(fields[5]);
|
||||||
|
|
||||||
j = 6;
|
j = 6;
|
||||||
|
|
||||||
while(j < argc && fields[j+1]) {
|
while(j < argc && fields[j+1]) {
|
||||||
if (!strcasecmp(fields[j], "typ")) {
|
if (!strcasecmp(fields[j], "typ")) {
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].cand_type = switch_core_session_strdup(smh->session, fields[j+1]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].cand_type = switch_core_session_strdup(smh->session, fields[j+1]);
|
||||||
} else if (!strcasecmp(fields[j], "raddr")) {
|
} else if (!strcasecmp(fields[j], "raddr")) {
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].raddr = switch_core_session_strdup(smh->session, fields[j+1]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].raddr = switch_core_session_strdup(smh->session, fields[j+1]);
|
||||||
} else if (!strcasecmp(fields[j], "rport")) {
|
} else if (!strcasecmp(fields[j], "rport")) {
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].rport = (switch_port_t)atoi(fields[j+1]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].rport = (switch_port_t)atoi(fields[j+1]);
|
||||||
} else if (!strcasecmp(fields[j], "generation")) {
|
} else if (!strcasecmp(fields[j], "generation")) {
|
||||||
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].generation = switch_core_session_strdup(smh->session, fields[j+1]);
|
engine->ice_in.cands[engine->ice_in.cand_idx[cid]][cid].generation = switch_core_session_strdup(smh->session, fields[j+1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
j += 2;
|
j += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
cand_seen++;
|
||||||
|
engine->ice_in.cand_idx[cid]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
engine->ice_in.cand_idx[cid]++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user