diff --git a/daemon/call.c b/daemon/call.c index 1905f9c17..beaa7e188 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2131,8 +2131,10 @@ static void __tos_change(struct call *call, const struct sdp_ng_flags *flags) { } static void __init_interface(struct call_media *media, const str *ifname, int num_ports) { - if (!media->logical_intf && media->monologue) + if (!media->logical_intf) media->logical_intf = media->monologue->logical_intf; + if (!media->desired_family) + media->desired_family = media->monologue->desired_family; if (!media->logical_intf) goto get; if (media->logical_intf->preferred_family != media->desired_family) @@ -2160,8 +2162,8 @@ get: media->logical_intf = get_logical_interface(NULL, NULL, 0); } } - if (media->monologue) - media->monologue->logical_intf = media->logical_intf; + media->monologue->logical_intf = media->logical_intf; + media->monologue->desired_family = media->desired_family; } diff --git a/daemon/redis.c b/daemon/redis.c index c508f5924..d1dbe7695 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -1484,11 +1484,15 @@ static int redis_tags(struct call *c, struct redis_list *tags, JsonReader *root_ if (!redis_hash_get_int(&ii, rh, "block_media")) ml->block_media = ii ? 1 : 0; + if (redis_hash_get_str(&s, rh, "desired_family")) + return -1; + ml->desired_family = get_socket_family_rfc(&s); + if (redis_hash_get_str(&s, rh, "logical_intf") - || !(ml->logical_intf = get_logical_interface(&s, NULL, 0))) + || !(ml->logical_intf = get_logical_interface(&s, ml->desired_family, 0))) { rlog(LOG_ERR, "unable to find specified local interface"); - ml->logical_intf = get_logical_interface(NULL, NULL, 0); + ml->logical_intf = get_logical_interface(NULL, ml->desired_family, 0); } if (json_build_ssrc(ml, root_reader)) @@ -2468,6 +2472,7 @@ char* redis_encode_json(struct call *c) { JSON_SET_SIMPLE("deleted","%llu",(long long unsigned) ml->deleted); JSON_SET_SIMPLE("block_dtmf","%i", ml->block_dtmf); JSON_SET_SIMPLE("block_media","%i",ml->block_media ? 1 : 0); + JSON_SET_SIMPLE_CSTR("desired_family", ml->desired_family ? ml->desired_family->rfc_name : ""); if (ml->logical_intf) JSON_SET_SIMPLE_STR("logical_intf", &ml->logical_intf->name); diff --git a/include/call.h b/include/call.h index 52f50ce48..49279dd96 100644 --- a/include/call.h +++ b/include/call.h @@ -451,6 +451,7 @@ struct call_monologue { struct timeval started; /* for CDR */ struct timeval terminated; /* for CDR */ enum termination_reason term_reason; + sockfamily_t *desired_family; const struct logical_intf *logical_intf; GHashTable *other_tags; GHashTable *branches;