|
|
|
|
@ -263,6 +263,7 @@ static const struct mediaproxy_srtp __mps_null = {
|
|
|
|
|
static void call_destroy(struct call *);
|
|
|
|
|
static void unkernelize(struct packet_stream *);
|
|
|
|
|
static void __stream_unkernelize(struct packet_stream *ps);
|
|
|
|
|
static void stream_unkernelize(struct packet_stream *ps);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -531,7 +532,8 @@ static int stream_packet(struct stream_fd *sfd, str *s, struct sockaddr_in6 *fsi
|
|
|
|
|
*sink = NULL,
|
|
|
|
|
*in_srtp, *out_srtp;
|
|
|
|
|
struct call_media *media;
|
|
|
|
|
int ret = 0, update = 0, stun_ret = 0, handler_ret = 0, muxed_rtcp = 0, rtcp = 0;
|
|
|
|
|
int ret = 0, update = 0, stun_ret = 0, handler_ret = 0, muxed_rtcp = 0, rtcp = 0,
|
|
|
|
|
unk = 0;
|
|
|
|
|
struct sockaddr_in6 sin6;
|
|
|
|
|
struct msghdr mh;
|
|
|
|
|
struct iovec iov;
|
|
|
|
|
@ -654,7 +656,7 @@ use_cand:
|
|
|
|
|
if (tmp && PS_ISSET(stream, MEDIA_HANDOVER)) {
|
|
|
|
|
/* out_lock remains locked */
|
|
|
|
|
ilog(LOG_INFO, "Peer address changed to %s", addr);
|
|
|
|
|
__stream_unkernelize(stream);
|
|
|
|
|
unk = 1;
|
|
|
|
|
goto update_addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -755,7 +757,13 @@ out:
|
|
|
|
|
ret = 1;
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
if (unk)
|
|
|
|
|
__stream_unkernelize(stream);
|
|
|
|
|
mutex_unlock(&stream->in_lock);
|
|
|
|
|
if (unk) {
|
|
|
|
|
stream_unkernelize(stream->rtp_sink);
|
|
|
|
|
stream_unkernelize(stream->rtcp_sink);
|
|
|
|
|
}
|
|
|
|
|
rwlock_unlock_r(&call->master_lock);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
@ -2289,6 +2297,13 @@ static void __stream_unkernelize(struct packet_stream *ps) {
|
|
|
|
|
PS_CLEAR(ps, CONFIRMED);
|
|
|
|
|
PS_CLEAR(ps, HAS_HANDLER);
|
|
|
|
|
}
|
|
|
|
|
static void stream_unkernelize(struct packet_stream *ps) {
|
|
|
|
|
if (!ps)
|
|
|
|
|
return;
|
|
|
|
|
mutex_lock(&ps->in_lock);
|
|
|
|
|
__stream_unkernelize(ps);
|
|
|
|
|
mutex_unlock(&ps->in_lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* must be called with call->master_lock held in W */
|
|
|
|
|
static void __monologue_unkernelize(struct call_monologue *monologue) {
|
|
|
|
|
|