[vlc-commits] udp: use more reasonable default buffer size (fixes #16315)

Rémi Denis-Courmont git at videolan.org
Sun Apr 17 21:14:06 CEST 2016


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jan 31 19:30:35 2016 +0200| [256919fcff9dabe84c35435f315fac2d42219cb6] | committer: Rémi Denis-Courmont

udp: use more reasonable default buffer size (fixes #16315)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=256919fcff9dabe84c35435f315fac2d42219cb6
---

 modules/access/udp.c |   31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/modules/access/udp.c b/modules/access/udp.c
index d860fb4..f1f4047 100644
--- a/modules/access/udp.c
+++ b/modules/access/udp.c
@@ -48,8 +48,6 @@
 #endif
 #include <fcntl.h>
 
-#define MTU 65535
-
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
@@ -80,6 +78,7 @@ struct access_sys_t
 {
     int fd;
     int timeout;
+    size_t mtu;
     size_t fifo_size;
     block_fifo_t *fifo;
     vlc_sem_t semaphore;
@@ -185,6 +184,7 @@ static int Open( vlc_object_t *p_this )
         goto error;
     }
 
+    sys->mtu = 7 * 188;
     sys->fifo_size = var_InheritInteger( p_access, "udp-buffer");
     vlc_sem_init( &sys->semaphore, 0 );
 
@@ -287,7 +287,7 @@ static void* ThreadRead( void *data )
 
     for(;;)
     {
-        block_t *pkt = block_Alloc(MTU);
+        block_t *pkt = block_Alloc(sys->mtu);
         if (unlikely(pkt == NULL))
         {   /* OOM - dequeue and discard one packet */
             char dummy;
@@ -295,6 +295,17 @@ static void* ThreadRead( void *data )
             continue;
         }
 
+        struct iovec iov = {
+            .iov_base = pkt->p_buffer,
+            .iov_len = sys->mtu,
+        };
+        struct msghdr msg = {
+            .msg_iov = &iov,
+            .msg_iovlen = 1,
+#ifdef __linux__
+            .msg_flags = MSG_TRUNC,
+#endif
+        };
         ssize_t len;
 
         block_cleanup_push(pkt);
@@ -316,12 +327,22 @@ static void* ThreadRead( void *data )
                 len=0;
                 break;
             }
-            len = recv(sys->fd, pkt->p_buffer, MTU, 0);
+            len = recvmsg(sys->fd, &msg, 0);
         }
         while (len == -1);
         vlc_cleanup_pop();
 
-        pkt->i_buffer = len;
+#ifdef MSG_TRUNC
+        if (msg.msg_flags & MSG_TRUNC)
+        {
+            msg_Err(access, "%zd bytes packet truncated (MTU was %zu)",
+                    len, sys->mtu);
+            pkt->i_flags |= BLOCK_FLAG_CORRUPTED;
+            sys->mtu = len;
+        }
+        else
+#endif
+            pkt->i_buffer = len;
 
         vlc_fifo_Lock(sys->fifo);
         /* Discard old buffers on overflow */



More information about the vlc-commits mailing list