diff options
Diffstat (limited to 'pimd')
-rw-r--r-- | pimd/pim6_cmd.c | 4 | ||||
-rw-r--r-- | pimd/pim_cmd.c | 19 | ||||
-rw-r--r-- | pimd/pim_cmd_common.c | 11 | ||||
-rw-r--r-- | pimd/pim_iface.c | 2 | ||||
-rw-r--r-- | pimd/pim_ifchannel.c | 8 | ||||
-rw-r--r-- | pimd/pim_igmpv3.c | 2 | ||||
-rw-r--r-- | pimd/pim_mroute.c | 12 | ||||
-rw-r--r-- | pimd/pim_msdp.c | 8 | ||||
-rw-r--r-- | pimd/pim_nb_config.c | 12 | ||||
-rw-r--r-- | pimd/pim_register.c | 4 | ||||
-rw-r--r-- | pimd/pim_upstream.c | 65 | ||||
-rw-r--r-- | pimd/pim_upstream.h | 3 |
12 files changed, 101 insertions, 49 deletions
diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index 4db1157..ec91270 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -244,7 +244,7 @@ DEFPY (interface_no_ipv6_pim, DEFPY (interface_ipv6_pim_drprio, interface_ipv6_pim_drprio_cmd, - "ipv6 pim drpriority (1-4294967295)", + "ipv6 pim drpriority (0-4294967295)", IPV6_STR PIM_STR "Set the Designated Router Election Priority\n" @@ -255,7 +255,7 @@ DEFPY (interface_ipv6_pim_drprio, DEFPY (interface_no_ipv6_pim_drprio, interface_no_ipv6_pim_drprio_cmd, - "no ipv6 pim drpriority [(1-4294967295)]", + "no ipv6 pim drpriority [(0-4294967295)]", NO_STR IPV6_STR PIM_STR diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index be36a07..a2d756a 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1941,12 +1941,15 @@ DEFUN (show_ip_pim_mlag_summary, json_object *json_stat = NULL; json = json_object_new_object(); - if (router->mlag_flags & PIM_MLAGF_LOCAL_CONN_UP) - json_object_boolean_true_add(json, "mlagConnUp"); - if (router->mlag_flags & PIM_MLAGF_PEER_CONN_UP) - json_object_boolean_true_add(json, "mlagPeerConnUp"); - if (router->mlag_flags & PIM_MLAGF_PEER_ZEBRA_UP) - json_object_boolean_true_add(json, "mlagPeerZebraUp"); + json_object_boolean_add(json, "mlagConnUp", + CHECK_FLAG(router->mlag_flags, + PIM_MLAGF_LOCAL_CONN_UP)); + json_object_boolean_add(json, "mlagPeerConnUp", + CHECK_FLAG(router->mlag_flags, + PIM_MLAGF_PEER_CONN_UP)); + json_object_boolean_add(json, "mlagPeerZebraUp", + CHECK_FLAG(router->mlag_flags, + PIM_MLAGF_PEER_ZEBRA_UP)); json_object_string_add(json, "mlagRole", mlag_role2str(router->mlag_role, role_buf, sizeof(role_buf))); @@ -3953,7 +3956,7 @@ DEFUN (interface_no_ip_igmp_last_member_query_interval, DEFUN (interface_ip_pim_drprio, interface_ip_pim_drprio_cmd, - "ip pim drpriority (1-4294967295)", + "ip pim drpriority (0-4294967295)", IP_STR PIM_STR "Set the Designated Router Election Priority\n" @@ -3966,7 +3969,7 @@ DEFUN (interface_ip_pim_drprio, DEFUN (interface_no_ip_pim_drprio, interface_no_ip_pim_drprio_cmd, - "no ip pim drpriority [(1-4294967295)]", + "no ip pim drpriority [(0-4294967295)]", NO_STR IP_STR PIM_STR diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index ee318d4..5e50a09 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -287,8 +287,15 @@ int pim_process_no_rp_kat_cmd(struct vty *vty) sizeof(rs_timer_xpath)); /* RFC4601 */ - v = yang_dnode_get_uint16(vty->candidate_config->dnode, "%s", - rs_timer_xpath); + /* Check if register suppress time is configured or assigned + * the default register suppress time. + */ + if (yang_dnode_exists(vty->candidate_config->dnode, rs_timer_xpath)) + v = yang_dnode_get_uint16(vty->candidate_config->dnode, "%s", + rs_timer_xpath); + else + v = PIM_REGISTER_SUPPRESSION_TIME_DEFAULT; + v = 3 * v + PIM_REGISTER_PROBE_TIME_DEFAULT; if (v > UINT16_MAX) v = UINT16_MAX; diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 5d7132c..dcb6116 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -1677,7 +1677,9 @@ static int pim_ifp_up(struct interface *ifp) __func__, vrf->name); return 0; } + pim_zebra_interface_set_master(master, ifp); + break; } } } diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index da55189..8f9e410 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -342,6 +342,13 @@ void pim_ifchannel_ifjoin_switch(const char *caller, struct pim_ifchannel *ch, ch->sg_str, ch->interface->name); } + /* pim_upstream_update_join_desired looks at up->channel_oil, + * but that's updated from pim_forward_stop(). Need this here + * so we correctly determine join_desired right below. + */ + if (new_state == PIM_IFJOIN_NOINFO) + pim_forward_stop(ch); + /* Record uptime of state transition to/from NOINFO */ @@ -619,7 +626,6 @@ struct pim_ifchannel *pim_ifchannel_add(struct interface *ifp, pim_sgaddr *sg, static void ifjoin_to_noinfo(struct pim_ifchannel *ch) { pim_ifchannel_ifjoin_switch(__func__, ch, PIM_IFJOIN_NOINFO); - pim_forward_stop(ch); PIM_UPSTREAM_FLAG_UNSET_SRC_PIM(ch->upstream->flags); diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c index 18a9fb7..2c5ad4d 100644 --- a/pimd/pim_igmpv3.c +++ b/pimd/pim_igmpv3.c @@ -457,8 +457,6 @@ struct gm_source *igmp_get_source_by_addr(struct gm_group *group, listnode_add(group->group_source_list, src); - /* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */ - igmp_anysource_forward_stop(group); return src; } diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index c63e0f3..adc47e7 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -56,10 +56,14 @@ int pim_mroute_set(struct pim_instance *pim, int enable) err = setsockopt(pim->mroute_socket, PIM_IPPROTO, MRT_TABLE, &data, data_len); if (err) { - zlog_warn( - "%s %s: failure: setsockopt(fd=%d,PIM_IPPROTO, MRT_TABLE=%d): errno=%d: %s", - __FILE__, __func__, pim->mroute_socket, - data, errno, safe_strerror(errno)); + if (err == ENOPROTOOPT) + zlog_err("%s Kernel is not compiled with CONFIG_IP_MROUTE_MULTIPLE_TABLES and vrf's will not work", + __func__); + else + zlog_warn("%s %s: failure: setsockopt(fd=%d,PIM_IPPROTO, MRT_TABLE=%d): errno=%d: %s", + __FILE__, __func__, + pim->mroute_socket, data, + errno, safe_strerror(errno)); return -1; } } diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c index 623c14b..ea8c84c 100644 --- a/pimd/pim_msdp.c +++ b/pimd/pim_msdp.c @@ -411,12 +411,10 @@ void pim_msdp_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp, pim_addr_to_prefix(&grp, sa->sg.grp); rp_info = pim_rp_find_match_group(pim, &grp); if (rp_info) { - sa->rp = rp_info->rp.rpf_addr; - } else - { - sa->rp = pim->msdp.originator_id; + sa->rp = rp_info->rp.rpf_addr; + } else { + sa->rp = pim->msdp.originator_id; } - sa->rp = pim->msdp.originator_id; pim_msdp_pkt_sa_tx_one(sa); } sa->flags &= ~PIM_MSDP_SAF_STALE; diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index 4f1a4a1..be0be85 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -1504,11 +1504,19 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_re */ int lib_interface_pim_address_family_create(struct nb_cb_create_args *args) { + struct interface *ifp; + switch (args->event) { case NB_EV_VALIDATE: - case NB_EV_PREPARE: - case NB_EV_ABORT: case NB_EV_APPLY: + case NB_EV_ABORT: + break; + case NB_EV_PREPARE: + ifp = nb_running_get_entry(args->dnode, NULL, true); + if (ifp->info) + return NB_OK; + + pim_if_new(ifp, false, false, false, false); break; } diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 01da699..b149b5a 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -109,12 +109,12 @@ static void pim_reg_stop_upstream(struct pim_instance *pim, up->reg_state = PIM_REG_PRUNE; pim_channel_del_oif(up->channel_oil, pim->regiface, PIM_OIF_FLAG_PROTO_PIM, __func__); - pim_upstream_start_register_stop_timer(up, 0); + pim_upstream_start_register_probe_timer(up); pim_vxlan_update_sg_reg_state(pim, up, false); break; case PIM_REG_JOIN_PENDING: up->reg_state = PIM_REG_PRUNE; - pim_upstream_start_register_stop_timer(up, 0); + pim_upstream_start_register_probe_timer(up); return; } } diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 556d25b..7417f31 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -1687,6 +1687,8 @@ const char *pim_reg_state2str(enum pim_reg_state reg_state, char *state_str, return state_str; } +static void pim_upstream_start_register_stop_timer(struct pim_upstream *up); + static void pim_upstream_register_stop_timer(struct event *t) { struct pim_interface *pim_ifp; @@ -1734,7 +1736,7 @@ static void pim_upstream_register_stop_timer(struct event *t) return; } up->reg_state = PIM_REG_JOIN_PENDING; - pim_upstream_start_register_stop_timer(up, 1); + pim_upstream_start_register_stop_timer(up); if (((up->channel_oil->cc.lastused / 100) > pim->keep_alive_time) @@ -1752,34 +1754,59 @@ static void pim_upstream_register_stop_timer(struct event *t) } } -void pim_upstream_start_register_stop_timer(struct pim_upstream *up, - int null_register) +static void pim_upstream_start_register_stop_timer(struct pim_upstream *up) { uint32_t time; EVENT_OFF(up->t_rs_timer); - if (!null_register) { - uint32_t lower = (0.5 * router->register_suppress_time); - uint32_t upper = (1.5 * router->register_suppress_time); - time = lower + (frr_weak_random() % (upper - lower + 1)); - /* Make sure we don't wrap around */ - if (time >= router->register_probe_time) - time -= router->register_probe_time; - else - time = 0; - } else - time = router->register_probe_time; + time = router->register_probe_time; - if (PIM_DEBUG_PIM_TRACE) { - zlog_debug( - "%s: (S,G)=%s Starting upstream register stop timer %d", - __func__, up->sg_str, time); - } + if (PIM_DEBUG_PIM_TRACE) + zlog_debug("%s: (S,G)=%s Starting upstream register stop timer %d", + __func__, up->sg_str, time); event_add_timer(router->master, pim_upstream_register_stop_timer, up, time, &up->t_rs_timer); } +static void pim_upstream_register_probe_timer(struct event *t) +{ + struct pim_upstream *up = EVENT_ARG(t); + + if (!up->rpf.source_nexthop.interface || + !up->rpf.source_nexthop.interface->info) { + if (PIM_DEBUG_PIM_REG) + zlog_debug("cannot send Null register for %pSG, no path to RP", + &up->sg); + } else + pim_null_register_send(up); + + pim_upstream_start_register_stop_timer(up); +} + +void pim_upstream_start_register_probe_timer(struct pim_upstream *up) +{ + uint32_t time; + + EVENT_OFF(up->t_rs_timer); + + uint32_t lower = (0.5 * router->register_suppress_time); + uint32_t upper = (1.5 * router->register_suppress_time); + time = lower + (frr_weak_random() % (upper - lower + 1)); + /* Make sure we don't wrap around */ + if (time >= router->register_probe_time) + time -= router->register_probe_time; + else + time = 0; + + if (PIM_DEBUG_PIM_TRACE) + zlog_debug("%s: (S,G)=%s Starting upstream register stop null probe timer %d", + __func__, up->sg_str, time); + + event_add_timer(router->master, pim_upstream_register_probe_timer, up, + time, &up->t_rs_timer); +} + int pim_upstream_inherited_olist_decide(struct pim_instance *pim, struct pim_upstream *up) { diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index 62649cd..8b4a35b 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -331,8 +331,7 @@ int pim_upstream_is_sg_rpt(struct pim_upstream *up); void pim_upstream_set_sptbit(struct pim_upstream *up, struct interface *incoming); -void pim_upstream_start_register_stop_timer(struct pim_upstream *up, - int null_register); +void pim_upstream_start_register_probe_timer(struct pim_upstream *up); void pim_upstream_send_join(struct pim_upstream *up); |