From cad3ca4cf947981f5cf9f08143b6d0c976775ee7 Mon Sep 17 00:00:00 2001 From: Soman K S Date: Sun, 4 Oct 2020 22:00:07 +0530 Subject: [PATCH] ospf6d : Intra area route for connected prefix not installed Issue: When ospfv3 is configured on interface between routers in different network, the intra area route for the remote connected prefix is not installed in ospf route table and zebra Fix: When the advertising router is directly connected but in different network the interface lookup in the intra area lsa processing does not provide the matching interface and valid nexthop. Therefore the nexthop is copied from the link state entry which contains valid ifindex required for installing the route. Signed-off-by: kssoman --- ospf6d/ospf6_intra.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/ospf6d/ospf6_intra.c b/ospf6d/ospf6_intra.c index 6eda9f750c..a34f8d3693 100644 --- a/ospf6d/ospf6_intra.c +++ b/ospf6d/ospf6_intra.c @@ -1368,7 +1368,7 @@ void ospf6_intra_prefix_route_ecmp_path(struct ospf6_area *oa, struct ospf6_nexthop *nh, *rnh; char buf[PREFIX2STR_BUFFER]; bool route_found = false; - struct interface *ifp; + struct interface *ifp = NULL; struct ospf6_lsa *lsa; struct ospf6_intra_prefix_lsa *intra_prefix_lsa; @@ -1571,12 +1571,20 @@ void ospf6_intra_prefix_route_ecmp_path(struct ospf6_area *oa, ifp = if_lookup_prefix( &old_route->prefix, oa->ospf6->vrf_id); - if (ifp) - ospf6_route_add_nexthop( - old_route, + } + + if (ifp) { + /* Nexthop interface found */ + ospf6_route_add_nexthop(old_route, ifp->ifindex, NULL); } else { + /* The connected interfaces between + * routers can be in different networks. + * In this case the matching interface + * is not found. Copy nexthops from the + * link state entry + */ ospf6_route_merge_nexthops(old_route, ls_entry); } @@ -1626,7 +1634,7 @@ void ospf6_intra_prefix_lsa_add(struct ospf6_lsa *lsa) struct ospf6_prefix *op; char *start, *current, *end; char buf[PREFIX2STR_BUFFER]; - struct interface *ifp; + struct interface *ifp = NULL; int direct_connect = 0; struct ospf6_path *path; @@ -1716,10 +1724,17 @@ void ospf6_intra_prefix_lsa_add(struct ospf6_lsa *lsa) if (direct_connect) { ifp = if_lookup_prefix(&route->prefix, oa->ospf6->vrf_id); - if (ifp) - ospf6_route_add_nexthop(route, ifp->ifindex, - NULL); + } + + if (ifp) { + /* Nexthop interface found */ + ospf6_route_add_nexthop(route, ifp->ifindex, NULL); } else { + /* The connected interfaces between routers can be in + * different networks. In this case the matching + * interface is not found. Copy nexthops from the + * link state entry + */ ospf6_route_copy_nexthops(route, ls_entry); } -- 2.39.5