diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index d71b174487..d1427830cb 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -5756,6 +5756,18 @@ DEFUN (interface_no_ip_pim_hello, return pim_process_no_ip_pim_hello_cmd(vty); } +DEFPY (interface_ip_igmp_proxy, + interface_ip_igmp_proxy_cmd, + "[no] ip igmp proxy", + NO_STR + IP_STR + IGMP_STR + "Proxy IGMP join/prune operations\n") +{ + return CMD_SUCCESS; +} + + DEFUN (debug_igmp, debug_igmp_cmd, "debug igmp", @@ -8718,6 +8730,7 @@ void pim_cmd_init(void) &interface_ip_igmp_last_member_query_interval_cmd); install_element(INTERFACE_NODE, &interface_no_ip_igmp_last_member_query_interval_cmd); + install_element(INTERFACE_NODE, &interface_ip_igmp_proxy_cmd); install_element(INTERFACE_NODE, &interface_ip_pim_activeactive_cmd); install_element(INTERFACE_NODE, &interface_ip_pim_ssm_cmd); install_element(INTERFACE_NODE, &interface_no_ip_pim_ssm_cmd); diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index 4d20379665..77e3f5191d 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -63,6 +63,7 @@ struct pim_interface { bool pim_passive_enable : 1; bool gm_enable : 1; + bool gm_proxy : 1; /* proxy IGMP joins/prunes */ ifindex_t mroute_vif_index; struct pim_instance *pim; diff --git a/pimd/pim_nb.c b/pimd/pim_nb.c index 0e8aa48f9d..3c36512a3d 100644 --- a/pimd/pim_nb.c +++ b/pimd/pim_nb.c @@ -553,7 +553,13 @@ const struct frr_yang_module_info frr_gmp_info = { .destroy = lib_interface_gmp_address_family_join_group_destroy, } }, - { + { + .xpath = "/frr-interface:lib/interface/frr-gmp:gmp/address-family/proxy", + .cbs = { + .modify = lib_interface_gmp_address_family_proxy_modify, + } + }, +{ .xpath = "/frr-interface:lib/interface/frr-gmp:gmp/address-family/static-group", .cbs = { .create = lib_interface_gmp_address_family_static_group_create, diff --git a/pimd/pim_nb.h b/pimd/pim_nb.h index 55883ad29a..dfab582968 100644 --- a/pimd/pim_nb.h +++ b/pimd/pim_nb.h @@ -221,6 +221,7 @@ int lib_interface_gmp_address_family_join_group_create( struct nb_cb_create_args *args); int lib_interface_gmp_address_family_join_group_destroy( struct nb_cb_destroy_args *args); +int lib_interface_gmp_address_family_proxy_modify(struct nb_cb_modify_args *args); int lib_interface_gmp_address_family_static_group_create( struct nb_cb_create_args *args); int lib_interface_gmp_address_family_static_group_destroy( diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index 0c7481c27a..781bd5a9a1 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -3381,6 +3381,28 @@ int lib_interface_gmp_address_family_robustness_variable_modify( return NB_OK; } +/* + * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/proxy + */ +int lib_interface_gmp_address_family_proxy_modify(struct nb_cb_modify_args *args) +{ + struct interface *ifp; + struct pim_interface *pim_ifp; + + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + break; + case NB_EV_APPLY: + ifp = nb_running_get_entry(args->dnode, NULL, true); + pim_ifp = ifp->info; + if (pim_ifp) + pim_ifp->gm_proxy = yang_dnode_get_bool(args->dnode, + NULL); + } + return NB_OK; +} /* * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/join-group */ diff --git a/yang/frr-gmp.yang b/yang/frr-gmp.yang index e6a1f7f640..5636010d91 100644 --- a/yang/frr-gmp.yang +++ b/yang/frr-gmp.yang @@ -146,6 +146,13 @@ module frr-gmp { "Querier's Robustness Variable allows tuning for the expected packet loss on a network."; } + + leaf proxy { + type boolean; + default "false"; + description + "Enable IGMP proxy on the interface."; + } list join-group { key "group-addr source-addr";