summaryrefslogtreecommitdiff
path: root/pimd/pim_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_zebra.c')
-rw-r--r--pimd/pim_zebra.c147
1 files changed, 63 insertions, 84 deletions
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index 253ab7ab44..b2a7319bf1 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -53,7 +53,6 @@
static struct zclient *zclient = NULL;
-static int fib_lookup_if_vif_index(struct in_addr addr);
/* Router-id update message from zebra. */
static int pim_router_id_update_zebra(int command, struct zclient *zclient,
@@ -449,7 +448,28 @@ pim_scan_individual_oil (struct channel_oil *c_oil, int in_vif_index)
if (in_vif_index)
input_iface_vif_index = in_vif_index;
else
- input_iface_vif_index = fib_lookup_if_vif_index (vif_source);
+ {
+ struct prefix src, grp;
+
+ src.family = AF_INET;
+ src.prefixlen = IPV4_MAX_BITLEN;
+ src.u.prefix4 = vif_source;
+ grp.family = AF_INET;
+ grp.prefixlen = IPV4_MAX_BITLEN;
+ grp.u.prefix4 = c_oil->oil.mfcc_mcastgrp;
+
+ if (PIM_DEBUG_ZEBRA)
+ {
+ char source_str[INET_ADDRSTRLEN];
+ char group_str[INET_ADDRSTRLEN];
+ pim_inet4_dump("<source?>", c_oil->oil.mfcc_origin, source_str, sizeof(source_str));
+ pim_inet4_dump("<group?>", c_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
+ zlog_debug ("%s: channel_oil (%s, %s) upstream info is not present.",
+ __PRETTY_FUNCTION__, source_str, group_str);
+ }
+ input_iface_vif_index = pim_ecmp_fib_lookup_if_vif_index(vif_source, &src, &grp);
+ }
+
if (input_iface_vif_index < 1)
{
if (PIM_DEBUG_ZEBRA)
@@ -537,12 +557,25 @@ void pim_scan_oil()
struct listnode *node;
struct listnode *nextnode;
struct channel_oil *c_oil;
+ ifindex_t ifindex;
+ int vif_index = 0;
qpim_scan_oil_last = pim_time_monotonic_sec();
++qpim_scan_oil_events;
for (ALL_LIST_ELEMENTS(pim_channel_oil_list, node, nextnode, c_oil))
- pim_scan_individual_oil (c_oil, 0);
+ {
+ if (c_oil->up && c_oil->up->rpf.source_nexthop.interface)
+ {
+ ifindex = c_oil->up->rpf.source_nexthop.interface->ifindex;
+ vif_index = pim_if_find_vifindex_by_ifindex (ifindex);
+ /* Pass Current selected NH vif index to mroute download */
+ if (vif_index)
+ pim_scan_individual_oil (c_oil, vif_index);
+ }
+ else
+ pim_scan_individual_oil (c_oil, 0);
+ }
}
static int on_rpf_cache_refresh(struct thread *t)
@@ -679,67 +712,6 @@ void igmp_anysource_forward_stop(struct igmp_group *group)
igmp_source_forward_stop (source);
}
-static int fib_lookup_if_vif_index(struct in_addr addr)
-{
- struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM];
- int num_ifindex;
- int vif_index;
- ifindex_t first_ifindex;
-
- num_ifindex = zclient_lookup_nexthop(nexthop_tab,
- MULTIPATH_NUM, addr,
- PIM_NEXTHOP_LOOKUP_MAX);
- if (num_ifindex < 1) {
- if (PIM_DEBUG_ZEBRA)
- {
- char addr_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
- zlog_debug("%s %s: could not find nexthop ifindex for address %s",
- __FILE__, __PRETTY_FUNCTION__,
- addr_str);
- }
- return -1;
- }
-
- first_ifindex = nexthop_tab[0].ifindex;
-
- if (num_ifindex > 1) {
- if (PIM_DEBUG_ZEBRA)
- {
- char addr_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
- zlog_debug("%s %s: FIXME ignoring multiple nexthop ifindex'es num_ifindex=%d for address %s (using only ifindex=%d)",
- __FILE__, __PRETTY_FUNCTION__,
- num_ifindex, addr_str, first_ifindex);
- }
- /* debug warning only, do not return */
- }
-
- if (PIM_DEBUG_ZEBRA) {
- char addr_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<ifaddr?>", addr, addr_str, sizeof(addr_str));
- zlog_debug("%s %s: found nexthop ifindex=%d (interface %s) for address %s",
- __FILE__, __PRETTY_FUNCTION__,
- first_ifindex, ifindex2ifname(first_ifindex, VRF_DEFAULT), addr_str);
- }
-
- vif_index = pim_if_find_vifindex_by_ifindex(first_ifindex);
-
- if (vif_index < 0) {
- if (PIM_DEBUG_ZEBRA)
- {
- char addr_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
- zlog_debug("%s %s: low vif_index=%d < 1 nexthop for address %s",
- __FILE__, __PRETTY_FUNCTION__,
- vif_index, addr_str);
- }
- return -2;
- }
-
- return vif_index;
-}
-
static void
igmp_source_forward_reevaluate_one(struct igmp_source *source)
{
@@ -853,6 +825,7 @@ void igmp_source_forward_start(struct igmp_source *source)
int ret = 0;
struct pim_nexthop_cache out_pnc;
struct pim_nexthop nexthop;
+ struct pim_upstream *up = NULL;
if (!pim_rp_set_upstream_addr (&vif_source, source->source_addr, sg.grp))
return;
@@ -863,20 +836,23 @@ void igmp_source_forward_start(struct igmp_source *source)
nht_p.u.prefix4 = vif_source;
memset (&out_pnc, 0, sizeof (struct pim_nexthop_cache));
+ src.family = AF_INET;
+ src.prefixlen = IPV4_MAX_BITLEN;
+ src.u.prefix4 = vif_source; //RP or Src address
+ grp.family = AF_INET;
+ grp.prefixlen = IPV4_MAX_BITLEN;
+ grp.u.prefix4 = sg.grp;
+
if ((ret = pim_find_or_track_nexthop (&nht_p, NULL, NULL, &out_pnc)) == 1)
{
if (out_pnc.nexthop_num)
{
- src.family = AF_INET;
- src.prefixlen = IPV4_MAX_BITLEN;
- src.u.prefix4 = vif_source; //RP or Src address
- grp.family = AF_INET;
- grp.prefixlen = IPV4_MAX_BITLEN;
- grp.u.prefix4 = sg.grp;
- memset (&nexthop, 0, sizeof (nexthop));
+ up = pim_upstream_find (&sg);
+ memset (&nexthop, 0, sizeof (struct pim_nexthop));
+ if (up)
+ memcpy (&nexthop, &up->rpf.source_nexthop, sizeof (struct pim_nexthop));
//Compute PIM RPF using Cached nexthop
- pim_ecmp_nexthop_search (&out_pnc, &nexthop,
- &src, &grp, 0);
+ pim_ecmp_nexthop_search (&out_pnc, &nexthop, &src, &grp, 0);
if (nexthop.interface)
input_iface_vif_index = pim_if_find_vifindex_by_ifindex (nexthop.interface->ifindex);
}
@@ -894,7 +870,7 @@ void igmp_source_forward_start(struct igmp_source *source)
}
}
else
- input_iface_vif_index = fib_lookup_if_vif_index(vif_source);
+ input_iface_vif_index = pim_ecmp_fib_lookup_if_vif_index(vif_source, &src, &grp);
if (PIM_DEBUG_ZEBRA)
{
@@ -1075,7 +1051,6 @@ void pim_forward_start(struct pim_ifchannel *ch)
struct prefix nht_p, src, grp;
int ret = 0;
struct pim_nexthop_cache out_pnc;
- struct pim_nexthop nexthop;
/* Register addr with Zebra NHT */
nht_p.family = AF_INET;
@@ -1086,8 +1061,7 @@ void pim_forward_start(struct pim_ifchannel *ch)
grp.u.prefix4 = up->sg.grp;
memset (&out_pnc, 0, sizeof (struct pim_nexthop_cache));
- if ((ret =
- pim_find_or_track_nexthop (&nht_p, NULL, NULL, &out_pnc)) == 1)
+ if ((ret = pim_find_or_track_nexthop (&nht_p, NULL, NULL, &out_pnc)) == 1)
{
if (out_pnc.nexthop_num)
{
@@ -1097,11 +1071,14 @@ void pim_forward_start(struct pim_ifchannel *ch)
grp.family = AF_INET;
grp.prefixlen = IPV4_MAX_BITLEN;
grp.u.prefix4 = up->sg.grp;
- memset (&nexthop, 0, sizeof (nexthop));
//Compute PIM RPF using Cached nexthop
- pim_ecmp_nexthop_search (&out_pnc, &nexthop, &src, &grp, 0);
- input_iface_vif_index =
- pim_if_find_vifindex_by_ifindex (nexthop.interface->ifindex);
+ if (pim_ecmp_nexthop_search (&out_pnc, &up->rpf.source_nexthop, &src, &grp, 0) == 0)
+ input_iface_vif_index = pim_if_find_vifindex_by_ifindex (up->rpf.source_nexthop.interface->ifindex);
+ else
+ {
+ if (PIM_DEBUG_TRACE)
+ zlog_debug ("%s: Nexthop selection failed for %s ", __PRETTY_FUNCTION__, up->sg_str);
+ }
}
else
{
@@ -1117,7 +1094,7 @@ void pim_forward_start(struct pim_ifchannel *ch)
}
}
else
- input_iface_vif_index = fib_lookup_if_vif_index (up->upstream_addr);
+ input_iface_vif_index = pim_ecmp_fib_lookup_if_vif_index(up->upstream_addr, &src, &grp);
if (input_iface_vif_index < 1)
{
@@ -1133,8 +1110,10 @@ void pim_forward_start(struct pim_ifchannel *ch)
}
if (PIM_DEBUG_TRACE)
{
- zlog_debug ("%s: NHT entry %s update channel_oil vif_index %d ",
- __PRETTY_FUNCTION__, up->sg_str, input_iface_vif_index);
+ struct interface *in_intf = pim_if_find_by_vif_index (input_iface_vif_index);
+ zlog_debug ("%s: Update channel_oil IIF %s VIFI %d entry %s ",
+ __PRETTY_FUNCTION__, in_intf ? in_intf->name : "NIL",
+ input_iface_vif_index, up->sg_str);
}
up->channel_oil = pim_channel_oil_add (&up->sg, input_iface_vif_index);
if (!up->channel_oil)