diff options
| -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))  | 
