]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Added cli to generate igmp query.
authorrgirada <rgirada@vmware.com>
Thu, 13 Jun 2019 17:21:37 +0000 (10:21 -0700)
committerrgirada <rgirada@vmware.com>
Mon, 24 Jun 2019 10:15:10 +0000 (03:15 -0700)
Fix details :
Added a utility cli to generate a igmp query on an interface.
This won't impact the existing query generation based on the
general query interval.

Signed-off-by: Rajesh Girada <rgirada@vmware.com>
doc/user/pim.rst
pimd/pim_cmd.c
pimd/pim_igmp.c
pimd/pim_igmp.h

index e8c74f7b87d4416cab22514694c57fc5309ff931..805d6264a87291f943c8d869267a44bc24de98c3 100644 (file)
@@ -151,6 +151,12 @@ Certain signals have special meanings to *pimd*.
    urib-only
       Lookup in the Unicast Rib only.
 
+.. index:: ip igmp generate-query-once [version (2-3)]
+.. clicmd:: ip igmp generate-query-once [version (2-3)]
+
+   Generate IGMP query (v2/v3) on user requirement. This will not depend on
+   the existing IGMP general query timer.If no version is provided in the cli,
+   it will be considered as default v2 query.This is a hidden command.
 
 .. _pim-interface-configuration:
 
index 18e84fef23c7b7863abc02888e8da120c5853540..d699a3b4a5d940e0d467f20eafc42afafea7f013 100644 (file)
@@ -7360,6 +7360,32 @@ DEFUN (interface_no_ip_pim_drprio,
        return CMD_SUCCESS;
 }
 
+DEFPY_HIDDEN (interface_ip_igmp_query_generate,
+       interface_ip_igmp_query_generate_cmd,
+       "ip igmp generate-query-once [version (2-3)]",
+       IP_STR
+       IFACE_IGMP_STR
+       "Generate igmp general query once\n"
+       "IGMP version\n"
+       "IGMP version number\n")
+{
+       VTY_DECLVAR_CONTEXT(interface, ifp);
+       int igmp_version = 2;
+
+       if (!ifp->info) {
+               vty_out(vty, "IGMP/PIM is not enabled on the interface %s\n",
+                       ifp->name);
+               return CMD_WARNING_CONFIG_FAILED;
+       }
+
+       if (argc > 3)
+               igmp_version = atoi(argv[4]->arg);
+
+       igmp_send_query_on_intf(ifp, igmp_version);
+
+       return CMD_SUCCESS;
+}
+
 static int pim_cmd_interface_add(struct interface *ifp)
 {
        struct pim_interface *pim_ifp = ifp->info;
@@ -10280,6 +10306,7 @@ void pim_cmd_init(void)
        install_element(INTERFACE_NODE, &interface_no_ip_pim_hello_cmd);
        install_element(INTERFACE_NODE, &interface_ip_pim_boundary_oil_cmd);
        install_element(INTERFACE_NODE, &interface_no_ip_pim_boundary_oil_cmd);
+       install_element(INTERFACE_NODE, &interface_ip_igmp_query_generate_cmd);
 
        // Static mroutes NEB
        install_element(INTERFACE_NODE, &interface_ip_mroute_cmd);
index 4ae6f69d3eee39dd92f408b71b9dbf738b647a96..ed965555d9ec1bffb0155e226c8c65fb9138894c 100644 (file)
@@ -1180,3 +1180,42 @@ void igmp_send_query(int igmp_version, struct igmp_group *group, int fd,
                                   group_addr, query_max_response_time_dsec);
        }
 }
+
+void igmp_send_query_on_intf(struct interface *ifp, int igmp_ver)
+{
+       struct pim_interface *pim_ifp = ifp->info;
+       struct listnode *sock_node = NULL;
+       struct igmp_sock *igmp = NULL;
+       struct in_addr dst_addr;
+       struct in_addr group_addr;
+       int query_buf_size;
+
+       if (!igmp_ver)
+               igmp_ver = 2;
+
+       if (igmp_ver == 3)
+               query_buf_size = PIM_IGMP_BUFSIZE_WRITE;
+       else
+               query_buf_size = IGMP_V12_MSG_SIZE;
+
+       dst_addr.s_addr = htonl(INADDR_ALLHOSTS_GROUP);
+       group_addr.s_addr = PIM_NET_INADDR_ANY;
+
+       if (PIM_DEBUG_IGMP_TRACE)
+               zlog_debug("Issuing general query on request on %s",
+                               ifp->name);
+
+       for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, igmp)) {
+
+               char query_buf[query_buf_size];
+
+               igmp_send_query(igmp_ver, 0 /* igmp_group */, igmp->fd,
+                               igmp->interface->name, query_buf,
+                               sizeof(query_buf), 0 /* num_sources */,
+                               dst_addr, group_addr,
+                               pim_ifp->igmp_query_max_response_time_dsec,
+                               1 /* s_flag: always set for general queries */,
+                               igmp->querier_robustness_variable,
+                               igmp->querier_query_interval);
+       }
+}
index 7db568dcfe21597b36766edcbb761c555b6f51d8..9231b0b41fb0128120122eb1c46bc8a8ca55e22b 100644 (file)
@@ -198,4 +198,6 @@ void igmp_send_query(int igmp_version, struct igmp_group *group, int fd,
                     uint8_t querier_robustness_variable,
                     uint16_t querier_query_interval);
 void igmp_group_delete(struct igmp_group *group);
+
+void igmp_send_query_on_intf(struct interface *ifp, int igmp_ver);
 #endif /* PIM_IGMP_H */