diff --git a/daemon/call.c b/daemon/call.c index 437915c8a..11e0925ce 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -3390,12 +3390,13 @@ void call_destroy(struct call *c) { continue; char *addr = sockaddr_print_buf(&ps->endpoint.address); - char *local_addr = ps->selected_sfd ? sockaddr_print_buf(&ps->selected_sfd->socket.local.address) : "0.0.0.0"; + endpoint_t *local_endpoint = packet_stream_local_addr(ps); + char *local_addr = sockaddr_print_buf(&local_endpoint->address); ilog(LOG_INFO, "--------- Port %15s:%-5u <> %s%15s:%-5u%s%s, SSRC %s%" PRIx32 "%s, " ""UINT64F" p, "UINT64F" b, "UINT64F" e, "UINT64F" ts", local_addr, - (unsigned int) (ps->selected_sfd ? ps->selected_sfd->socket.local.port : 0), + (unsigned int) local_endpoint->port, FMT_M(addr, ps->endpoint.port), (!PS_ISSET(ps, RTP) && PS_ISSET(ps, RTCP)) ? " (RTCP)" : "", FMT_M(ps->ssrc_in[0] ? ps->ssrc_in[0]->parent->h.ssrc : 0), @@ -3856,6 +3857,8 @@ static void __monologue_destroy(struct call_monologue *monologue, bool recurse) struct call_media *m = l->data; for (GList *k = m->streams.head; k; k = k->next) { struct packet_stream *ps = k->data; + if (ps->selected_sfd && ps->selected_sfd->socket.local.port) + ps->last_local_endpoint = ps->selected_sfd->socket.local; ps->selected_sfd = NULL; struct stream_fd *sfd; diff --git a/daemon/cli.c b/daemon/cli.c index c67808958..9d002aabe 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -689,13 +689,13 @@ static void cli_list_tag_info(struct cli_writer *cw, struct call_monologue *ml) if (PS_ISSET(ps, FALLBACK_RTCP)) continue; - local_addr = ps->selected_sfd ? sockaddr_print_buf(&ps->selected_sfd->socket.local.address) - : "0.0.0.0"; + endpoint_t *local_endpoint = packet_stream_local_addr(ps); + local_addr = sockaddr_print_buf(&local_endpoint->address); cw->cw_printf(cw, "-------- Port %15s:%-5u <> %15s:%-5u%s, SSRC %" PRIx32 ", " "" UINT64F " p, " UINT64F " b, " UINT64F " e, " UINT64F " ts", local_addr, - (unsigned int) (ps->selected_sfd ? ps->selected_sfd->socket.local.port : 0), + (unsigned int) local_endpoint->port, sockaddr_print_buf(&ps->endpoint.address), ps->endpoint.port, (!PS_ISSET(ps, RTP) && PS_ISSET(ps, RTCP)) ? " (RTCP)" : "", diff --git a/include/call.h b/include/call.h index e78a85b25..abccb910c 100644 --- a/include/call.h +++ b/include/call.h @@ -323,6 +323,7 @@ struct packet_stream { GQueue sfds; /* LOCK: call->master_lock */ struct stream_fd * selected_sfd; + endpoint_t last_local_endpoint; struct dtls_connection ice_dtls; /* LOCK: in_lock */ GQueue rtp_sinks; // LOCK: call->master_lock, in_lock for streamhandler GQueue rtcp_sinks; // LOCK: call->master_lock, in_lock for streamhandler @@ -747,5 +748,21 @@ INLINE void __call_unkernelize(struct call *call) { __monologue_unkernelize(ml); } } +INLINE endpoint_t *packet_stream_local_addr(struct packet_stream *ps) { + if (ps->selected_sfd) + return &ps->selected_sfd->socket.local; + if (ps->last_local_endpoint.port) + return &ps->last_local_endpoint; + static endpoint_t dummy = { + .address = { + .u.ipv4.s_addr = 0, + }, + .port = 0, + }; + // one-time init + if (!dummy.address.family) + dummy.address.family = get_socket_family_enum(SF_IP4); + return &dummy; +} #endif