1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2008 Everton da Silva Marques
18 #include "lib_errors.h"
30 #include "pim_ssmpingd.h"
31 #include "pim_static.h"
34 #include "pim_vxlan.h"
35 #include "pim_zlookup.h"
36 #include "pim_zebra.h"
40 CPP_NOTICE("Work needs to be done to make this work properly via the pim mroute socket\n");
41 #endif /* MAXVIFS > 256 */
44 const char *const PIM_ALL_SYSTEMS
= MCAST_ALL_SYSTEMS
;
45 const char *const PIM_ALL_ROUTERS
= MCAST_ALL_ROUTERS
;
46 const char *const PIM_ALL_PIM_ROUTERS
= MCAST_ALL_PIM_ROUTERS
;
47 const char *const PIM_ALL_IGMP_ROUTERS
= MCAST_ALL_IGMP_ROUTERS
;
49 const char *const PIM_ALL_SYSTEMS
= "ff02::1";
50 const char *const PIM_ALL_ROUTERS
= "ff02::2";
51 const char *const PIM_ALL_PIM_ROUTERS
= "ff02::d";
52 const char *const PIM_ALL_IGMP_ROUTERS
= "ff02::16";
55 DEFINE_MTYPE_STATIC(PIMD
, ROUTER
, "PIM Router information");
57 struct pim_router
*router
= NULL
;
58 pim_addr qpim_all_pim_routers_addr
;
60 void pim_prefix_list_update(struct prefix_list
*plist
)
62 struct pim_instance
*pim
;
65 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
70 pim_rp_prefix_list_update(pim
, plist
);
71 pim_ssm_prefix_list_update(pim
, plist
);
72 pim_upstream_spt_prefix_list_update(pim
, plist
);
76 static void pim_free(void)
78 pim_route_map_terminate();
80 zclient_lookup_free();
83 void pim_router_init(void)
85 router
= XCALLOC(MTYPE_ROUTER
, sizeof(*router
));
88 router
->master
= frr_init();
89 router
->t_periodic
= PIM_DEFAULT_T_PERIODIC
;
90 router
->multipath
= MULTIPATH_NUM
;
93 RFC 4601: 4.6.3. Assert Metrics
96 infinite_assert_metric() {
97 return {1,infinity,infinity,0}
100 router
->infinite_assert_metric
.rpt_bit_flag
= 1;
101 router
->infinite_assert_metric
.metric_preference
=
102 PIM_ASSERT_METRIC_PREFERENCE_MAX
;
103 router
->infinite_assert_metric
.route_metric
=
104 PIM_ASSERT_ROUTE_METRIC_MAX
;
105 router
->infinite_assert_metric
.ip_address
= PIMADDR_ANY
;
106 router
->rpf_cache_refresh_delay_msec
= 50;
107 router
->register_suppress_time
= PIM_REGISTER_SUPPRESSION_TIME_DEFAULT
;
108 router
->packet_process
= PIM_DEFAULT_PACKET_PROCESS
;
109 router
->register_probe_time
= PIM_REGISTER_PROBE_TIME_DEFAULT
;
110 router
->vrf_id
= VRF_DEFAULT
;
111 router
->pim_mlag_intf_cnt
= 0;
112 router
->connected_to_mlag
= false;
115 void pim_router_terminate(void)
117 XFREE(MTYPE_ROUTER
, router
);
122 if (!inet_pton(PIM_AF
, PIM_ALL_PIM_ROUTERS
,
123 &qpim_all_pim_routers_addr
)) {
126 "%s %s: could not solve %s to group address: errno=%d: %s",
127 __FILE__
, __func__
, PIM_ALL_PIM_ROUTERS
, errno
,
128 safe_strerror(errno
));
136 void pim_terminate(void)
138 struct zclient
*zclient
;
140 bfd_protocol_integration_set_shutdown(true);
142 /* reverse prefix_list_init */
143 prefix_list_add_hook(NULL
);
144 prefix_list_delete_hook(NULL
);
147 pim_vxlan_terminate();
150 zclient
= pim_zebra_zclient_get();
152 zclient_stop(zclient
);
153 zclient_free(zclient
);
157 pim_mlag_terminate();
158 pim_router_terminate();