Line data Source code
1 : /*
2 : * PIM for Quagga
3 : * Copyright (C) 2008 Everton da Silva Marques
4 : *
5 : * This program is free software; you can redistribute it and/or modify
6 : * it under the terms of the GNU General Public License as published by
7 : * the Free Software Foundation; either version 2 of the License, or
8 : * (at your option) any later version.
9 : *
10 : * This program is distributed in the hope that it will be useful, but
11 : * WITHOUT ANY WARRANTY; without even the implied warranty of
12 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : * General Public License for more details.
14 : *
15 : * You should have received a copy of the GNU General Public License along
16 : * with this program; see the file COPYING; if not, write to the Free Software
17 : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 : */
19 :
20 : #include <zebra.h>
21 :
22 : #include "log.h"
23 : #include "memory.h"
24 : #include "if.h"
25 : #include "prefix.h"
26 : #include "vty.h"
27 : #include "plist.h"
28 : #include "hash.h"
29 : #include "jhash.h"
30 : #include "vrf.h"
31 : #include "lib_errors.h"
32 : #include "bfd.h"
33 :
34 : #include "pimd.h"
35 : #if PIM_IPV == 4
36 : #include "pim_cmd.h"
37 : #else
38 : #include "pim6_cmd.h"
39 : #endif
40 : #include "pim_str.h"
41 : #include "pim_oil.h"
42 : #include "pim_pim.h"
43 : #include "pim_ssmpingd.h"
44 : #include "pim_static.h"
45 : #include "pim_rp.h"
46 : #include "pim_ssm.h"
47 : #include "pim_vxlan.h"
48 : #include "pim_zlookup.h"
49 : #include "pim_zebra.h"
50 : #include "pim_mlag.h"
51 :
52 : #if MAXVIFS > 256
53 : CPP_NOTICE("Work needs to be done to make this work properly via the pim mroute socket\n");
54 : #endif /* MAXVIFS > 256 */
55 :
56 : #if PIM_IPV == 4
57 : const char *const PIM_ALL_SYSTEMS = MCAST_ALL_SYSTEMS;
58 : const char *const PIM_ALL_ROUTERS = MCAST_ALL_ROUTERS;
59 : const char *const PIM_ALL_PIM_ROUTERS = MCAST_ALL_PIM_ROUTERS;
60 : const char *const PIM_ALL_IGMP_ROUTERS = MCAST_ALL_IGMP_ROUTERS;
61 : #else
62 : const char *const PIM_ALL_SYSTEMS = "ff02::1";
63 : const char *const PIM_ALL_ROUTERS = "ff02::2";
64 : const char *const PIM_ALL_PIM_ROUTERS = "ff02::d";
65 : const char *const PIM_ALL_IGMP_ROUTERS = "ff02::16";
66 : #endif
67 :
68 6 : DEFINE_MTYPE_STATIC(PIMD, ROUTER, "PIM Router information");
69 :
70 : struct pim_router *router = NULL;
71 : pim_addr qpim_all_pim_routers_addr;
72 :
73 0 : void pim_prefix_list_update(struct prefix_list *plist)
74 : {
75 0 : struct pim_instance *pim;
76 0 : struct vrf *vrf;
77 :
78 0 : RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
79 0 : pim = vrf->info;
80 0 : if (!pim)
81 0 : continue;
82 :
83 0 : pim_rp_prefix_list_update(pim, plist);
84 0 : pim_ssm_prefix_list_update(pim, plist);
85 0 : pim_upstream_spt_prefix_list_update(pim, plist);
86 : }
87 0 : }
88 :
89 0 : static void pim_free(void)
90 : {
91 0 : pim_route_map_terminate();
92 :
93 0 : zclient_lookup_free();
94 : }
95 :
96 2 : void pim_router_init(void)
97 : {
98 2 : router = XCALLOC(MTYPE_ROUTER, sizeof(*router));
99 :
100 2 : router->debugs = 0;
101 2 : router->master = frr_init();
102 2 : router->t_periodic = PIM_DEFAULT_T_PERIODIC;
103 2 : router->multipath = MULTIPATH_NUM;
104 :
105 : /*
106 : RFC 4601: 4.6.3. Assert Metrics
107 :
108 : assert_metric
109 : infinite_assert_metric() {
110 : return {1,infinity,infinity,0}
111 : }
112 : */
113 2 : router->infinite_assert_metric.rpt_bit_flag = 1;
114 2 : router->infinite_assert_metric.metric_preference =
115 : PIM_ASSERT_METRIC_PREFERENCE_MAX;
116 2 : router->infinite_assert_metric.route_metric =
117 : PIM_ASSERT_ROUTE_METRIC_MAX;
118 2 : router->infinite_assert_metric.ip_address = PIMADDR_ANY;
119 2 : router->rpf_cache_refresh_delay_msec = 50;
120 2 : router->register_suppress_time = PIM_REGISTER_SUPPRESSION_TIME_DEFAULT;
121 2 : router->packet_process = PIM_DEFAULT_PACKET_PROCESS;
122 2 : router->register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT;
123 2 : router->vrf_id = VRF_DEFAULT;
124 2 : router->pim_mlag_intf_cnt = 0;
125 2 : router->connected_to_mlag = false;
126 2 : }
127 :
128 2 : void pim_router_terminate(void)
129 : {
130 2 : XFREE(MTYPE_ROUTER, router);
131 2 : }
132 :
133 2 : void pim_init(void)
134 : {
135 2 : if (!inet_pton(PIM_AF, PIM_ALL_PIM_ROUTERS,
136 : &qpim_all_pim_routers_addr)) {
137 0 : flog_err(
138 : EC_LIB_SOCKET,
139 : "%s %s: could not solve %s to group address: errno=%d: %s",
140 : __FILE__, __func__, PIM_ALL_PIM_ROUTERS, errno,
141 : safe_strerror(errno));
142 0 : assert(0);
143 : return;
144 : }
145 :
146 2 : pim_cmd_init();
147 : }
148 :
149 0 : void pim_terminate(void)
150 : {
151 0 : struct zclient *zclient;
152 :
153 0 : bfd_protocol_integration_set_shutdown(true);
154 :
155 : /* reverse prefix_list_init */
156 0 : prefix_list_add_hook(NULL);
157 0 : prefix_list_delete_hook(NULL);
158 0 : prefix_list_reset();
159 :
160 0 : pim_vxlan_terminate();
161 0 : pim_vrf_terminate();
162 :
163 0 : zclient = pim_zebra_zclient_get();
164 0 : if (zclient) {
165 0 : zclient_stop(zclient);
166 0 : zclient_free(zclient);
167 : }
168 :
169 0 : pim_free();
170 0 : pim_mlag_terminate();
171 0 : pim_router_terminate();
172 :
173 0 : frr_fini();
174 0 : }
|