diff options
author | ajs <ajs> | 2005-02-17 19:55:59 +0000 |
---|---|---|
committer | ajs <ajs> | 2005-02-17 19:55:59 +0000 |
commit | 038163fa87d5b41503c721bb097faea6b25661c9 (patch) | |
tree | 6fac5c09747630ae88ba88c3b925d21b24cbcb39 | |
parent | 52e66296f236cdda751e4206ad3d39c56e53f0fd (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/ChangeLog | 8 | ||||
-rw-r--r-- | ospfd/ospf_packet.c | 25 |
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)) |