]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: Drop packet received on multiple interfaces due to the time gap in binding...
authorAmritha Nambiar <amritha.nambiar@intel.com>
Wed, 14 Oct 2015 05:08:46 +0000 (22:08 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 30 Mar 2016 00:26:08 +0000 (20:26 -0400)
Due to the time window between opening socket and binding it to an interface, the same hello
packet is delivered on multiple interfaces, unique socket per circuit is not yet established.
When such hellos get processed, they form incorrect adjacencies. So, drop the packet that is
received on multiple interfaces because the socket for the circuit is yet to bind to an interface.

V2: Fix warning on sign comparison

Signed-off-by: Amritha Nambiar <amritha.nambiar@intel.com>
isisd/isis_pfpacket.c

index d91d9888585b02ff26c424525fb92d2b1c7fb800..1bc5f763cd11badcf2d02d3285b0e9564f174b2d 100644 (file)
@@ -230,12 +230,24 @@ isis_recv_pdu_bcast (struct isis_circuit *circuit, u_char * ssnpa)
                        LLC_LEN, MSG_PEEK,
                        (struct sockaddr *) &s_addr, (socklen_t *) &addr_len);
 
-  if (bytesread < 0)
+  if ((bytesread < 0) || (s_addr.sll_ifindex != (int)circuit->interface->ifindex))
     {
-      zlog_warn ("isis_recv_packet_bcast(): ifname %s, fd %d, bytesread %d, "
-                 "recvfrom(): %s",
-                 circuit->interface->name, circuit->fd, bytesread,
-                 safe_strerror (errno));
+      if (bytesread < 0)
+        {
+          zlog_warn ("isis_recv_packet_bcast(): ifname %s, fd %d, "
+                     "bytesread %d, recvfrom(): %s",
+                     circuit->interface->name, circuit->fd, bytesread,
+                     safe_strerror (errno));
+        }
+      if (s_addr.sll_ifindex != (int)circuit->interface->ifindex)
+        {
+          zlog_warn("packet is received on multiple interfaces: "
+                    "socket interface %d, circuit interface %d, "
+                    "packet type %u",
+                    s_addr.sll_ifindex, circuit->interface->ifindex,
+                    s_addr.sll_pkttype);
+        }
+
       /* get rid of the packet */
       bytesread = recvfrom (circuit->fd, discard_buff, sizeof (discard_buff),
                             MSG_DONTWAIT, (struct sockaddr *) &s_addr,