Holger Hans Peter Freyther wrote:
+ if (errno == 111)
again, please use fewer magic numbers. Use ECONNREFUSED then.
>+ DEBUGPC(DLMUX, "Read of RTP socket (%p) failed (errno %d)\n",
>+ rs, errno);
Please consider using strerror next to the errno
ok, here it is.
>From d401f6da5a3c2ebf58b79bbb26ae743c0e560cdc Mon Sep 17 00:00:00 2001
From: Andreas Eversberg <[email protected]>
Date: Fri, 16 Mar 2012 08:14:23 +0100
Subject: [PATCH 9/9] Fixed problem of mute audio on some calls
When reading from RTP socket, the first read() may fail right after
connecting to remote socket. Subsequent read() will work as it should.
If the remote socket does not open fast enough, the transmitted RTP
payload can cause an ICMP (connection refused) packet reply. This causes
the read to fail with errno=111. In all other error cases, the errno is
logged at debug level. In all error cases, reading is not disabled.
---
openbsc/src/libtrau/rtp_proxy.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/openbsc/src/libtrau/rtp_proxy.c b/openbsc/src/libtrau/rtp_proxy.c
index 88753b6..23d0d1d 100644
--- a/openbsc/src/libtrau/rtp_proxy.c
+++ b/openbsc/src/libtrau/rtp_proxy.c
@@ -503,9 +503,16 @@ static int rtp_socket_read(struct rtp_socket *rs, struct rtp_sub_socket *rss)
return -ENOMEM;
rc = read(rss->bfd.fd, msg->data, RTP_ALLOC_SIZE);
- if (rc <= 0) {
- rss->bfd.when &= ~BSC_FD_READ;
- return rc;
+ if (rc == 0)
+ goto out_free;
+ if (rc < 0) {
+ /* Ignore "connection refused". this happens, If we open the
+ * socket faster than the remove side. */
+ if (errno == ECONNREFUSED)
+ goto out_free;
+ DEBUGPC(DLMUX, "Read of RTP socket (%p) failed (errno %d, "
+ "%s)\n", rs, errno, strerror(errno));
+ goto out_free;
}
msgb_put(msg, rc);
--
1.8.1.5