]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospfd: Allow unnumbered and numbered addresses to co-exist better 12282/head
authorDonald Sharp <sharpd@nvidia.com>
Wed, 12 Oct 2022 20:05:23 +0000 (16:05 -0400)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Tue, 8 Nov 2022 11:51:12 +0000 (11:51 +0000)
When forming a neighbor relationship on an interface, ospf is
currently evaluating unnumbered as highest priority, without
any consideration for if you have /32's and non /32's on the
interface.  Effectively if I have something like this:

int foo0
  ip address 192.168.119.1/24
!
router ospf
  network 0.0.0.0/0 area 0
!

ospf will form a neighbor on foo0 if it exists.  Now
suppose someone does this:

int foo0
  ip address 192.168.120.1/32

This will create the unnumbered interface on foo0 and
the peering will come down immediately.

The problem here is that the original designers of the unnumbered
code for ospf didn't envision end operators mixing and matching
addresses on an interface like this ( for perfectly legitimate
reasons I might add ).

So if ospf has both numbered and unnumbered let's match against
the numbered first and then unnumbered.  This solves the problem

Fixes: #6823
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
(cherry picked from commit 5136e6729464c57353be1ad4a55fcbdbbfc7779d)

ospfd/ospf_interface.c

index 646d3183627df87bb912f285023ee12198e7e371..a0b14e73ee995ffe92162644b96af3fca238f4ef 100644 (file)
@@ -461,13 +461,13 @@ struct ospf_interface *ospf_if_lookup_recv_if(struct ospf *ospf,
 {
        struct route_node *rn;
        struct prefix_ipv4 addr;
-       struct ospf_interface *oi, *match;
+       struct ospf_interface *oi, *match, *unnumbered_match;
 
        addr.family = AF_INET;
        addr.prefix = src;
        addr.prefixlen = IPV4_MAX_BITLEN;
 
-       match = NULL;
+       match = unnumbered_match = NULL;
 
        for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) {
                oi = rn->info;
@@ -482,7 +482,7 @@ struct ospf_interface *ospf_if_lookup_recv_if(struct ospf *ospf,
                        continue;
 
                if (CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED))
-                       match = oi;
+                       unnumbered_match = oi;
                else if (prefix_match(CONNECTED_PREFIX(oi->connected),
                                      (struct prefix *)&addr)) {
                        if ((match == NULL) || (match->address->prefixlen
@@ -491,7 +491,10 @@ struct ospf_interface *ospf_if_lookup_recv_if(struct ospf *ospf,
                }
        }
 
-       return match;
+       if (match)
+               return match;
+
+       return unnumbered_match;
 }
 
 void ospf_interface_fifo_flush(struct ospf_interface *oi)