diff options
Diffstat (limited to 'pimd/pim_zebra.c')
| -rw-r--r-- | pimd/pim_zebra.c | 146 |
1 files changed, 22 insertions, 124 deletions
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 1db6616c58..ad4ef64eda 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -45,6 +45,7 @@ #include "pim_rp.h" #include "pim_igmpv3.h" #include "pim_jp_agg.h" +#include "pim_nht.h" #undef PIM_DEBUG_IFADDR_DUMP #define PIM_DEBUG_IFADDR_DUMP @@ -375,8 +376,8 @@ static void scan_upstream_rpf_cache() old.source_nexthop.interface = up->rpf.source_nexthop.interface; old.source_nexthop.nbr = up->rpf.source_nexthop.nbr; - rpf_result = pim_rpf_update(up, &old); - zlog_debug ("Looking at upstream: %s %d", up->sg_str, rpf_result); + rpf_result = pim_rpf_update(up, &old, 0); + if (rpf_result == PIM_RPF_FAILURE) continue; @@ -444,7 +445,7 @@ static void scan_upstream_rpf_cache() } void -pim_scan_individual_oil (struct channel_oil *c_oil) +pim_scan_individual_oil (struct channel_oil *c_oil, int in_vif_index) { struct in_addr vif_source; int input_iface_vif_index; @@ -453,7 +454,10 @@ pim_scan_individual_oil (struct channel_oil *c_oil) if (!pim_rp_set_upstream_addr (&vif_source, c_oil->oil.mfcc_origin, c_oil->oil.mfcc_mcastgrp)) return; - input_iface_vif_index = fib_lookup_if_vif_index (vif_source); + if (in_vif_index) + input_iface_vif_index = in_vif_index; + else + input_iface_vif_index = fib_lookup_if_vif_index (vif_source); if (input_iface_vif_index < 1) { if (PIM_DEBUG_ZEBRA) @@ -548,7 +552,7 @@ void pim_scan_oil() ++qpim_scan_oil_events; for (ALL_LIST_ELEMENTS(pim_channel_oil_list, node, nextnode, c_oil)) - pim_scan_individual_oil (c_oil); + pim_scan_individual_oil (c_oil, 0); } static int on_rpf_cache_refresh(struct thread *t) @@ -594,124 +598,11 @@ void sched_rpf_cache_refresh(void) 0, qpim_rpf_cache_refresh_delay_msec); } -static int redist_read_ipv4_route(int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +static int +pim_zebra_nexthop_update (int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct stream *s; - struct zapi_ipv4 api; - ifindex_t ifindex; - struct in_addr nexthop; - struct prefix_ipv4 p; - int min_len = 4; - - if (length < min_len) { - zlog_warn("%s %s: short buffer: length=%d min=%d", - __FILE__, __PRETTY_FUNCTION__, - length, min_len); - return -1; - } - - s = zclient->ibuf; - ifindex = 0; - nexthop.s_addr = 0; - - /* Type, flags, message. */ - api.type = stream_getc(s); - api.instance = stream_getw (s); - api.flags = stream_getl(s); - api.message = stream_getc(s); - - /* IPv4 prefix length. */ - memset(&p, 0, sizeof(struct prefix_ipv4)); - p.family = AF_INET; - p.prefixlen = stream_getc(s); - - min_len += - PSIZE(p.prefixlen) + - CHECK_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP) ? 5 : 0 + - CHECK_FLAG(api.message, ZAPI_MESSAGE_IFINDEX) ? 5 : 0 + - CHECK_FLAG(api.message, ZAPI_MESSAGE_DISTANCE) ? 1 : 0 + - CHECK_FLAG(api.message, ZAPI_MESSAGE_METRIC) ? 4 : 0; - - if (PIM_DEBUG_ZEBRA) { - zlog_debug("%s %s: length=%d min_len=%d flags=%s%s%s%s", - __FILE__, __PRETTY_FUNCTION__, - length, min_len, - CHECK_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP) ? "nh" : "", - CHECK_FLAG(api.message, ZAPI_MESSAGE_IFINDEX) ? " ifi" : "", - CHECK_FLAG(api.message, ZAPI_MESSAGE_DISTANCE) ? " dist" : "", - CHECK_FLAG(api.message, ZAPI_MESSAGE_METRIC) ? " metr" : ""); - } - - /* IPv4 prefix. */ - stream_get(&p.prefix, s, PSIZE(p.prefixlen)); - - /* Nexthop, ifindex, distance, metric. */ - if (CHECK_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP)) { - api.nexthop_num = stream_getc(s); - nexthop.s_addr = stream_get_ipv4(s); - } - if (CHECK_FLAG(api.message, ZAPI_MESSAGE_IFINDEX)) { - api.ifindex_num = stream_getc(s); - ifindex = stream_getl(s); - } - - api.distance = CHECK_FLAG(api.message, ZAPI_MESSAGE_DISTANCE) ? - stream_getc(s) : - 0; - - api.metric = CHECK_FLAG(api.message, ZAPI_MESSAGE_METRIC) ? - stream_getl(s) : - 0; - - if (CHECK_FLAG (api.message, ZAPI_MESSAGE_TAG)) - api.tag = stream_getl (s); - else - api.tag = 0; - - switch (command) { - case ZEBRA_REDISTRIBUTE_IPV4_ADD: - if (PIM_DEBUG_ZEBRA) { - char buf[2][INET_ADDRSTRLEN]; - zlog_debug("%s: add %s %s/%d " - "nexthop %s ifindex %d metric%s %u distance%s %u", - __PRETTY_FUNCTION__, - zebra_route_string(api.type), - inet_ntop(AF_INET, &p.prefix, buf[0], sizeof(buf[0])), - p.prefixlen, - inet_ntop(AF_INET, &nexthop, buf[1], sizeof(buf[1])), - ifindex, - CHECK_FLAG(api.message, ZAPI_MESSAGE_METRIC) ? "-recv" : "-miss", - api.metric, - CHECK_FLAG(api.message, ZAPI_MESSAGE_DISTANCE) ? "-recv" : "-miss", - api.distance); - } - break; - case ZEBRA_REDISTRIBUTE_IPV4_DEL: - if (PIM_DEBUG_ZEBRA) { - char buf[2][INET_ADDRSTRLEN]; - zlog_debug("%s: delete %s %s/%d " - "nexthop %s ifindex %d metric%s %u distance%s %u", - __PRETTY_FUNCTION__, - zebra_route_string(api.type), - inet_ntop(AF_INET, &p.prefix, buf[0], sizeof(buf[0])), - p.prefixlen, - inet_ntop(AF_INET, &nexthop, buf[1], sizeof(buf[1])), - ifindex, - CHECK_FLAG(api.message, ZAPI_MESSAGE_METRIC) ? "-recv" : "-miss", - api.metric, - CHECK_FLAG(api.message, ZAPI_MESSAGE_DISTANCE) ? "-recv" : "-miss", - api.distance); - } - break; - default: - zlog_warn("%s: unknown command=%d", __PRETTY_FUNCTION__, command); - return -1; - } - - sched_rpf_cache_refresh(); - - pim_rp_setup (); + pim_parse_nexthop_update (zclient, command, vrf_id); return 0; } @@ -742,8 +633,7 @@ void pim_zebra_init(void) zclient->interface_down = pim_zebra_if_state_down; zclient->interface_address_add = pim_zebra_if_address_add; zclient->interface_address_delete = pim_zebra_if_address_del; - zclient->redistribute_route_ipv4_add = redist_read_ipv4_route; - zclient->redistribute_route_ipv4_del = redist_read_ipv4_route; + zclient->nexthop_update = pim_zebra_nexthop_update; zclient_init(zclient, ZEBRA_ROUTE_PIM, 0); if (PIM_DEBUG_PIM_TRACE) { @@ -1262,3 +1152,11 @@ pim_zebra_zclient_update (struct vty *vty) vty_out(vty, "<null zclient>%s", VTY_NEWLINE); } } + +struct zclient *pim_zebra_zclient_get (void) +{ + if (zclient) + return zclient; + else + return NULL; +} |
