summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorajs <ajs>2005-02-17 19:55:59 +0000
committerajs <ajs>2005-02-17 19:55:59 +0000
commit038163fa87d5b41503c721bb097faea6b25661c9 (patch)
tree6fac5c09747630ae88ba88c3b925d21b24cbcb39
parent52e66296f236cdda751e4206ad3d39c56e53f0fd (diff)
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.
-rw-r--r--ospfd/ChangeLog8
-rw-r--r--ospfd/ospf_packet.c25
2 files changed, 26 insertions, 7 deletions
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index c6607e0c..9737854a 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 58369250..038fd657 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -2043,7 +2043,7 @@ ospf_ls_ack (struct ip *iph, struct ospf_header *ospfh,
#endif /* HAVE_OPAQUE_LSA */
}
-struct stream *
+static struct stream *
ospf_recv_packet (int fd, struct interface **ifp)
{
int ret;
@@ -2062,12 +2062,24 @@ ospf_recv_packet (int fd, struct interface **ifp)
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 @@ ospf_read (struct thread *thread)
/* 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 @@ ospf_read (struct thread *thread)
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))