]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
recvbuff.c, recvbuff.h, ntp_io.c, ChangeLog:
authorFrank Kardel <kardel@ntp.org>
Sun, 17 Feb 2008 07:31:29 +0000 (07:31 +0000)
committerFrank Kardel <kardel@ntp.org>
Sun, 17 Feb 2008 07:31:29 +0000 (07:31 +0000)
  Bug 1000: Potentially insufficient number of receive buffers at startup

bk: 47b7e2d1NrDhKFJTAI5thhil8SEErQ

ChangeLog
include/recvbuff.h
libntp/recvbuff.c
ntpd/ntp_io.c

index c57ac210b0086b35663bfdadfc8ba97c3d9c2245..5200f65d417c0f2a2dd9b814dd1a0b834c0ea853 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+* [Bug 1000] allow implicit receive buffer allocation for Windows
+            fixes startup for windows systems with many interfaces
+            reduces dropped packets on network bursts
 ---
 (4.2.4p4) Released by Harlan Stenn <stenn@ntp.org>
 
index 5feadc975b6c953b2dd8e55320e2411d8ff6ee9b..771b90b94a880e45a2df5f744d868ee507681f19 100644 (file)
@@ -94,7 +94,8 @@ extern        void    freerecvbuf P((struct recvbuf *));
  *  The buffer is removed from the free list. Make sure
  *  you put it back with freerecvbuf() or 
  */
-extern struct recvbuf *get_free_recv_buffer P((void));
+extern struct recvbuf *get_free_recv_buffer P((void)); /* signal safe - no malloc */
+extern struct recvbuf *get_free_recv_buffer_alloc P((void)); /* signal unsafe - may malloc */
 
 /*   Add a buffer to the full list
  */
index 9511c8fe50fce86ab33f9ccde13e0424fd8acfeb..037d50e0e2965fc4a9f2fd17dccfc1fe42173c8f 100644 (file)
@@ -19,7 +19,8 @@ static u_long volatile full_recvbufs; /* number of recvbufs on fulllist */
 static u_long volatile free_recvbufs;  /* number of recvbufs on freelist */
 static u_long volatile total_recvbufs; /* total recvbufs currently in use */
 static u_long volatile lowater_adds;   /* number of times we have added memory */
-
+static u_long volatile buffer_shortfall;/* number of missed free receive buffers
+                                           between replenishments */
 
 static ISC_LIST(recvbuf_t)     full_recv_list; /* Currently used recv buffers */
 static ISC_LIST(recvbuf_t)     free_recv_list; /* Currently unused buffers */
@@ -74,19 +75,25 @@ initialise_buffer(recvbuf_t *buff)
 #endif
 }
 
-static int
+static void
 create_buffers(int nbufs)
 {
        register recvbuf_t *bufp;
-       int i;
+       int i, abuf;
+
+       abuf = nbufs + buffer_shortfall;
+       buffer_shortfall = 0;
 
-       bufp = (recvbuf_t *) emalloc(nbufs*sizeof(recvbuf_t));
+       bufp = (recvbuf_t *) emalloc(abuf*sizeof(recvbuf_t));
        /*
         * If no memory available, Bail
         */
        if (bufp == NULL)
-               return (0);
-       for (i = 0; i < nbufs; i++)
+       {
+               msyslog(LOG_ERR, "no more memory for receive buffers");
+       }
+
+       for (i = 0; i < abuf; i++)
        {
                memset((char *) bufp, 0, sizeof(recvbuf_t));
                ISC_LIST_APPEND(free_recv_list, bufp, link);
@@ -95,7 +102,6 @@ create_buffers(int nbufs)
                total_recvbufs++;
        }
        lowater_adds++;
-       return (nbufs);
 }
 
 void
@@ -169,10 +175,26 @@ get_free_recv_buffer(void)
                initialise_buffer(buffer);
                (buffer->used)++;
        }
+       else
+       {
+               buffer_shortfall++;
+       }
        UNLOCK();
        return (buffer);
 }
 
+recvbuf_t *
+get_free_recv_buffer_alloc(void)
+{
+       recvbuf_t * buffer = get_free_recv_buffer();
+       if (buffer != NULL)
+       {
+               create_buffers(RECV_INC);
+               buffer = get_free_recv_buffer();
+       }
+       return (buffer);
+}
+
 recvbuf_t *
 get_full_recv_buffer(void)
 {
@@ -192,10 +214,7 @@ get_full_recv_buffer(void)
                /*
                 * try to get us some more buffers
                 */
-               if (create_buffers(RECV_INC) <= 0)
-               {
-                       msyslog(LOG_ERR, "No more memory for recvufs");
-               }
+               create_buffers(RECV_INC);
        }
 
        /*
index ae0208ae1806576f374cbbcab7a9e4ca4726ea35..8ad84f752400303eff5516bef852d8951603cfba 100644 (file)
@@ -479,7 +479,7 @@ init_io(void)
 #ifdef SYS_WINNT
        if (!Win32InitSockets())
        {
-               netsyslog(LOG_ERR, "No useable winsock.dll: %m");
+netsyslog(LOG_ERR, "No useable winsock.dll: %m");
                exit(1);
        }
        init_transmitbuff();
@@ -2451,7 +2451,11 @@ open_socket(
 /*
  * Add the socket to the completion port
  */
-       io_completion_port_add_socket(fd, interf);
+       if (io_completion_port_add_socket(fd, interf))
+       {
+               msyslog(LOG_ERR, "unable to set up io completion port - EXITING");
+               exit(1);
+       }
 #endif
        return fd;
 }