diff options
Diffstat (limited to 'pimd')
| -rw-r--r-- | pimd/mtracebis_netlink.c | 21 | ||||
| -rw-r--r-- | pimd/pim6_cmd.c | 20 | ||||
| -rw-r--r-- | pimd/pim_cmd.c | 20 | ||||
| -rw-r--r-- | pimd/pim_cmd_common.c | 10 | ||||
| -rw-r--r-- | pimd/pim_cmd_common.h | 1 | ||||
| -rw-r--r-- | pimd/pim_iface.c | 25 | ||||
| -rw-r--r-- | pimd/pim_nht.c | 2 |
7 files changed, 56 insertions, 43 deletions
diff --git a/pimd/mtracebis_netlink.c b/pimd/mtracebis_netlink.c index 47b5f7e52c..fe2cb56a26 100644 --- a/pimd/mtracebis_netlink.c +++ b/pimd/mtracebis_netlink.c @@ -187,16 +187,18 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth, const struct rtnl_dump_filter_arg *arg) { struct sockaddr_nl nladdr; - struct iovec iov; + char buf[16384]; + struct iovec iov = { + .iov_base = buf, + .iov_len = sizeof(buf), + }; struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = &iov, .msg_iovlen = 1, }; - char buf[16384]; - iov.iov_base = buf; while (1) { int status; const struct rtnl_dump_filter_arg *a; @@ -220,7 +222,7 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth, } for (a = arg; a->filter; a++) { - struct nlmsghdr *h = (struct nlmsghdr *)buf; + struct nlmsghdr *h = (struct nlmsghdr *)iov.iov_base; msglen = status; while (NLMSG_OK(h, (uint32_t)msglen)) { @@ -348,7 +350,8 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, msg.msg_namelen); exit(1); } - for (h = (struct nlmsghdr *)buf; status >= (int)sizeof(*h);) { + for (h = (struct nlmsghdr *)iov.iov_base; + status >= (int)sizeof(*h);) { int err; int len = h->nlmsg_len; int l = len - sizeof(*h); @@ -421,21 +424,23 @@ int rtnl_listen(struct rtnl_handle *rtnl, rtnl_filter_t handler, void *jarg) int status; struct nlmsghdr *h; struct sockaddr_nl nladdr; - struct iovec iov; + char buf[8192]; + struct iovec iov = { + .iov_base = buf, + .iov_len = sizeof(buf), + }; struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = &iov, .msg_iovlen = 1, }; - char buf[8192]; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nladdr.nl_pid = 0; nladdr.nl_groups = 0; - iov.iov_base = buf; while (1) { iov.iov_len = sizeof(buf); status = recvmsg(rtnl->fd, &msg, 0); diff --git a/pimd/pim6_cmd.c b/pimd/pim6_cmd.c index b7a832681d..d72a67243b 100644 --- a/pimd/pim6_cmd.c +++ b/pimd/pim6_cmd.c @@ -1309,6 +1309,25 @@ DEFPY (clear_ipv6_mroute_count, return clear_ip_mroute_count_command(vty, name); } +DEFPY (clear_ipv6_pim_interfaces, + clear_ipv6_pim_interfaces_cmd, + "clear ipv6 pim [vrf NAME] interfaces", + CLEAR_STR + IPV6_STR + CLEAR_IP_PIM_STR + VRF_CMD_HELP_STR + "Reset PIM interfaces\n") +{ + struct vrf *v = pim_cmd_lookup(vty, vrf); + + if (!v) + return CMD_WARNING; + + clear_pim_interfaces(v->info); + + return CMD_SUCCESS; +} + DEFPY (clear_ipv6_pim_bsr_db, clear_ipv6_pim_bsr_db_cmd, "clear ipv6 pim [vrf NAME] bsr-data", @@ -1599,6 +1618,7 @@ void pim_cmd_init(void) install_element(ENABLE_NODE, &clear_ipv6_pim_oil_cmd); install_element(ENABLE_NODE, &clear_ipv6_mroute_count_cmd); install_element(ENABLE_NODE, &clear_ipv6_pim_bsr_db_cmd); + install_element(ENABLE_NODE, &clear_ipv6_pim_interfaces_cmd); install_element(ENABLE_NODE, &debug_pimv6_cmd); install_element(ENABLE_NODE, &debug_pimv6_nht_cmd); diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index f62b90a9d6..9681493808 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1521,17 +1521,6 @@ static void clear_igmp_interfaces(struct pim_instance *pim) pim_if_addr_add_all(ifp); } -static void clear_pim_interfaces(struct pim_instance *pim) -{ - struct interface *ifp; - - FOR_ALL_INTERFACES (pim->vrf, ifp) { - if (ifp->info) { - pim_neighbor_delete_all(ifp, "interface cleared"); - } - } -} - static void clear_interfaces(struct pim_instance *pim) { clear_igmp_interfaces(pim); @@ -1670,7 +1659,7 @@ DEFPY (clear_ip_mroute, return CMD_SUCCESS; } -DEFUN (clear_ip_pim_interfaces, +DEFPY (clear_ip_pim_interfaces, clear_ip_pim_interfaces_cmd, "clear ip pim [vrf NAME] interfaces", CLEAR_STR @@ -1679,13 +1668,12 @@ DEFUN (clear_ip_pim_interfaces, VRF_CMD_HELP_STR "Reset PIM interfaces\n") { - int idx = 2; - struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx); + struct vrf *v = pim_cmd_lookup(vty, vrf); - if (!vrf) + if (!v) return CMD_WARNING; - clear_pim_interfaces(vrf->info); + clear_pim_interfaces(v->info); return CMD_SUCCESS; } diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index f2974edae2..b7bd7375c5 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -4902,3 +4902,13 @@ int pim_show_interface_traffic_helper(const char *vrf, const char *if_name, return CMD_SUCCESS; } + +void clear_pim_interfaces(struct pim_instance *pim) +{ + struct interface *ifp; + + FOR_ALL_INTERFACES (pim->vrf, ifp) { + if (ifp->info) + pim_neighbor_delete_all(ifp, "interface cleared"); + } +} diff --git a/pimd/pim_cmd_common.h b/pimd/pim_cmd_common.h index 1e770e6c8d..02acb16858 100644 --- a/pimd/pim_cmd_common.h +++ b/pimd/pim_cmd_common.h @@ -184,6 +184,7 @@ void pim_show_interface_traffic(struct pim_instance *pim, struct vty *vty, bool uj); int pim_show_interface_traffic_helper(const char *vrf, const char *if_name, struct vty *vty, bool uj); +void clear_pim_interfaces(struct pim_instance *pim); /* * Special Macro to allow us to get the correct pim_instance; */ diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 73b6ca951a..0fb5e8c6d9 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -801,22 +801,13 @@ void pim_if_addr_add_all(struct interface *ifp) pim_if_addr_add(ifc); } - if (!v4_addrs && v6_addrs && !if_is_loopback(ifp)) { - if (pim_ifp->pim_enable) { - - /* Interface has a valid primary address ? */ - if (!pim_addr_is_any(pim_ifp->primary_address)) { - - /* Interface has a valid socket ? */ - if (pim_ifp->pim_sock_fd < 0) { - if (pim_sock_add(ifp)) { - zlog_warn( - "Failure creating PIM socket for interface %s", - ifp->name); - } - } - } - } /* pim */ + if (!v4_addrs && v6_addrs && !if_is_loopback(ifp) && + pim_ifp->pim_enable && !pim_addr_is_any(pim_ifp->primary_address) && + pim_ifp->pim_sock_fd < 0 && pim_sock_add(ifp)) { + /* Interface has a valid primary address ? */ + /* Interface has a valid socket ? */ + zlog_warn("Failure creating PIM socket for interface %s", + ifp->name); } /* * PIM or IGMP is enabled on interface, and there is at least one @@ -1768,9 +1759,7 @@ static int pim_ifp_down(struct interface *ifp) if (ifp->info) { pim_if_del_vif(ifp); -#if PIM_IPV == 4 pim_ifstat_reset(ifp); -#endif } return 0; diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 2e5c0598c0..9feb064e96 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -436,7 +436,7 @@ static int pim_update_upstream_nh_helper(struct hash_bucket *bucket, void *arg) * RPF nbr is now unreachable the MFC has already been updated * by pim_rpf_clear */ - if (rpf_result != PIM_RPF_CHANGED) + if (rpf_result == PIM_RPF_CHANGED) pim_upstream_mroute_iif_update(up->channel_oil, __func__); if (rpf_result == PIM_RPF_CHANGED || |
