2005-02-17 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

	* ospf_packet.c: (ospf_recv_packet) If there is somehow a runt
	  packet in the queue, it must be discarded.  Improve warning messages.
	  Fix scope to static.
	  (ospf_read) Fix bug: should reset the read thread in all cases
	  to make sure we continue to get incoming messages.
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index c6607e0..9737854 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,3 +1,11 @@
+2005-02-17 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+	* ospf_packet.c: (ospf_recv_packet) If there is somehow a runt
+	  packet in the queue, it must be discarded.  Improve warning messages.
+	  Fix scope to static.
+	  (ospf_read) Fix bug: should reset the read thread in all cases
+	  to make sure we continue to get incoming messages.
+
 2005-02-15 Paul Jakma <paul.jakma@sun.com>
 
 	* ospf_packet.c: (ospf_recv_packet) Fix silly error wrt allocating
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index 5836925..038fd65 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -2043,7 +2043,7 @@
 #endif /* HAVE_OPAQUE_LSA */
 }
 
-struct stream *
+static struct stream *
 ospf_recv_packet (int fd, struct interface **ifp)
 {
   int ret;
@@ -2062,12 +2062,24 @@
   msgh.msg_control = (caddr_t) buff;
   msgh.msg_controllen = sizeof (buff);
   
+  /* XXX Is there an upper limit on the size of these packets?  If there is,
+     it would be more efficient to read the whole packet in one shot without
+     peeking (this would cut down from 2 system calls to 1).  And this would
+     make the error-handling logic a bit more robust. */
   ret = recvfrom (fd, (void *)&iph, sizeof (iph), MSG_PEEK, NULL, 0);
   
   if (ret != sizeof (iph))
     {
-      zlog_warn ("ospf_recv_packet packet smaller than ip header");
-      /* XXX: We peeked, and thus perhaps should discard this packet. */
+      if (ret > 0)
+        {
+	  zlog_warn("ospf_recv_packet: discarding runt packet of length %d "
+		    "(ip header size is %u)",
+		    ret, (u_int)sizeof(iph));
+	  recvfrom (fd, (void *)&iph, ret, 0, NULL, 0);
+        }
+      else
+	zlog_warn("ospf_recv_packet: recvfrom returned %d: %s",
+		  ret, safe_strerror(errno));
       return NULL;
     }
   
@@ -2354,7 +2366,9 @@
 
   /* first of all get interface pointer. */
   ospf = THREAD_ARG (thread);
-  ospf->t_read = NULL;
+
+  /* prepare for next packet. */
+  ospf->t_read = thread_add_read (master, ospf_read, ospf, ospf->fd);
 
   /* read OSPF packet. */
   ibuf = ospf_recv_packet (ospf->fd, &ifp);
@@ -2375,9 +2389,6 @@
       stream_free (ibuf);
       return 0;
     }
-  
-  /* prepare for next packet. */
-  ospf->t_read = thread_add_read (master, ospf_read, ospf, ospf->fd);
 
   /* IP Header dump. */
     if (IS_DEBUG_OSPF_PACKET(0, RECV))