1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2020 VmWare
11 #include "lib/northbound_cli.h"
12 #include "pim_igmpv3.h"
13 #include "pim_neighbor.h"
18 #include "pim_static.h"
20 #include "pim_ssmpingd.h"
21 #include "pim_vxlan.h"
24 #include "lib_errors.h"
29 #define pim6_msdp_err(funcname, argtype) \
30 int funcname(struct argtype *args) \
32 snprintf(args->errmsg, args->errmsg_len, \
33 "Trying to configure MSDP in pim6d. " \
34 "MSDP does not exist for IPv6."); \
35 return NB_ERR_VALIDATION; \
37 MACRO_REQUIRE_SEMICOLON()
39 #define yang_dnode_get_pimaddr yang_dnode_get_ipv6
41 #else /* PIM_IPV != 6 */
42 #define pim6_msdp_err(funcname, argtype) \
43 MACRO_REQUIRE_SEMICOLON()
45 #define yang_dnode_get_pimaddr yang_dnode_get_ipv4
46 #endif /* PIM_IPV != 6 */
48 static void pim_if_membership_clear(struct interface
*ifp
)
50 struct pim_interface
*pim_ifp
;
55 if (pim_ifp
->pim_enable
&& pim_ifp
->gm_enable
) {
59 pim_ifchannel_membership_clear(ifp
);
63 * When PIM is disabled on interface, IGMPv3 local membership
64 * information is not injected into PIM interface state.
66 * The function pim_if_membership_refresh() fetches all IGMPv3 local
67 * membership information into PIM. It is intented to be called
68 * whenever PIM is enabled on the interface in order to collect missed
69 * local membership information.
71 static void pim_if_membership_refresh(struct interface
*ifp
)
73 struct pim_interface
*pim_ifp
;
74 struct listnode
*grpnode
;
81 if (!pim_ifp
->pim_enable
)
83 if (!pim_ifp
->gm_enable
)
87 * First clear off membership from all PIM (S,G) entries on the
91 pim_ifchannel_membership_clear(ifp
);
94 * Then restore PIM (S,G) membership from all IGMPv3 (S,G) entries on
98 /* scan igmp groups */
99 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_group_list
, grpnode
, grp
)) {
100 struct listnode
*srcnode
;
101 struct gm_source
*src
;
103 /* scan group sources */
104 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
, srcnode
,
107 if (IGMP_SOURCE_TEST_FORWARDING(src
->source_flags
)) {
110 memset(&sg
, 0, sizeof(sg
));
111 sg
.src
= src
->source_addr
;
112 sg
.grp
= grp
->group_addr
;
113 pim_ifchannel_local_membership_add(
114 ifp
, &sg
, false /*is_vxlan*/);
117 } /* scan group sources */
118 } /* scan igmp groups */
121 * Finally delete every PIM (S,G) entry lacking all state info
124 pim_ifchannel_delete_on_noinfo(ifp
);
127 static int pim_cmd_interface_add(struct interface
*ifp
)
129 struct pim_interface
*pim_ifp
= ifp
->info
;
132 pim_ifp
= pim_if_new(ifp
, false, true, false, false);
134 pim_ifp
->pim_enable
= true;
136 pim_if_addr_add_all(ifp
);
137 pim_upstream_nh_if_update(pim_ifp
->pim
, ifp
);
138 pim_if_membership_refresh(ifp
);
140 pim_if_create_pimreg(pim_ifp
->pim
);
144 static int pim_cmd_interface_delete(struct interface
*ifp
)
146 struct pim_interface
*pim_ifp
= ifp
->info
;
151 pim_ifp
->pim_enable
= false;
153 pim_if_membership_clear(ifp
);
156 * pim_sock_delete() removes all neighbors from
157 * pim_ifp->pim_neighbor_list.
159 pim_sock_delete(ifp
, "pim unconfigured on interface");
160 pim_upstream_nh_if_update(pim_ifp
->pim
, ifp
);
162 if (!pim_ifp
->gm_enable
) {
163 pim_if_addr_del_all(ifp
);
170 static int interface_pim_use_src_cmd_worker(struct interface
*ifp
,
171 pim_addr source_addr
, char *errmsg
, size_t errmsg_len
)
176 result
= pim_update_source_set(ifp
, source_addr
);
181 case PIM_IFACE_NOT_FOUND
:
183 snprintf(errmsg
, errmsg_len
,
184 "Pim not enabled on this interface %s",
187 case PIM_UPDATE_SOURCE_DUP
:
189 snprintf(errmsg
, errmsg_len
, "Source already set");
193 snprintf(errmsg
, errmsg_len
, "Source set failed");
199 static int pim_cmd_spt_switchover(struct pim_instance
*pim
,
200 enum pim_spt_switchover spt
,
203 pim
->spt
.switchover
= spt
;
205 switch (pim
->spt
.switchover
) {
206 case PIM_SPT_IMMEDIATE
:
207 XFREE(MTYPE_PIM_PLIST_NAME
, pim
->spt
.plist
);
209 pim_upstream_add_lhr_star_pimreg(pim
);
211 case PIM_SPT_INFINITY
:
212 pim_upstream_remove_lhr_star_pimreg(pim
, plist
);
214 XFREE(MTYPE_PIM_PLIST_NAME
, pim
->spt
.plist
);
217 pim
->spt
.plist
= XSTRDUP(MTYPE_PIM_PLIST_NAME
, plist
);
224 static int pim_ssm_cmd_worker(struct pim_instance
*pim
, const char *plist
,
225 char *errmsg
, size_t errmsg_len
)
227 int result
= pim_ssm_range_set(pim
, pim
->vrf
->vrf_id
, plist
);
230 if (result
== PIM_SSM_ERR_NONE
)
234 case PIM_SSM_ERR_NO_VRF
:
235 snprintf(errmsg
, errmsg_len
,
236 "VRF doesn't exist");
238 case PIM_SSM_ERR_DUP
:
239 snprintf(errmsg
, errmsg_len
,
243 snprintf(errmsg
, errmsg_len
,
244 "ssm range config failed");
250 static int pim_rp_cmd_worker(struct pim_instance
*pim
, pim_addr rp_addr
,
251 struct prefix group
, const char *plist
,
252 char *errmsg
, size_t errmsg_len
)
256 result
= pim_rp_new(pim
, rp_addr
, group
, plist
, RP_SRC_STATIC
);
258 if (result
== PIM_RP_NO_PATH
) {
259 snprintfrr(errmsg
, errmsg_len
,
260 "No Path to RP address specified: %pPA", &rp_addr
);
261 return NB_ERR_INCONSISTENCY
;
264 if (result
== PIM_GROUP_OVERLAP
) {
265 snprintf(errmsg
, errmsg_len
,
266 "Group range specified cannot exact match another");
267 return NB_ERR_INCONSISTENCY
;
270 if (result
== PIM_GROUP_PFXLIST_OVERLAP
) {
271 snprintf(errmsg
, errmsg_len
,
272 "This group is already covered by a RP prefix-list");
273 return NB_ERR_INCONSISTENCY
;
276 if (result
== PIM_RP_PFXLIST_IN_USE
) {
277 snprintf(errmsg
, errmsg_len
,
278 "The same prefix-list cannot be applied to multiple RPs");
279 return NB_ERR_INCONSISTENCY
;
285 static int pim_no_rp_cmd_worker(struct pim_instance
*pim
, pim_addr rp_addr
,
286 struct prefix group
, const char *plist
,
287 char *errmsg
, size_t errmsg_len
)
289 char group_str
[PREFIX2STR_BUFFER
];
292 prefix2str(&group
, group_str
, sizeof(group_str
));
294 result
= pim_rp_del(pim
, rp_addr
, group
, plist
, RP_SRC_STATIC
);
296 if (result
== PIM_GROUP_BAD_ADDRESS
) {
297 snprintf(errmsg
, errmsg_len
,
298 "Bad group address specified: %s", group_str
);
299 return NB_ERR_INCONSISTENCY
;
302 if (result
== PIM_RP_BAD_ADDRESS
) {
303 snprintfrr(errmsg
, errmsg_len
, "Bad RP address specified: %pPA",
305 return NB_ERR_INCONSISTENCY
;
308 if (result
== PIM_RP_NOT_FOUND
) {
309 snprintf(errmsg
, errmsg_len
,
310 "Unable to find specified RP");
311 return NB_ERR_INCONSISTENCY
;
317 static bool is_pim_interface(const struct lyd_node
*dnode
)
319 char if_xpath
[XPATH_MAXLEN
];
320 const struct lyd_node
*pim_enable_dnode
;
321 const struct lyd_node
*igmp_enable_dnode
;
323 yang_dnode_get_path(dnode
, if_xpath
, sizeof(if_xpath
));
325 yang_dnode_getf(dnode
,
326 "%s/frr-pim:pim/address-family[address-family='%s']/pim-enable",
327 if_xpath
, FRR_PIM_AF_XPATH_VAL
);
328 igmp_enable_dnode
= yang_dnode_getf(dnode
,
329 "%s/frr-gmp:gmp/address-family[address-family='%s']/enable",
330 if_xpath
, FRR_PIM_AF_XPATH_VAL
);
332 if (((pim_enable_dnode
) &&
333 (yang_dnode_get_bool(pim_enable_dnode
, "."))) ||
334 ((igmp_enable_dnode
) &&
335 (yang_dnode_get_bool(igmp_enable_dnode
, "."))))
341 static int pim_cmd_gm_start(struct interface
*ifp
)
343 struct pim_interface
*pim_ifp
;
344 uint8_t need_startup
= 0;
349 pim_ifp
= pim_if_new(ifp
, true, false, false, false);
352 if (!pim_ifp
->gm_enable
) {
353 pim_ifp
->gm_enable
= true;
357 pim_if_create_pimreg(pim_ifp
->pim
);
359 /* 'ip igmp' executed multiple times, with need_startup
360 * avoid multiple if add all and membership refresh
363 pim_if_addr_add_all(ifp
);
364 pim_if_membership_refresh(ifp
);
371 * CLI reconfiguration affects the interface level (struct pim_interface).
372 * This function propagates the reconfiguration to every active socket
373 * for that interface.
376 static void igmp_sock_query_interval_reconfig(struct gm_sock
*igmp
)
378 struct interface
*ifp
;
379 struct pim_interface
*pim_ifp
;
382 assert(igmp
->interface
);
383 assert(igmp
->interface
->info
);
385 ifp
= igmp
->interface
;
388 if (PIM_DEBUG_GM_TRACE
)
389 zlog_debug("%s: Querier %pPAs on %s reconfig query_interval=%d",
390 __func__
, &igmp
->ifaddr
, ifp
->name
,
391 pim_ifp
->gm_default_query_interval
);
394 * igmp_startup_mode_on() will reset QQI:
396 * igmp->querier_query_interval = pim_ifp->gm_default_query_interval;
398 igmp_startup_mode_on(igmp
);
401 static void igmp_sock_query_reschedule(struct gm_sock
*igmp
)
403 if (igmp
->mtrace_only
)
406 if (igmp
->t_igmp_query_timer
) {
407 /* other querier present */
408 assert(igmp
->t_igmp_query_timer
);
409 assert(!igmp
->t_other_querier_timer
);
411 pim_igmp_general_query_off(igmp
);
412 pim_igmp_general_query_on(igmp
);
414 assert(igmp
->t_igmp_query_timer
);
415 assert(!igmp
->t_other_querier_timer
);
417 /* this is the querier */
419 assert(!igmp
->t_igmp_query_timer
);
420 assert(igmp
->t_other_querier_timer
);
422 pim_igmp_other_querier_timer_off(igmp
);
423 pim_igmp_other_querier_timer_on(igmp
);
425 assert(!igmp
->t_igmp_query_timer
);
426 assert(igmp
->t_other_querier_timer
);
429 #endif /* PIM_IPV == 4 */
432 static void change_query_interval(struct pim_interface
*pim_ifp
,
435 struct listnode
*sock_node
;
436 struct gm_sock
*igmp
;
438 pim_ifp
->gm_default_query_interval
= query_interval
;
440 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_socket_list
, sock_node
, igmp
)) {
441 igmp_sock_query_interval_reconfig(igmp
);
442 igmp_sock_query_reschedule(igmp
);
447 static void change_query_max_response_time(struct interface
*ifp
,
448 int query_max_response_time_dsec
)
451 struct listnode
*sock_node
;
452 struct gm_sock
*igmp
;
453 struct listnode
*grp_node
;
454 struct gm_group
*grp
;
457 struct pim_interface
*pim_ifp
= ifp
->info
;
459 if (pim_ifp
->gm_query_max_response_time_dsec
==
460 query_max_response_time_dsec
)
463 pim_ifp
->gm_query_max_response_time_dsec
= query_max_response_time_dsec
;
469 * Below we modify socket/group/source timers in order to quickly
470 * reflect the change. Otherwise, those timers would args->eventually
474 /* scan all sockets */
475 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_socket_list
, sock_node
, igmp
)) {
476 /* reschedule socket general query */
477 igmp_sock_query_reschedule(igmp
);
480 /* scan socket groups */
481 for (ALL_LIST_ELEMENTS_RO(pim_ifp
->gm_group_list
, grp_node
, grp
)) {
482 struct listnode
*src_node
;
483 struct gm_source
*src
;
485 /* reset group timers for groups in EXCLUDE mode */
486 if (grp
->group_filtermode_isexcl
)
487 igmp_group_reset_gmi(grp
);
489 /* scan group sources */
490 for (ALL_LIST_ELEMENTS_RO(grp
->group_source_list
, src_node
,
493 /* reset source timers for sources with running
496 if (src
->t_source_timer
)
497 igmp_source_reset_gmi(grp
, src
);
500 #endif /* PIM_IPV == 4 */
503 int routing_control_plane_protocols_name_validate(
504 struct nb_cb_create_args
*args
)
508 name
= yang_dnode_get_string(args
->dnode
, "./name");
509 if (!strmatch(name
, "pim")) {
510 snprintf(args
->errmsg
, args
->errmsg_len
,
511 "pim supports only one instance with name pimd");
512 return NB_ERR_VALIDATION
;
518 * XPath: /frr-pim:pim/address-family
520 int pim_address_family_create(struct nb_cb_create_args
*args
)
522 switch (args
->event
) {
533 int pim_address_family_destroy(struct nb_cb_destroy_args
*args
)
535 switch (args
->event
) {
547 * XPath: /frr-pim:pim/address-family/packets
549 int pim_address_family_packets_modify(struct nb_cb_modify_args
*args
)
551 switch (args
->event
) {
557 router
->packet_process
= yang_dnode_get_uint8(args
->dnode
,
566 * XPath: /frr-pim:pim/address-family/join-prune-interval
568 int pim_address_family_join_prune_interval_modify(
569 struct nb_cb_modify_args
*args
)
571 switch (args
->event
) {
577 router
->t_periodic
= yang_dnode_get_uint16(args
->dnode
, NULL
);
585 * XPath: /frr-pim:pim/address-family/register-suppress-time
587 int pim_address_family_register_suppress_time_modify(
588 struct nb_cb_modify_args
*args
)
591 switch (args
->event
) {
593 value
= yang_dnode_get_uint16(args
->dnode
, NULL
);
595 * As soon as this is non-constant it needs to be replaced with
596 * a yang_dnode_get to lookup the candidate value, *not* the
597 * operational value. Since the code has a field assigned and
598 * used for this value it should have YANG/CLI to set it too,
599 * otherwise just use the #define!
601 /* RFC7761: 4.11. Timer Values */
602 if (value
<= router
->register_probe_time
* 2) {
604 args
->errmsg
, args
->errmsg_len
,
605 "Register suppress time (%u) must be more than "
606 "twice the register probe time (%u).",
607 value
, router
->register_probe_time
);
608 return NB_ERR_VALIDATION
;
615 pim_update_suppress_timers(
616 yang_dnode_get_uint16(args
->dnode
, NULL
));
624 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/ecmp
626 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ecmp_modify(
627 struct nb_cb_modify_args
*args
)
630 struct pim_instance
*pim
;
632 switch (args
->event
) {
638 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
640 pim
->ecmp_enable
= yang_dnode_get_bool(args
->dnode
, NULL
);
647 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/ecmp-rebalance
649 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ecmp_rebalance_modify(
650 struct nb_cb_modify_args
*args
)
653 struct pim_instance
*pim
;
655 switch (args
->event
) {
661 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
663 pim
->ecmp_rebalance_enable
=
664 yang_dnode_get_bool(args
->dnode
, NULL
);
671 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/keep-alive-timer
673 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_keep_alive_timer_modify(
674 struct nb_cb_modify_args
*args
)
677 struct pim_instance
*pim
;
679 switch (args
->event
) {
685 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
687 pim
->keep_alive_time
= yang_dnode_get_uint16(args
->dnode
, NULL
);
695 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/rp-keep-alive-timer
697 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_keep_alive_timer_modify(
698 struct nb_cb_modify_args
*args
)
701 struct pim_instance
*pim
;
703 switch (args
->event
) {
709 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
711 pim
->rp_keep_alive_time
= yang_dnode_get_uint16(args
->dnode
,
720 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family
722 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_create(
723 struct nb_cb_create_args
*args
)
725 switch (args
->event
) {
736 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_destroy(
737 struct nb_cb_destroy_args
*args
)
739 switch (args
->event
) {
751 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/send-v6-secondary
753 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_send_v6_secondary_modify(
754 struct nb_cb_modify_args
*args
)
757 struct pim_instance
*pim
;
759 switch (args
->event
) {
765 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
767 pim
->send_v6_secondary
= yang_dnode_get_bool(args
->dnode
, NULL
);
774 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_send_v6_secondary_destroy(
775 struct nb_cb_destroy_args
*args
)
777 switch (args
->event
) {
790 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/spt-switchover
792 void routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_apply_finish(
793 struct nb_cb_apply_finish_args
*args
)
796 struct pim_instance
*pim
;
797 int spt_switch_action
;
798 const char *prefix_list
= NULL
;
800 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
802 spt_switch_action
= yang_dnode_get_enum(args
->dnode
, "./spt-action");
804 switch (spt_switch_action
) {
805 case PIM_SPT_INFINITY
:
806 if (yang_dnode_exists(args
->dnode
,
807 "./spt-infinity-prefix-list"))
808 prefix_list
= yang_dnode_get_string(
809 args
->dnode
, "./spt-infinity-prefix-list");
811 pim_cmd_spt_switchover(pim
, PIM_SPT_INFINITY
,
814 case PIM_SPT_IMMEDIATE
:
815 pim_cmd_spt_switchover(pim
, PIM_SPT_IMMEDIATE
, NULL
);
820 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/spt-switchover/spt-action
822 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_action_modify(
823 struct nb_cb_modify_args
*args
)
825 switch (args
->event
) {
837 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/spt-switchover/spt-infinity-prefix-list
839 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_infinity_prefix_list_modify(
840 struct nb_cb_modify_args
*args
)
842 switch (args
->event
) {
853 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_spt_switchover_spt_infinity_prefix_list_destroy(
854 struct nb_cb_destroy_args
*args
)
856 switch (args
->event
) {
868 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/ssm-prefix-list
870 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_prefix_list_modify(
871 struct nb_cb_modify_args
*args
)
874 struct pim_instance
*pim
;
875 const char *plist_name
;
878 switch (args
->event
) {
884 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
886 plist_name
= yang_dnode_get_string(args
->dnode
, NULL
);
887 result
= pim_ssm_cmd_worker(pim
, plist_name
, args
->errmsg
,
891 return NB_ERR_INCONSISTENCY
;
899 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_prefix_list_destroy(
900 struct nb_cb_destroy_args
*args
)
903 struct pim_instance
*pim
;
906 switch (args
->event
) {
912 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
914 result
= pim_ssm_cmd_worker(pim
, NULL
, args
->errmsg
,
918 return NB_ERR_INCONSISTENCY
;
927 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/ssm-pingd-source-ip
929 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_pingd_source_ip_create(
930 struct nb_cb_create_args
*args
)
933 struct pim_instance
*pim
;
935 pim_addr source_addr
;
937 switch (args
->event
) {
943 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
945 yang_dnode_get_pimaddr(&source_addr
, args
->dnode
,
947 result
= pim_ssmpingd_start(pim
, source_addr
);
950 args
->errmsg
, args
->errmsg_len
,
951 "%% Failure starting ssmpingd for source %pPA: %d",
952 &source_addr
, result
);
953 return NB_ERR_INCONSISTENCY
;
960 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ssm_pingd_source_ip_destroy(
961 struct nb_cb_destroy_args
*args
)
964 struct pim_instance
*pim
;
966 pim_addr source_addr
;
968 switch (args
->event
) {
974 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
976 yang_dnode_get_pimaddr(&source_addr
, args
->dnode
,
978 result
= pim_ssmpingd_stop(pim
, source_addr
);
981 args
->errmsg
, args
->errmsg_len
,
982 "%% Failure stopping ssmpingd for source %pPA: %d",
983 &source_addr
, result
);
984 return NB_ERR_INCONSISTENCY
;
995 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp/hold-time
997 int pim_msdp_hold_time_modify(struct nb_cb_modify_args
*args
)
999 struct pim_instance
*pim
;
1002 switch (args
->event
) {
1003 case NB_EV_VALIDATE
:
1008 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1010 pim
->msdp
.hold_time
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1019 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp/keep-alive
1021 int pim_msdp_keep_alive_modify(struct nb_cb_modify_args
*args
)
1023 struct pim_instance
*pim
;
1026 switch (args
->event
) {
1027 case NB_EV_VALIDATE
:
1032 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1034 pim
->msdp
.keep_alive
= yang_dnode_get_uint16(args
->dnode
, NULL
);
1043 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp/connection-retry
1045 int pim_msdp_connection_retry_modify(struct nb_cb_modify_args
*args
)
1047 struct pim_instance
*pim
;
1050 switch (args
->event
) {
1051 case NB_EV_VALIDATE
:
1056 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1058 pim
->msdp
.connection_retry
=
1059 yang_dnode_get_uint16(args
->dnode
, NULL
);
1066 pim6_msdp_err(pim_msdp_mesh_group_destroy
, nb_cb_destroy_args
);
1067 pim6_msdp_err(pim_msdp_mesh_group_create
, nb_cb_create_args
);
1068 pim6_msdp_err(pim_msdp_mesh_group_source_modify
, nb_cb_modify_args
);
1069 pim6_msdp_err(pim_msdp_mesh_group_source_destroy
, nb_cb_destroy_args
);
1070 pim6_msdp_err(pim_msdp_mesh_group_members_create
, nb_cb_create_args
);
1071 pim6_msdp_err(pim_msdp_mesh_group_members_destroy
, nb_cb_destroy_args
);
1072 pim6_msdp_err(routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_source_ip_modify
,
1074 pim6_msdp_err(routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_destroy
,
1075 nb_cb_destroy_args
);
1076 pim6_msdp_err(routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_create
,
1082 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-mesh-groups
1084 int pim_msdp_mesh_group_create(struct nb_cb_create_args
*args
)
1086 struct pim_msdp_mg
*mg
;
1089 switch (args
->event
) {
1090 case NB_EV_VALIDATE
:
1095 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1096 mg
= pim_msdp_mg_new(vrf
->info
, yang_dnode_get_string(
1097 args
->dnode
, "./name"));
1098 nb_running_set_entry(args
->dnode
, mg
);
1105 int pim_msdp_mesh_group_destroy(struct nb_cb_destroy_args
*args
)
1107 struct pim_msdp_mg
*mg
;
1110 switch (args
->event
) {
1111 case NB_EV_VALIDATE
:
1116 mg
= nb_running_unset_entry(args
->dnode
);
1117 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1118 pim_msdp_mg_free(vrf
->info
, &mg
);
1127 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-mesh-groups/source
1129 int pim_msdp_mesh_group_source_modify(struct nb_cb_modify_args
*args
)
1131 const struct lyd_node
*vrf_dnode
;
1132 struct pim_msdp_mg
*mg
;
1136 switch (args
->event
) {
1137 case NB_EV_VALIDATE
:
1142 mg
= nb_running_get_entry(args
->dnode
, NULL
, true);
1144 yang_dnode_get_parent(args
->dnode
, "address-family");
1145 vrf
= nb_running_get_entry(vrf_dnode
, "../../", true);
1146 yang_dnode_get_ip(&ip
, args
->dnode
, NULL
);
1148 pim_msdp_mg_src_add(vrf
->info
, mg
, &ip
.ip
._v4_addr
);
1154 int pim_msdp_mesh_group_source_destroy(struct nb_cb_destroy_args
*args
)
1156 const struct lyd_node
*vrf_dnode
;
1157 struct pim_msdp_mg
*mg
;
1159 struct in_addr addr
;
1161 switch (args
->event
) {
1162 case NB_EV_VALIDATE
:
1167 mg
= nb_running_get_entry(args
->dnode
, NULL
, true);
1169 yang_dnode_get_parent(args
->dnode
, "address-family");
1170 vrf
= nb_running_get_entry(vrf_dnode
, "../../", true);
1172 addr
.s_addr
= INADDR_ANY
;
1173 pim_msdp_mg_src_add(vrf
->info
, mg
, &addr
);
1182 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-mesh-groups/members
1184 int pim_msdp_mesh_group_members_create(struct nb_cb_create_args
*args
)
1186 const struct lyd_node
*vrf_dnode
;
1187 struct pim_msdp_mg_mbr
*mbr
;
1188 struct pim_msdp_mg
*mg
;
1192 switch (args
->event
) {
1193 case NB_EV_VALIDATE
:
1198 mg
= nb_running_get_entry(args
->dnode
, NULL
, true);
1200 yang_dnode_get_parent(args
->dnode
, "address-family");
1201 vrf
= nb_running_get_entry(vrf_dnode
, "../../", true);
1202 yang_dnode_get_ip(&ip
, args
->dnode
, "address");
1204 mbr
= pim_msdp_mg_mbr_add(vrf
->info
, mg
, &ip
.ip
._v4_addr
);
1205 nb_running_set_entry(args
->dnode
, mbr
);
1212 int pim_msdp_mesh_group_members_destroy(struct nb_cb_destroy_args
*args
)
1214 struct pim_msdp_mg_mbr
*mbr
;
1215 struct pim_msdp_mg
*mg
;
1216 const struct lyd_node
*mg_dnode
;
1218 switch (args
->event
) {
1219 case NB_EV_VALIDATE
:
1224 mbr
= nb_running_get_entry(args
->dnode
, NULL
, true);
1226 yang_dnode_get_parent(args
->dnode
, "msdp-mesh-groups");
1227 mg
= nb_running_get_entry(mg_dnode
, NULL
, true);
1228 pim_msdp_mg_mbr_del(mg
, mbr
);
1229 nb_running_unset_entry(args
->dnode
);
1237 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-peer
1239 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_create(
1240 struct nb_cb_create_args
*args
)
1242 struct pim_msdp_peer
*mp
;
1243 struct pim_instance
*pim
;
1245 struct ipaddr peer_ip
;
1246 struct ipaddr source_ip
;
1248 switch (args
->event
) {
1249 case NB_EV_VALIDATE
:
1254 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1256 yang_dnode_get_ip(&peer_ip
, args
->dnode
, "./peer-ip");
1257 yang_dnode_get_ip(&source_ip
, args
->dnode
, "./source-ip");
1258 mp
= pim_msdp_peer_add(pim
, &peer_ip
.ipaddr_v4
,
1259 &source_ip
.ipaddr_v4
, NULL
);
1260 nb_running_set_entry(args
->dnode
, mp
);
1267 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_destroy(
1268 struct nb_cb_destroy_args
*args
)
1270 struct pim_msdp_peer
*mp
;
1272 switch (args
->event
) {
1273 case NB_EV_VALIDATE
:
1278 mp
= nb_running_unset_entry(args
->dnode
);
1279 pim_msdp_peer_del(&mp
);
1287 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-peer/source-ip
1289 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_source_ip_modify(
1290 struct nb_cb_modify_args
*args
)
1292 struct pim_msdp_peer
*mp
;
1293 struct ipaddr source_ip
;
1295 switch (args
->event
) {
1296 case NB_EV_VALIDATE
:
1301 mp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1302 yang_dnode_get_ip(&source_ip
, args
->dnode
, NULL
);
1303 pim_msdp_peer_change_source(mp
, &source_ip
.ipaddr_v4
);
1309 #endif /* PIM_IPV != 6 */
1312 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag
1314 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_create(
1315 struct nb_cb_create_args
*args
)
1317 switch (args
->event
) {
1318 case NB_EV_VALIDATE
:
1328 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_destroy(
1329 struct nb_cb_destroy_args
*args
)
1331 struct in_addr addr
;
1333 switch (args
->event
) {
1334 case NB_EV_VALIDATE
:
1340 pim_vxlan_mlag_update(true/*mlag_enable*/,
1341 false/*peer_state*/, MLAG_ROLE_NONE
,
1342 NULL
/*peerlink*/, &addr
);
1350 * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag
1352 void routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_apply_finish(
1353 struct nb_cb_apply_finish_args
*args
)
1358 struct interface
*ifp
;
1359 struct ipaddr reg_addr
;
1361 ifname
= yang_dnode_get_string(args
->dnode
, "./peerlink-rif");
1362 ifp
= if_lookup_by_name(ifname
, VRF_DEFAULT
);
1364 snprintf(args
->errmsg
, args
->errmsg_len
,
1365 "No such interface name %s", ifname
);
1368 role
= yang_dnode_get_enum(args
->dnode
, "./my-role");
1369 peer_state
= yang_dnode_get_bool(args
->dnode
, "./peer-state");
1370 yang_dnode_get_ip(®_addr
, args
->dnode
, "./reg-address");
1372 pim_vxlan_mlag_update(true, peer_state
, role
, ifp
,
1373 ®_addr
.ip
._v4_addr
);
1378 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/peerlink-rif
1380 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peerlink_rif_modify(
1381 struct nb_cb_modify_args
*args
)
1383 switch (args
->event
) {
1384 case NB_EV_VALIDATE
:
1394 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peerlink_rif_destroy(
1395 struct nb_cb_destroy_args
*args
)
1397 switch (args
->event
) {
1398 case NB_EV_VALIDATE
:
1409 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/reg-address
1411 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_reg_address_modify(
1412 struct nb_cb_modify_args
*args
)
1414 switch (args
->event
) {
1415 case NB_EV_VALIDATE
:
1425 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_reg_address_destroy(
1426 struct nb_cb_destroy_args
*args
)
1428 switch (args
->event
) {
1429 case NB_EV_VALIDATE
:
1440 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/my-role
1442 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_my_role_modify(
1443 struct nb_cb_modify_args
*args
)
1445 switch (args
->event
) {
1446 case NB_EV_VALIDATE
:
1457 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/mlag/peer-state
1459 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_mlag_peer_state_modify(
1460 struct nb_cb_modify_args
*args
)
1462 switch (args
->event
) {
1463 case NB_EV_VALIDATE
:
1474 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/register-accept-list
1476 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_register_accept_list_modify(
1477 struct nb_cb_modify_args
*args
)
1480 struct pim_instance
*pim
;
1483 switch (args
->event
) {
1484 case NB_EV_VALIDATE
:
1489 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1491 plist
= yang_dnode_get_string(args
->dnode
, NULL
);
1493 XFREE(MTYPE_PIM_PLIST_NAME
, pim
->register_plist
);
1494 pim
->register_plist
= XSTRDUP(MTYPE_PIM_PLIST_NAME
, plist
);
1502 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_register_accept_list_destroy(
1503 struct nb_cb_destroy_args
*args
)
1506 struct pim_instance
*pim
;
1508 switch (args
->event
) {
1509 case NB_EV_VALIDATE
:
1514 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
1517 XFREE(MTYPE_PIM_PLIST_NAME
, pim
->register_plist
);
1525 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family
1527 int lib_interface_pim_address_family_create(struct nb_cb_create_args
*args
)
1529 switch (args
->event
) {
1530 case NB_EV_VALIDATE
:
1540 int lib_interface_pim_address_family_destroy(struct nb_cb_destroy_args
*args
)
1542 struct interface
*ifp
;
1543 struct pim_interface
*pim_ifp
;
1545 switch (args
->event
) {
1546 case NB_EV_VALIDATE
:
1551 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1552 pim_ifp
= ifp
->info
;
1556 if (!pim_cmd_interface_delete(ifp
)) {
1557 snprintf(args
->errmsg
, args
->errmsg_len
,
1558 "Unable to delete interface information %s",
1560 return NB_ERR_INCONSISTENCY
;
1568 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/pim-enable
1570 int lib_interface_pim_address_family_pim_enable_modify(struct nb_cb_modify_args
*args
)
1572 struct interface
*ifp
;
1573 struct pim_interface
*pim_ifp
;
1575 const struct lyd_node
*if_dnode
;
1577 switch (args
->event
) {
1578 case NB_EV_VALIDATE
:
1579 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
1581 yang_get_list_elements_count(if_dnode
);
1583 /* Limiting mcast interfaces to number of VIFs */
1584 if (mcast_if_count
== MAXVIFS
) {
1585 snprintf(args
->errmsg
, args
->errmsg_len
,
1586 "Max multicast interfaces(%d) reached.",
1588 return NB_ERR_VALIDATION
;
1595 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1597 if (yang_dnode_get_bool(args
->dnode
, NULL
)) {
1598 if (!pim_cmd_interface_add(ifp
)) {
1599 snprintf(args
->errmsg
, args
->errmsg_len
,
1600 "Could not enable PIM SM on interface %s",
1602 return NB_ERR_INCONSISTENCY
;
1605 pim_ifp
= ifp
->info
;
1607 return NB_ERR_INCONSISTENCY
;
1609 if (!pim_cmd_interface_delete(ifp
)) {
1610 snprintf(args
->errmsg
, args
->errmsg_len
,
1611 "Unable to delete interface information");
1612 return NB_ERR_INCONSISTENCY
;
1623 * /frr-interface:lib/interface/frr-pim:pim/address-family/pim-passive-enable
1625 int lib_interface_pim_address_family_pim_passive_enable_modify(
1626 struct nb_cb_modify_args
*args
)
1628 struct interface
*ifp
;
1629 struct pim_interface
*pim_ifp
;
1631 switch (args
->event
) {
1632 case NB_EV_VALIDATE
:
1637 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1638 pim_ifp
= ifp
->info
;
1639 pim_ifp
->pim_passive_enable
=
1640 yang_dnode_get_bool(args
->dnode
, NULL
);
1648 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/hello-interval
1650 int lib_interface_pim_address_family_hello_interval_modify(
1651 struct nb_cb_modify_args
*args
)
1653 struct interface
*ifp
;
1654 struct pim_interface
*pim_ifp
;
1656 switch (args
->event
) {
1657 case NB_EV_VALIDATE
:
1662 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1663 pim_ifp
= ifp
->info
;
1664 pim_ifp
->pim_hello_period
=
1665 yang_dnode_get_uint8(args
->dnode
, NULL
);
1666 pim_ifp
->pim_default_holdtime
= -1;
1674 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/hello-holdtime
1676 int lib_interface_pim_address_family_hello_holdtime_modify(
1677 struct nb_cb_modify_args
*args
)
1679 struct interface
*ifp
;
1680 struct pim_interface
*pim_ifp
;
1682 switch (args
->event
) {
1683 case NB_EV_VALIDATE
:
1688 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1689 pim_ifp
= ifp
->info
;
1690 pim_ifp
->pim_default_holdtime
=
1691 yang_dnode_get_uint16(args
->dnode
, NULL
);
1699 int lib_interface_pim_address_family_hello_holdtime_destroy(
1700 struct nb_cb_destroy_args
*args
)
1702 struct interface
*ifp
;
1703 struct pim_interface
*pim_ifp
;
1705 switch (args
->event
) {
1706 case NB_EV_VALIDATE
:
1711 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1712 pim_ifp
= ifp
->info
;
1713 pim_ifp
->pim_default_holdtime
= -1;
1720 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/bfd
1722 int lib_interface_pim_address_family_bfd_create(struct nb_cb_create_args
*args
)
1724 struct interface
*ifp
;
1725 struct pim_interface
*pim_ifp
;
1727 switch (args
->event
) {
1728 case NB_EV_VALIDATE
:
1734 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1735 pim_ifp
= ifp
->info
;
1736 pim_ifp
->bfd_config
.enabled
= true;
1743 int lib_interface_pim_address_family_bfd_destroy(
1744 struct nb_cb_destroy_args
*args
)
1746 struct interface
*ifp
;
1747 struct pim_interface
*pim_ifp
;
1748 const struct lyd_node
*if_dnode
;
1750 switch (args
->event
) {
1751 case NB_EV_VALIDATE
:
1752 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
1753 if (!is_pim_interface(if_dnode
)) {
1754 snprintf(args
->errmsg
, args
->errmsg_len
,
1755 "Pim not enabled on this interface");
1756 return NB_ERR_VALIDATION
;
1763 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1764 pim_ifp
= ifp
->info
;
1765 pim_ifp
->bfd_config
.enabled
= false;
1766 pim_bfd_reg_dereg_all_nbr(ifp
);
1774 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/bfd
1776 void lib_interface_pim_address_family_bfd_apply_finish(
1777 struct nb_cb_apply_finish_args
*args
)
1779 struct interface
*ifp
;
1780 struct pim_interface
*pim_ifp
;
1782 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1783 pim_ifp
= ifp
->info
;
1786 zlog_debug("Pim not enabled on this interface");
1790 pim_ifp
->bfd_config
.detection_multiplier
=
1791 yang_dnode_get_uint8(args
->dnode
, "./detect_mult");
1792 pim_ifp
->bfd_config
.min_rx
=
1793 yang_dnode_get_uint16(args
->dnode
, "./min-rx-interval");
1794 pim_ifp
->bfd_config
.min_tx
=
1795 yang_dnode_get_uint16(args
->dnode
, "./min-tx-interval");
1797 pim_bfd_reg_dereg_all_nbr(ifp
);
1801 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/bfd/min-rx-interval
1803 int lib_interface_pim_address_family_bfd_min_rx_interval_modify(
1804 struct nb_cb_modify_args
*args
)
1806 switch (args
->event
) {
1807 case NB_EV_VALIDATE
:
1818 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/bfd/min-tx-interval
1820 int lib_interface_pim_address_family_bfd_min_tx_interval_modify(
1821 struct nb_cb_modify_args
*args
)
1823 switch (args
->event
) {
1824 case NB_EV_VALIDATE
:
1835 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/bfd/detect_mult
1837 int lib_interface_pim_address_family_bfd_detect_mult_modify(
1838 struct nb_cb_modify_args
*args
)
1840 switch (args
->event
) {
1841 case NB_EV_VALIDATE
:
1852 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/bfd/profile
1854 int lib_interface_pim_address_family_bfd_profile_modify(
1855 struct nb_cb_modify_args
*args
)
1857 struct interface
*ifp
;
1858 struct pim_interface
*pim_ifp
;
1860 switch (args
->event
) {
1861 case NB_EV_VALIDATE
:
1867 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1868 pim_ifp
= ifp
->info
;
1869 XFREE(MTYPE_TMP
, pim_ifp
->bfd_config
.profile
);
1870 pim_ifp
->bfd_config
.profile
= XSTRDUP(
1871 MTYPE_TMP
, yang_dnode_get_string(args
->dnode
, NULL
));
1878 int lib_interface_pim_address_family_bfd_profile_destroy(
1879 struct nb_cb_destroy_args
*args
)
1881 struct interface
*ifp
;
1882 struct pim_interface
*pim_ifp
;
1884 switch (args
->event
) {
1885 case NB_EV_VALIDATE
:
1891 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1892 pim_ifp
= ifp
->info
;
1893 XFREE(MTYPE_TMP
, pim_ifp
->bfd_config
.profile
);
1901 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/bsm
1903 int lib_interface_pim_address_family_bsm_modify(struct nb_cb_modify_args
*args
)
1905 struct interface
*ifp
;
1906 struct pim_interface
*pim_ifp
;
1908 switch (args
->event
) {
1909 case NB_EV_VALIDATE
:
1914 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1915 pim_ifp
= ifp
->info
;
1916 pim_ifp
->bsm_enable
= yang_dnode_get_bool(args
->dnode
, NULL
);
1925 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/unicast-bsm
1927 int lib_interface_pim_address_family_unicast_bsm_modify(
1928 struct nb_cb_modify_args
*args
)
1930 struct interface
*ifp
;
1931 struct pim_interface
*pim_ifp
;
1933 switch (args
->event
) {
1934 case NB_EV_VALIDATE
:
1939 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1940 pim_ifp
= ifp
->info
;
1941 pim_ifp
->ucast_bsm_accept
=
1942 yang_dnode_get_bool(args
->dnode
, NULL
);
1951 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/active-active
1953 int lib_interface_pim_address_family_active_active_modify(
1954 struct nb_cb_modify_args
*args
)
1956 struct interface
*ifp
;
1957 struct pim_interface
*pim_ifp
;
1959 switch (args
->event
) {
1960 case NB_EV_VALIDATE
:
1965 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
1966 pim_ifp
= ifp
->info
;
1967 if (yang_dnode_get_bool(args
->dnode
, NULL
)) {
1970 "Configuring PIM active-active on Interface: %s",
1972 pim_if_configure_mlag_dualactive(pim_ifp
);
1976 "UnConfiguring PIM active-active on Interface: %s",
1978 pim_if_unconfigure_mlag_dualactive(pim_ifp
);
1989 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/dr-priority
1991 int lib_interface_pim_address_family_dr_priority_modify(
1992 struct nb_cb_modify_args
*args
)
1994 struct interface
*ifp
;
1995 struct pim_interface
*pim_ifp
;
1996 uint32_t old_dr_prio
;
1997 const struct lyd_node
*if_dnode
;
1999 switch (args
->event
) {
2000 case NB_EV_VALIDATE
:
2001 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2002 if (!is_pim_interface(if_dnode
)) {
2003 snprintf(args
->errmsg
, args
->errmsg_len
,
2004 "Pim not enabled on this interface");
2005 return NB_ERR_VALIDATION
;
2012 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2013 pim_ifp
= ifp
->info
;
2014 old_dr_prio
= pim_ifp
->pim_dr_priority
;
2015 pim_ifp
->pim_dr_priority
= yang_dnode_get_uint32(args
->dnode
,
2018 if (old_dr_prio
!= pim_ifp
->pim_dr_priority
) {
2019 pim_if_dr_election(ifp
);
2020 pim_hello_restart_now(ifp
);
2029 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/use-source
2031 int lib_interface_pim_address_family_use_source_modify(
2032 struct nb_cb_modify_args
*args
)
2034 struct interface
*ifp
;
2035 pim_addr source_addr
;
2037 const struct lyd_node
*if_dnode
;
2039 switch (args
->event
) {
2040 case NB_EV_VALIDATE
:
2041 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2042 if (!is_pim_interface(if_dnode
)) {
2043 snprintf(args
->errmsg
, args
->errmsg_len
,
2044 "Pim not enabled on this interface");
2045 return NB_ERR_VALIDATION
;
2052 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2054 yang_dnode_get_ipv4(&source_addr
, args
->dnode
, NULL
);
2056 yang_dnode_get_ipv6(&source_addr
, args
->dnode
, NULL
);
2059 result
= interface_pim_use_src_cmd_worker(
2061 args
->errmsg
, args
->errmsg_len
);
2063 if (result
!= PIM_SUCCESS
)
2064 return NB_ERR_INCONSISTENCY
;
2072 int lib_interface_pim_address_family_use_source_destroy(
2073 struct nb_cb_destroy_args
*args
)
2075 struct interface
*ifp
;
2077 const struct lyd_node
*if_dnode
;
2079 switch (args
->event
) {
2080 case NB_EV_VALIDATE
:
2081 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2082 if (!is_pim_interface(if_dnode
)) {
2083 snprintf(args
->errmsg
, args
->errmsg_len
,
2084 "Pim not enabled on this interface");
2085 return NB_ERR_VALIDATION
;
2092 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2094 result
= interface_pim_use_src_cmd_worker(ifp
, PIMADDR_ANY
,
2098 if (result
!= PIM_SUCCESS
)
2099 return NB_ERR_INCONSISTENCY
;
2108 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/multicast-boundary-oil
2110 int lib_interface_pim_address_family_multicast_boundary_oil_modify(
2111 struct nb_cb_modify_args
*args
)
2113 struct interface
*ifp
;
2114 struct pim_interface
*pim_ifp
;
2116 const struct lyd_node
*if_dnode
;
2118 switch (args
->event
) {
2119 case NB_EV_VALIDATE
:
2120 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2121 if (!is_pim_interface(if_dnode
)) {
2122 snprintf(args
->errmsg
, args
->errmsg_len
,
2123 "Pim not enabled on this interface");
2124 return NB_ERR_VALIDATION
;
2131 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2132 pim_ifp
= ifp
->info
;
2133 plist
= yang_dnode_get_string(args
->dnode
, NULL
);
2135 if (pim_ifp
->boundary_oil_plist
)
2136 XFREE(MTYPE_PIM_INTERFACE
, pim_ifp
->boundary_oil_plist
);
2138 pim_ifp
->boundary_oil_plist
=
2139 XSTRDUP(MTYPE_PIM_INTERFACE
, plist
);
2147 int lib_interface_pim_address_family_multicast_boundary_oil_destroy(
2148 struct nb_cb_destroy_args
*args
)
2150 struct interface
*ifp
;
2151 struct pim_interface
*pim_ifp
;
2152 const struct lyd_node
*if_dnode
;
2154 switch (args
->event
) {
2155 case NB_EV_VALIDATE
:
2156 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2157 if (!is_pim_interface(if_dnode
)) {
2158 snprintf(args
->errmsg
, args
->errmsg_len
,
2159 "%% Enable PIM and/or IGMP on this interface first");
2160 return NB_ERR_VALIDATION
;
2167 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2168 pim_ifp
= ifp
->info
;
2169 if (pim_ifp
->boundary_oil_plist
)
2170 XFREE(MTYPE_PIM_INTERFACE
, pim_ifp
->boundary_oil_plist
);
2178 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/mroute
2180 int lib_interface_pim_address_family_mroute_create(
2181 struct nb_cb_create_args
*args
)
2183 switch (args
->event
) {
2184 case NB_EV_VALIDATE
:
2194 int lib_interface_pim_address_family_mroute_destroy(
2195 struct nb_cb_destroy_args
*args
)
2197 struct pim_instance
*pim
;
2198 struct pim_interface
*pim_iifp
;
2199 struct interface
*iif
;
2200 struct interface
*oif
;
2201 const char *oifname
;
2202 pim_addr source_addr
;
2203 pim_addr group_addr
;
2204 const struct lyd_node
*if_dnode
;
2206 switch (args
->event
) {
2207 case NB_EV_VALIDATE
:
2208 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2209 if (!is_pim_interface(if_dnode
)) {
2210 snprintf(args
->errmsg
, args
->errmsg_len
,
2211 "%% Enable PIM and/or IGMP on this interface first");
2212 return NB_ERR_VALIDATION
;
2219 iif
= nb_running_get_entry(args
->dnode
, NULL
, true);
2220 pim_iifp
= iif
->info
;
2221 pim
= pim_iifp
->pim
;
2223 oifname
= yang_dnode_get_string(args
->dnode
, "./oif");
2224 oif
= if_lookup_by_name(oifname
, pim
->vrf
->vrf_id
);
2227 snprintf(args
->errmsg
, args
->errmsg_len
,
2228 "No such interface name %s",
2230 return NB_ERR_INCONSISTENCY
;
2233 yang_dnode_get_pimaddr(&source_addr
, args
->dnode
, "./source-addr");
2234 yang_dnode_get_pimaddr(&group_addr
, args
->dnode
, "./group-addr");
2236 if (pim_static_del(pim
, iif
, oif
, group_addr
, source_addr
)) {
2237 snprintf(args
->errmsg
, args
->errmsg_len
,
2238 "Failed to remove static mroute");
2239 return NB_ERR_INCONSISTENCY
;
2249 * XPath: /frr-interface:lib/interface/frr-pim:pim/address-family/mroute/oif
2251 int lib_interface_pim_address_family_mroute_oif_modify(
2252 struct nb_cb_modify_args
*args
)
2254 struct pim_instance
*pim
;
2255 struct pim_interface
*pim_iifp
;
2256 struct interface
*iif
;
2257 struct interface
*oif
;
2258 const char *oifname
;
2259 pim_addr source_addr
;
2260 pim_addr group_addr
;
2261 const struct lyd_node
*if_dnode
;
2263 switch (args
->event
) {
2264 case NB_EV_VALIDATE
:
2265 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2266 if (!is_pim_interface(if_dnode
)) {
2267 snprintf(args
->errmsg
, args
->errmsg_len
,
2268 "%% Enable PIM and/or IGMP on this interface first");
2269 return NB_ERR_VALIDATION
;
2272 #ifdef PIM_ENFORCE_LOOPFREE_MFC
2273 iif
= nb_running_get_entry(args
->dnode
, NULL
, false);
2278 pim_iifp
= iif
->info
;
2279 pim
= pim_iifp
->pim
;
2281 oifname
= yang_dnode_get_string(args
->dnode
, NULL
);
2282 oif
= if_lookup_by_name(oifname
, pim
->vrf
->vrf_id
);
2284 if (oif
&& (iif
->ifindex
== oif
->ifindex
)) {
2285 strlcpy(args
->errmsg
,
2286 "% IIF same as OIF and loopfree enforcement is enabled; rejecting",
2288 return NB_ERR_VALIDATION
;
2296 iif
= nb_running_get_entry(args
->dnode
, NULL
, true);
2297 pim_iifp
= iif
->info
;
2298 pim
= pim_iifp
->pim
;
2300 oifname
= yang_dnode_get_string(args
->dnode
, NULL
);
2301 oif
= if_lookup_by_name(oifname
, pim
->vrf
->vrf_id
);
2303 snprintf(args
->errmsg
, args
->errmsg_len
,
2304 "No such interface name %s",
2306 return NB_ERR_INCONSISTENCY
;
2309 yang_dnode_get_pimaddr(&source_addr
, args
->dnode
, "../source-addr");
2310 yang_dnode_get_pimaddr(&group_addr
, args
->dnode
, "../group-addr");
2312 if (pim_static_add(pim
, iif
, oif
, group_addr
, source_addr
)) {
2313 snprintf(args
->errmsg
, args
->errmsg_len
,
2314 "Failed to add static mroute");
2315 return NB_ERR_INCONSISTENCY
;
2324 int lib_interface_pim_address_family_mroute_oif_destroy(
2325 struct nb_cb_destroy_args
*args
)
2327 switch (args
->event
) {
2328 case NB_EV_VALIDATE
:
2339 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/frr-pim-rp:rp/static-rp/rp-list
2341 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_create(
2342 struct nb_cb_create_args
*args
)
2344 switch (args
->event
) {
2345 case NB_EV_VALIDATE
:
2355 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_destroy(
2356 struct nb_cb_destroy_args
*args
)
2359 struct pim_instance
*pim
;
2360 struct prefix group
;
2365 switch (args
->event
) {
2366 case NB_EV_VALIDATE
:
2371 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
2373 yang_dnode_get_pimaddr(&rp_addr
, args
->dnode
, "./rp-address");
2375 if (yang_dnode_get(args
->dnode
, "./group-list")) {
2376 yang_dnode_get_prefix(&group
, args
->dnode
,
2379 result
= pim_no_rp_cmd_worker(pim
, rp_addr
, group
, NULL
,
2384 else if (yang_dnode_get(args
->dnode
, "./prefix-list")) {
2385 plist
= yang_dnode_get_string(args
->dnode
,
2387 if (!pim_get_all_mcast_group(&group
)) {
2390 "Unable to convert 224.0.0.0/4 to prefix");
2391 return NB_ERR_INCONSISTENCY
;
2394 result
= pim_no_rp_cmd_worker(pim
, rp_addr
, group
,
2395 plist
, args
->errmsg
,
2400 return NB_ERR_INCONSISTENCY
;
2408 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/frr-pim-rp:rp/static-rp/rp-list/group-list
2410 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_group_list_create(
2411 struct nb_cb_create_args
*args
)
2414 struct pim_instance
*pim
;
2415 struct prefix group
;
2418 switch (args
->event
) {
2419 case NB_EV_VALIDATE
:
2424 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
2426 yang_dnode_get_pimaddr(&rp_addr
, args
->dnode
, "../rp-address");
2427 yang_dnode_get_prefix(&group
, args
->dnode
, NULL
);
2429 return pim_rp_cmd_worker(pim
, rp_addr
, group
, NULL
,
2430 args
->errmsg
, args
->errmsg_len
);
2436 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_group_list_destroy(
2437 struct nb_cb_destroy_args
*args
)
2440 struct pim_instance
*pim
;
2441 struct prefix group
;
2444 switch (args
->event
) {
2445 case NB_EV_VALIDATE
:
2450 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
2452 yang_dnode_get_pimaddr(&rp_addr
, args
->dnode
, "../rp-address");
2453 yang_dnode_get_prefix(&group
, args
->dnode
, NULL
);
2456 return pim_no_rp_cmd_worker(pim
, rp_addr
, group
, NULL
,
2457 args
->errmsg
, args
->errmsg_len
);
2464 * XPath: /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/frr-pim-rp:rp/static-rp/rp-list/prefix-list
2466 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_prefix_list_modify(
2467 struct nb_cb_modify_args
*args
)
2470 struct pim_instance
*pim
;
2471 struct prefix group
;
2475 switch (args
->event
) {
2476 case NB_EV_VALIDATE
:
2481 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
2483 plist
= yang_dnode_get_string(args
->dnode
, NULL
);
2484 yang_dnode_get_pimaddr(&rp_addr
, args
->dnode
, "../rp-address");
2485 if (!pim_get_all_mcast_group(&group
)) {
2486 flog_err(EC_LIB_DEVELOPMENT
,
2487 "Unable to convert 224.0.0.0/4 to prefix");
2488 return NB_ERR_INCONSISTENCY
;
2490 return pim_rp_cmd_worker(pim
, rp_addr
, group
, plist
,
2491 args
->errmsg
, args
->errmsg_len
);
2497 int routing_control_plane_protocols_control_plane_protocol_pim_address_family_rp_static_rp_rp_list_prefix_list_destroy(
2498 struct nb_cb_destroy_args
*args
)
2501 struct pim_instance
*pim
;
2502 struct prefix group
;
2506 switch (args
->event
) {
2507 case NB_EV_VALIDATE
:
2512 vrf
= nb_running_get_entry(args
->dnode
, NULL
, true);
2514 yang_dnode_get_pimaddr(&rp_addr
, args
->dnode
, "../rp-address");
2515 plist
= yang_dnode_get_string(args
->dnode
, NULL
);
2516 if (!pim_get_all_mcast_group(&group
)) {
2517 flog_err(EC_LIB_DEVELOPMENT
,
2518 "Unable to convert 224.0.0.0/4 to prefix");
2519 return NB_ERR_INCONSISTENCY
;
2521 return pim_no_rp_cmd_worker(pim
, rp_addr
, group
, plist
,
2522 args
->errmsg
, args
->errmsg_len
);
2530 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family
2532 int lib_interface_gmp_address_family_create(struct nb_cb_create_args
*args
)
2534 switch (args
->event
) {
2535 case NB_EV_VALIDATE
:
2545 int lib_interface_gmp_address_family_destroy(struct nb_cb_destroy_args
*args
)
2547 struct interface
*ifp
;
2548 struct pim_interface
*pim_ifp
;
2550 switch (args
->event
) {
2551 case NB_EV_VALIDATE
:
2556 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2557 pim_ifp
= ifp
->info
;
2562 pim_ifp
->gm_enable
= false;
2564 pim_if_membership_clear(ifp
);
2566 pim_if_addr_del_all_igmp(ifp
);
2568 if (!pim_ifp
->pim_enable
)
2576 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/enable
2578 int lib_interface_gmp_address_family_enable_modify(
2579 struct nb_cb_modify_args
*args
)
2581 struct interface
*ifp
;
2583 struct pim_interface
*pim_ifp
;
2585 const char *ifp_name
;
2586 const struct lyd_node
*if_dnode
;
2588 switch (args
->event
) {
2589 case NB_EV_VALIDATE
:
2590 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2592 yang_get_list_elements_count(if_dnode
);
2593 /* Limiting mcast interfaces to number of VIFs */
2594 if (mcast_if_count
== MAXVIFS
) {
2595 ifp_name
= yang_dnode_get_string(if_dnode
, "name");
2597 args
->errmsg
, args
->errmsg_len
,
2598 "Max multicast interfaces(%d) Reached. Could not enable %s on interface %s",
2599 MAXVIFS
, GM
, ifp_name
);
2600 return NB_ERR_VALIDATION
;
2607 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2608 gm_enable
= yang_dnode_get_bool(args
->dnode
, NULL
);
2611 return pim_cmd_gm_start(ifp
);
2614 pim_ifp
= ifp
->info
;
2617 return NB_ERR_INCONSISTENCY
;
2619 pim_ifp
->gm_enable
= false;
2621 pim_if_membership_clear(ifp
);
2624 pim_if_addr_del_all_igmp(ifp
);
2626 gm_ifp_teardown(ifp
);
2629 if (!pim_ifp
->pim_enable
)
2637 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/igmp-version
2639 int lib_interface_gmp_address_family_igmp_version_modify(
2640 struct nb_cb_modify_args
*args
)
2642 struct interface
*ifp
;
2643 struct pim_interface
*pim_ifp
;
2644 int igmp_version
, old_version
= 0;
2646 switch (args
->event
) {
2647 case NB_EV_VALIDATE
:
2652 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2653 pim_ifp
= ifp
->info
;
2656 return NB_ERR_INCONSISTENCY
;
2658 igmp_version
= yang_dnode_get_uint8(args
->dnode
, NULL
);
2659 old_version
= pim_ifp
->igmp_version
;
2660 pim_ifp
->igmp_version
= igmp_version
;
2662 /* Current and new version is different refresh existing
2663 * membership. Going from 3 -> 2 or 2 -> 3.
2665 if (old_version
!= igmp_version
)
2666 pim_if_membership_refresh(ifp
);
2674 int lib_interface_gmp_address_family_igmp_version_destroy(
2675 struct nb_cb_destroy_args
*args
)
2677 struct interface
*ifp
;
2678 struct pim_interface
*pim_ifp
;
2680 switch (args
->event
) {
2681 case NB_EV_VALIDATE
:
2686 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2687 pim_ifp
= ifp
->info
;
2688 pim_ifp
->igmp_version
= IGMP_DEFAULT_VERSION
;
2696 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/mld-version
2698 int lib_interface_gmp_address_family_mld_version_modify(
2699 struct nb_cb_modify_args
*args
)
2701 struct interface
*ifp
;
2702 struct pim_interface
*pim_ifp
;
2704 switch (args
->event
) {
2705 case NB_EV_VALIDATE
:
2710 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2711 pim_ifp
= ifp
->info
;
2713 return NB_ERR_INCONSISTENCY
;
2715 pim_ifp
->mld_version
= yang_dnode_get_uint8(args
->dnode
, NULL
);
2723 int lib_interface_gmp_address_family_mld_version_destroy(
2724 struct nb_cb_destroy_args
*args
)
2726 struct interface
*ifp
;
2727 struct pim_interface
*pim_ifp
;
2729 switch (args
->event
) {
2730 case NB_EV_VALIDATE
:
2735 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2736 pim_ifp
= ifp
->info
;
2738 return NB_ERR_INCONSISTENCY
;
2740 pim_ifp
->mld_version
= 2;
2749 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/query-interval
2751 int lib_interface_gmp_address_family_query_interval_modify(
2752 struct nb_cb_modify_args
*args
)
2754 struct interface
*ifp
;
2758 switch (args
->event
) {
2759 case NB_EV_VALIDATE
:
2764 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2765 query_interval
= yang_dnode_get_uint16(args
->dnode
, NULL
);
2766 change_query_interval(ifp
->info
, query_interval
);
2769 struct pim_interface
*pim_ifp
;
2771 switch (args
->event
) {
2772 case NB_EV_VALIDATE
:
2777 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2778 pim_ifp
= ifp
->info
;
2780 return NB_ERR_INCONSISTENCY
;
2782 query_interval
= yang_dnode_get_uint16(args
->dnode
, NULL
);
2783 pim_ifp
->gm_default_query_interval
= query_interval
;
2791 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/query-max-response-time
2793 int lib_interface_gmp_address_family_query_max_response_time_modify(
2794 struct nb_cb_modify_args
*args
)
2796 struct interface
*ifp
;
2797 int query_max_response_time_dsec
;
2799 switch (args
->event
) {
2800 case NB_EV_VALIDATE
:
2805 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2806 query_max_response_time_dsec
=
2807 yang_dnode_get_uint16(args
->dnode
, NULL
);
2808 change_query_max_response_time(ifp
,
2809 query_max_response_time_dsec
);
2816 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/last-member-query-interval
2818 int lib_interface_gmp_address_family_last_member_query_interval_modify(
2819 struct nb_cb_modify_args
*args
)
2821 struct interface
*ifp
;
2822 struct pim_interface
*pim_ifp
;
2823 int last_member_query_interval
;
2825 switch (args
->event
) {
2826 case NB_EV_VALIDATE
:
2831 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2832 pim_ifp
= ifp
->info
;
2833 last_member_query_interval
=
2834 yang_dnode_get_uint16(args
->dnode
, NULL
);
2835 pim_ifp
->gm_specific_query_max_response_time_dsec
=
2836 last_member_query_interval
;
2848 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/robustness-variable
2850 int lib_interface_gmp_address_family_robustness_variable_modify(
2851 struct nb_cb_modify_args
*args
)
2853 struct interface
*ifp
;
2854 struct pim_interface
*pim_ifp
;
2855 int last_member_query_count
;
2857 switch (args
->event
) {
2858 case NB_EV_VALIDATE
:
2863 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2864 pim_ifp
= ifp
->info
;
2865 last_member_query_count
=
2866 yang_dnode_get_uint8(args
->dnode
, NULL
);
2867 pim_ifp
->gm_last_member_query_count
= last_member_query_count
;
2878 * XPath: /frr-interface:lib/interface/frr-gmp:gmp/address-family/static-group
2880 int lib_interface_gmp_address_family_static_group_create(
2881 struct nb_cb_create_args
*args
)
2883 struct interface
*ifp
;
2884 pim_addr source_addr
;
2885 pim_addr group_addr
;
2887 const char *ifp_name
;
2888 const struct lyd_node
*if_dnode
;
2890 switch (args
->event
) {
2891 case NB_EV_VALIDATE
:
2892 if_dnode
= yang_dnode_get_parent(args
->dnode
, "interface");
2893 if (!is_pim_interface(if_dnode
)) {
2894 ifp_name
= yang_dnode_get_string(if_dnode
, "name");
2895 snprintf(args
->errmsg
, args
->errmsg_len
,
2896 "multicast not enabled on interface %s",
2898 return NB_ERR_VALIDATION
;
2901 yang_dnode_get_pimaddr(&group_addr
, args
->dnode
,
2904 if (pim_is_group_224_0_0_0_24(group_addr
)) {
2906 args
->errmsg
, args
->errmsg_len
,
2907 "Groups within 224.0.0.0/24 are reserved and cannot be joined");
2908 return NB_ERR_VALIDATION
;
2911 if (ipv6_mcast_reserved(&group_addr
)) {
2913 args
->errmsg
, args
->errmsg_len
,
2914 "Groups within ffx2::/16 are reserved and cannot be joined");
2915 return NB_ERR_VALIDATION
;
2923 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2924 yang_dnode_get_pimaddr(&source_addr
, args
->dnode
,
2926 yang_dnode_get_pimaddr(&group_addr
, args
->dnode
,
2928 result
= pim_if_gm_join_add(ifp
, group_addr
, source_addr
);
2930 snprintf(args
->errmsg
, args
->errmsg_len
,
2931 "Failure joining " GM
" group");
2932 return NB_ERR_INCONSISTENCY
;
2938 int lib_interface_gmp_address_family_static_group_destroy(
2939 struct nb_cb_destroy_args
*args
)
2941 struct interface
*ifp
;
2942 pim_addr source_addr
;
2943 pim_addr group_addr
;
2946 switch (args
->event
) {
2947 case NB_EV_VALIDATE
:
2952 ifp
= nb_running_get_entry(args
->dnode
, NULL
, true);
2953 yang_dnode_get_pimaddr(&source_addr
, args
->dnode
,
2955 yang_dnode_get_pimaddr(&group_addr
, args
->dnode
,
2957 result
= pim_if_gm_join_del(ifp
, group_addr
, source_addr
);
2960 snprintf(args
->errmsg
, args
->errmsg_len
,
2961 "%% Failure leaving " GM
2962 " group %pPAs %pPAs on interface %s: %d",
2963 &source_addr
, &group_addr
, ifp
->name
, result
);
2965 return NB_ERR_INCONSISTENCY
;