From: Jonathan Hart <j...@onlab.us>

I was running in to a bug when pimd would hang in some cases when
it had to do a nexthop lookup from zebra, such as when a PIM JOIN
was received. This issue could be easily reproduced by running
'show ip rib <ip>' from the pimd vty which forces a nexthop lookup.

The issue is in zclient_read_nexthop, the zclient_read_header function
reads the message content into the stream, but then after that the
zclient_read_nexthop function tries to read the message content again
from the socket, but there are no bytes so it hangs waiting for input.
The solution is to not try to read the message content the second time.
---
 pimd/pim_zlookup.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c
index b5b219e..770fbf7 100644
--- a/pimd/pim_zlookup.c
+++ b/pimd/pim_zlookup.c
@@ -155,7 +155,6 @@ static int zclient_read_nexthop(struct zclient *zlookup,
   u_char version;
   uint16_t vrf_id;
   uint16_t command;
-  int nbytes;
   struct in_addr raddr;
   uint8_t distance;
   uint32_t metric;
@@ -189,14 +188,6 @@ static int zclient_read_nexthop(struct zclient *zlookup,
     return -2;
   }
   
-  nbytes = stream_read(s, zlookup->sock, length);
-  if (nbytes < length) {
-    zlog_err("%s %s: failure reading zclient lookup socket: nbytes=%d < 
len=%d",
-            __FILE__, __PRETTY_FUNCTION__, nbytes, length);
-    zclient_lookup_failed(zlookup);
-    return -3;
-  }
-
   if (command != ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB) {
     zlog_err("%s: socket %d command mismatch: %d",
             __func__, zlookup->sock, command);
-- 
2.1.0


_______________________________________________
Quagga-dev mailing list
Quagga-dev@lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to