]>
Commit | Line | Data |
---|---|---|
12e41d03 DL |
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 | |
16 | along with this program; see the file COPYING; if not, write to the | |
17 | Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | |
18 | MA 02110-1301 USA | |
12e41d03 DL |
19 | */ |
20 | ||
21 | #include <zebra.h> | |
22 | ||
23 | #include "log.h" | |
24 | #include "memory.h" | |
9df99407 | 25 | #include "if.h" |
dfe43e25 DW |
26 | #include "prefix.h" |
27 | #include "vty.h" | |
28 | #include "plist.h" | |
12e41d03 DL |
29 | |
30 | #include "pimd.h" | |
31 | #include "pim_cmd.h" | |
32 | #include "pim_iface.h" | |
33 | #include "pim_zebra.h" | |
34 | #include "pim_str.h" | |
35 | #include "pim_oil.h" | |
36 | #include "pim_pim.h" | |
37 | #include "pim_upstream.h" | |
12e41d03 DL |
38 | #include "pim_rpf.h" |
39 | #include "pim_ssmpingd.h" | |
6250610a | 40 | #include "pim_static.h" |
36d6bd7d | 41 | #include "pim_rp.h" |
0b6817c5 | 42 | #include "pim_zlookup.h" |
12e41d03 DL |
43 | |
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; | |
48 | ||
469351b3 | 49 | struct thread_master *master = NULL; |
12e41d03 DL |
50 | uint32_t qpim_debugs = 0; |
51 | int qpim_mroute_socket_fd = -1; | |
52 | int64_t qpim_mroute_socket_creation = 0; /* timestamp of creation */ | |
12e41d03 | 53 | int qpim_t_periodic = PIM_DEFAULT_T_PERIODIC; /* Period between Join/Prune Messages */ |
12e41d03 | 54 | struct pim_assert_metric qpim_infinite_assert_metric; |
deab75f7 | 55 | long qpim_rpf_cache_refresh_delay_msec = 50; |
59ba0ac3 | 56 | struct thread *qpim_rpf_cache_refresher = NULL; |
12e41d03 DL |
57 | int64_t qpim_rpf_cache_refresh_requests = 0; |
58 | int64_t qpim_rpf_cache_refresh_events = 0; | |
59 | int64_t qpim_rpf_cache_refresh_last = 0; | |
60 | struct in_addr qpim_inaddr_any; | |
59ba0ac3 | 61 | struct list *qpim_ssmpingd_list = NULL; |
12e41d03 DL |
62 | struct in_addr qpim_ssmpingd_group_addr; |
63 | int64_t qpim_scan_oil_events = 0; | |
64 | int64_t qpim_scan_oil_last = 0; | |
65 | int64_t qpim_mroute_add_events = 0; | |
66 | int64_t qpim_mroute_add_last = 0; | |
67 | int64_t qpim_mroute_del_events = 0; | |
68 | int64_t qpim_mroute_del_last = 0; | |
59ba0ac3 | 69 | struct list *qpim_static_route_list = NULL; |
4304f95c | 70 | unsigned int qpim_keep_alive_time = PIM_KEEPALIVE_PERIOD; |
01408ede | 71 | signed int qpim_rp_keep_alive_time = 0; |
284b4301 | 72 | int64_t qpim_nexthop_lookups = 0; |
8e4c9ef3 | 73 | int qpim_packet_process = PIM_DEFAULT_PACKET_PROCESS; |
12e41d03 | 74 | |
4a4c4a07 DS |
75 | int32_t qpim_register_suppress_time = PIM_REGISTER_SUPPRESSION_TIME_DEFAULT; |
76 | int32_t qpim_register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT; | |
77 | ||
12e41d03 DL |
78 | static void pim_free() |
79 | { | |
80 | pim_ssmpingd_destroy(); | |
81 | ||
040d86ad | 82 | pim_oil_terminate (); |
12e41d03 | 83 | |
0f588989 | 84 | pim_upstream_terminate (); |
6250610a JAG |
85 | |
86 | if (qpim_static_route_list) | |
87 | list_free(qpim_static_route_list); | |
28b0c6b3 | 88 | |
ea4a71fc | 89 | pim_if_terminate (); |
36d6bd7d | 90 | pim_rp_free (); |
59d4564e | 91 | |
44a13ae3 | 92 | pim_route_map_terminate(); |
0b6817c5 DS |
93 | |
94 | zclient_lookup_free (); | |
95 | ||
96 | zprivs_terminate(&pimd_privs); | |
12e41d03 DL |
97 | } |
98 | ||
99 | void pim_init() | |
100 | { | |
01408ede DS |
101 | qpim_rp_keep_alive_time = PIM_RP_KEEPALIVE_PERIOD; |
102 | ||
36d6bd7d DS |
103 | pim_rp_init (); |
104 | ||
12e41d03 DL |
105 | if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) { |
106 | zlog_err("%s %s: could not solve %s to group address: errno=%d: %s", | |
107 | __FILE__, __PRETTY_FUNCTION__, | |
108 | PIM_ALL_PIM_ROUTERS, errno, safe_strerror(errno)); | |
109 | zassert(0); | |
110 | return; | |
111 | } | |
112 | ||
040d86ad | 113 | pim_oil_init (); |
12e41d03 | 114 | |
0f588989 | 115 | pim_upstream_init (); |
12e41d03 | 116 | |
6250610a JAG |
117 | qpim_static_route_list = list_new(); |
118 | if (!qpim_static_route_list) { | |
119 | zlog_err("%s %s: failure: static_route_list=list_new()", | |
120 | __FILE__, __PRETTY_FUNCTION__); | |
121 | return; | |
122 | } | |
123 | qpim_static_route_list->del = (void (*)(void *)) pim_static_route_free; | |
124 | ||
b8d16be2 | 125 | pim_mroute_socket_enable(); |
12e41d03 | 126 | |
12e41d03 DL |
127 | qpim_inaddr_any.s_addr = PIM_NET_INADDR_ANY; |
128 | ||
129 | /* | |
130 | RFC 4601: 4.6.3. Assert Metrics | |
131 | ||
132 | assert_metric | |
133 | infinite_assert_metric() { | |
134 | return {1,infinity,infinity,0} | |
135 | } | |
136 | */ | |
137 | qpim_infinite_assert_metric.rpt_bit_flag = 1; | |
138 | qpim_infinite_assert_metric.metric_preference = PIM_ASSERT_METRIC_PREFERENCE_MAX; | |
139 | qpim_infinite_assert_metric.route_metric = PIM_ASSERT_ROUTE_METRIC_MAX; | |
140 | qpim_infinite_assert_metric.ip_address = qpim_inaddr_any; | |
141 | ||
142 | pim_if_init(); | |
143 | pim_cmd_init(); | |
144 | pim_ssmpingd_init(); | |
145 | } | |
146 | ||
147 | void pim_terminate() | |
148 | { | |
149 | pim_free(); | |
150 | } |