From: Donald Sharp Date: Thu, 14 Sep 2017 15:15:52 +0000 (-0400) Subject: pimd: Allow igmp join messages to return more detailed errors X-Git-Tag: frr-4.0-dev~307^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=refs%2Fpull%2F1178%2Fhead;p=mirror%2Ffrr.git pimd: Allow igmp join messages to return more detailed errors Start the conversion of pim configuration commands to use the ferr side channel to allow more detailed information to be returned to cli commands. Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index ab62127100..4066614f4b 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -28,6 +28,7 @@ #include "hash.h" #include "nexthop.h" #include "vrf.h" +#include "ferr.h" #include "pimd.h" #include "pim_mroute.h" @@ -5839,13 +5840,8 @@ DEFUN (interface_ip_igmp_join, return CMD_WARNING_CONFIG_FAILED; } - result = pim_if_igmp_join_add(ifp, group_addr, source_addr); - if (result) { - vty_out(vty, - "%% Failure joining IGMP group %s source %s on interface %s: %d\n", - group_str, source_str, ifp->name, result); - return CMD_WARNING_CONFIG_FAILED; - } + CMD_FERR_RETURN(pim_if_igmp_join_add(ifp, group_addr, source_addr), + "Failure joining IGMP group: $ERR"); return CMD_SUCCESS; } diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 1afcff7cb1..6cf18d08e4 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -27,6 +27,7 @@ #include "linklist.h" #include "plist.h" #include "hash.h" +#include "ferr.h" #include "pimd.h" #include "pim_instance.h" @@ -1270,7 +1271,7 @@ static struct igmp_join *igmp_join_new(struct interface *ifp, return ij; } -int pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, +ferr_r pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, struct in_addr source_addr) { struct pim_interface *pim_ifp; @@ -1278,17 +1279,14 @@ int pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, pim_ifp = ifp->info; if (!pim_ifp) { - zlog_warn("%s: multicast not enabled on interface %s", - __PRETTY_FUNCTION__, ifp->name); - return -1; + return ferr_cfg_invalid("multicast not enabled on interface %s", + ifp->name); } if (!pim_ifp->igmp_join_list) { pim_ifp->igmp_join_list = list_new(); if (!pim_ifp->igmp_join_list) { - zlog_err("%s %s: failure: igmp_join_list=list_new()", - __FILE__, __PRETTY_FUNCTION__); - return -2; + return ferr_cfg_invalid("Insufficient memory"); } pim_ifp->igmp_join_list->del = (void (*)(void *))igmp_join_free; } @@ -1301,24 +1299,15 @@ int pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, sizeof(group_str)); pim_inet4_dump("", source_addr, source_str, sizeof(source_str)); - zlog_warn( - "%s: can't re-join existing IGMP group %s source %s on interface %s", - __PRETTY_FUNCTION__, group_str, source_str, ifp->name); - return -3; + return ferr_cfg_invalid( + "can't re-join existing IGMP group %s source %s on interface %s", + group_str, source_str, ifp->name); } ij = igmp_join_new(ifp, group_addr, source_addr); if (!ij) { - char group_str[INET_ADDRSTRLEN]; - char source_str[INET_ADDRSTRLEN]; - pim_inet4_dump("", group_addr, group_str, - sizeof(group_str)); - pim_inet4_dump("", source_addr, source_str, - sizeof(source_str)); - zlog_warn( - "%s: igmp_join_new() failure for IGMP group %s source %s on interface %s", - __PRETTY_FUNCTION__, group_str, source_str, ifp->name); - return -4; + return ferr_cfg_invalid( + "Failure to create new join data structure, see log file for more information"); } if (PIM_DEBUG_IGMP_EVENTS) { @@ -1333,7 +1322,7 @@ int pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, __PRETTY_FUNCTION__, source_str, group_str, ifp->name); } - return 0; + return ferr_ok(); } diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index ed885ff0e3..2f27a14010 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -26,6 +26,7 @@ #include "vty.h" #include "vrf.h" #include "zclient.h" +#include "ferr.h" #include "pim_igmp.h" #include "pim_upstream.h" @@ -182,8 +183,8 @@ int pim_if_t_override_msec(struct interface *ifp); struct in_addr pim_find_primary_addr(struct interface *ifp); -int pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, - struct in_addr source_addr); +ferr_r pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, + struct in_addr source_addr); int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr, struct in_addr source_addr);