diff --git a/daemon/call.c b/daemon/call.c index ab2e37d97..d9fbe1d04 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -1319,7 +1319,7 @@ static void __init_interface(struct call_media *media, const str *ifname) { return; get: media->logical_intf = get_logical_interface(ifname, media->desired_family); - if (!media->logical_intf) { + if (G_UNLIKELY(!media->logical_intf)) { /* legacy support */ if (!str_cmp(ifname, "internal")) media->desired_family = __get_socket_family_enum(SF_IP4); @@ -1328,6 +1328,11 @@ get: else ilog(LOG_WARNING, "Interface '"STR_FORMAT"' not found, using default", STR_FMT(ifname)); media->logical_intf = get_logical_interface(NULL, media->desired_family); + if (!media->logical_intf) { + ilog(LOG_WARNING, "Requested address family (%s) not supported", + media->desired_family->name); + media->logical_intf = get_logical_interface(NULL, NULL); + } } // media->local_intf = ifa = get_interface_address(media->logical_intf, media->desired_family); // if (!ifa) { diff --git a/daemon/media_socket.c b/daemon/media_socket.c index cc20eddb6..78666e4a0 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -233,9 +233,20 @@ static GQueue __preferred_lists_for_family[__SF_LAST]; struct logical_intf *get_logical_interface(const str *name, sockfamily_t *fam) { struct logical_intf d, *lif; - if (!name || !name->s) { + if (G_UNLIKELY(!name || !name->s)) { GQueue *q; - q = __interface_list_for_family(fam); + if (fam) + q = __interface_list_for_family(fam); + else { + for (int i = 0; i < __SF_LAST; i++) { + q = &__preferred_lists_for_family[i]; + if (q->length) + goto got_some; + } + abort(); +got_some: + ; + } return q->head ? q->head->data : NULL; }