diff options
Diffstat (limited to 'zebra/zebra_rib.c')
| -rw-r--r-- | zebra/zebra_rib.c | 101 |
1 files changed, 22 insertions, 79 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index fc3f57eeb8..6c499b77d7 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -509,31 +509,28 @@ struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id, return NULL; } -struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, - struct in_addr addr, - struct route_node **rn_out) +struct route_entry *rib_match_multicast(afi_t afi, vrf_id_t vrf_id, + union g_addr *gaddr, + struct route_node **rn_out) { struct route_entry *re = NULL, *mre = NULL, *ure = NULL; struct route_node *m_rn = NULL, *u_rn = NULL; - union g_addr gaddr = {.ipv4 = addr}; switch (zrouter.ipv4_multicast_mode) { case MCAST_MRIB_ONLY: - return rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, - rn_out); + return rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, rn_out); case MCAST_URIB_ONLY: - return rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, rn_out); + return rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, rn_out); case MCAST_NO_CONFIG: case MCAST_MIX_MRIB_FIRST: - re = mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, - &m_rn); + re = mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn); if (!mre) - re = ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, - &gaddr, &u_rn); + re = ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, + &u_rn); break; case MCAST_MIX_DISTANCE: - mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); + mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn); + ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, &u_rn); if (mre && ure) re = ure->distance < mre->distance ? ure : mre; else if (mre) @@ -542,8 +539,8 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, re = ure; break; case MCAST_MIX_PFXLEN: - mre = rib_match(AFI_IP, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); + mre = rib_match(afi, SAFI_MULTICAST, vrf_id, gaddr, &m_rn); + ure = rib_match(afi, SAFI_UNICAST, vrf_id, gaddr, &u_rn); if (mre && ure) re = u_rn->p.prefixlen > m_rn->p.prefixlen ? ure : mre; else if (mre) @@ -558,10 +555,12 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, if (IS_ZEBRA_DEBUG_RIB) { char buf[BUFSIZ]; - inet_ntop(AF_INET, &addr, buf, BUFSIZ); + inet_ntop(afi == AFI_IP ? AF_INET : AF_INET6, gaddr, buf, + BUFSIZ); - zlog_debug("%s: %s: vrf: %s(%u) found %s, using %s", __func__, - buf, vrf_id_to_name(vrf_id), vrf_id, + zlog_debug("%s: %s: %pRN vrf: %s(%u) found %s, using %s", + __func__, buf, (re == mre) ? m_rn : u_rn, + vrf_id_to_name(vrf_id), vrf_id, mre ? (ure ? "MRIB+URIB" : "MRIB") : ure ? "URIB" : "nothing", re == ure ? "URIB" : re == mre ? "MRIB" : "none"); @@ -569,62 +568,6 @@ struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id, return re; } -struct route_entry *rib_match_ipv6_multicast(vrf_id_t vrf_id, - struct in6_addr addr, - struct route_node **rn_out) -{ - struct route_entry *re = NULL, *mre = NULL, *ure = NULL; - struct route_node *m_rn = NULL, *u_rn = NULL; - union g_addr gaddr = {.ipv6 = addr}; - - switch (zrouter.ipv4_multicast_mode) { - case MCAST_MRIB_ONLY: - return rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, - rn_out); - case MCAST_URIB_ONLY: - return rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, rn_out); - case MCAST_NO_CONFIG: - case MCAST_MIX_MRIB_FIRST: - re = mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, - &m_rn); - if (!mre) - re = ure = rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, - &gaddr, &u_rn); - break; - case MCAST_MIX_DISTANCE: - mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); - if (mre && ure) - re = ure->distance < mre->distance ? ure : mre; - else if (mre) - re = mre; - else if (ure) - re = ure; - break; - case MCAST_MIX_PFXLEN: - mre = rib_match(AFI_IP6, SAFI_MULTICAST, vrf_id, &gaddr, &m_rn); - ure = rib_match(AFI_IP6, SAFI_UNICAST, vrf_id, &gaddr, &u_rn); - if (mre && ure) - re = u_rn->p.prefixlen > m_rn->p.prefixlen ? ure : mre; - else if (mre) - re = mre; - else if (ure) - re = ure; - break; - } - - if (rn_out) - *rn_out = (re == mre) ? m_rn : u_rn; - - if (IS_ZEBRA_DEBUG_RIB) - zlog_debug("%s: %pI6: vrf: %s(%u) found %s, using %s", __func__, - &addr, vrf_id_to_name(vrf_id), vrf_id, - mre ? (ure ? "MRIB+URIB" : "MRIB") - : ure ? "URIB" : "nothing", - re == ure ? "URIB" : re == mre ? "MRIB" : "none"); - return re; -} - struct route_entry *rib_lookup_ipv4(struct prefix_ipv4 *p, vrf_id_t vrf_id) { struct route_table *table; @@ -3924,7 +3867,9 @@ static void rib_link(struct route_node *rn, struct route_entry *re, int process) rmap_name = zebra_get_import_table_route_map(afi, re->table); zebra_add_import_table_entry(zvrf, rn, re, rmap_name); - } else if (process) + } + + if (process) rib_queue_add(rn); } @@ -3999,11 +3944,9 @@ void rib_delnode(struct route_node *rn, struct route_entry *re) zlog_debug("%s(%u):%pRN: Freeing route rn %p, re %p (%s)", vrf_id_to_name(re->vrf_id), re->vrf_id, rn, rn, re, zebra_route_string(re->type)); - - rib_unlink(rn, re); - } else { - rib_queue_add(rn); } + + rib_queue_add(rn); } /* |
