[quagga-dev 10026] [PATCH 6/7] isisd: always join all IS-IS multicast groups

David Lamparter equinox at opensourcerouting.org
Tue Nov 27 02:10:29 GMT 2012


The socket is only created once when an interface is brought up, and the
multicast groups were joined according to configuration at that point.
This breaks when later switching an interface to another IS-IS level.

Since, for a separate conformance issue (ANVL ISIS-6.4), we should be
inspecting the destination address anyway, the simplest fix here is to
just join all groups unconditionally.  There shouldn't be much traffic
on these anyway, worst case we might be picking up some unrelated
multicast groups due to NIC filter aliasing though...

Signed-off-by: David Lamparter <equinox at opensourcerouting.org>
Tested-by: Martin Winter <mwinter at opensourcerouting.org>
---
 isisd/isis_dlpi.c     |   10 +++-------
 isisd/isis_pfpacket.c |   12 +++++-------
 2 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/isisd/isis_dlpi.c b/isisd/isis_dlpi.c
index 73b6d3e..0a82718 100644
--- a/isisd/isis_dlpi.c
+++ b/isisd/isis_dlpi.c
@@ -442,13 +442,9 @@ open_dlpi_dev (struct isis_circuit *circuit)
    * 8.4.2 - Broadcast subnetwork IIH PDUs
    */
   retval = 0;
-  if (circuit->is_type & IS_LEVEL_1)
-    {
-      retval |= dlpimcast (fd, ALL_L1_ISS);
-      retval |= dlpimcast (fd, ALL_ISS);
-    }
-  if (circuit->is_type & IS_LEVEL_2)
-    retval |= dlpimcast (fd, ALL_L2_ISS);
+  retval |= dlpimcast (fd, ALL_L1_ISS);
+  retval |= dlpimcast (fd, ALL_ISS);
+  retval |= dlpimcast (fd, ALL_L2_ISS);
 
   if (retval != 0)
     {
diff --git a/isisd/isis_pfpacket.c b/isisd/isis_pfpacket.c
index 42947b2..e5589ae 100644
--- a/isisd/isis_pfpacket.c
+++ b/isisd/isis_pfpacket.c
@@ -142,16 +142,14 @@ open_packet_socket (struct isis_circuit *circuit)
        * 8.4.2 - Broadcast subnetwork IIH PDUs
        * FIXME: is there a case only one will fail??
        */
-      if (circuit->is_type & IS_LEVEL_1)
-        /* joining ALL_L1_ISS */
-        retval = isis_multicast_join (circuit->fd, 1,
+      /* joining ALL_L1_ISS */
+      retval |= isis_multicast_join (circuit->fd, 1,
                                       circuit->interface->ifindex);
-      if (circuit->is_type & IS_LEVEL_2)
-        /* joining ALL_L2_ISS */
-        retval = isis_multicast_join (circuit->fd, 2,
+      /* joining ALL_L2_ISS */
+      retval |= isis_multicast_join (circuit->fd, 2,
                                       circuit->interface->ifindex);
       /* joining ALL_ISS (used in RFC 5309 p2p-over-lan as well) */
-      retval = isis_multicast_join (circuit->fd, 3,
+      retval |= isis_multicast_join (circuit->fd, 3,
                                     circuit->interface->ifindex);
     }
   else
-- 
1.7.8.6




More information about the Quagga-dev mailing list