]>
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 | |
19 | ||
12e41d03 DL |
20 | */ |
21 | ||
22 | #include <zebra.h> | |
23 | ||
24 | #include "log.h" | |
25 | #include "memory.h" | |
9df99407 | 26 | #include "if.h" |
dfe43e25 DW |
27 | #include "prefix.h" |
28 | #include "vty.h" | |
29 | #include "plist.h" | |
12e41d03 DL |
30 | |
31 | #include "pimd.h" | |
32 | #include "pim_cmd.h" | |
33 | #include "pim_iface.h" | |
34 | #include "pim_zebra.h" | |
35 | #include "pim_str.h" | |
36 | #include "pim_oil.h" | |
37 | #include "pim_pim.h" | |
38 | #include "pim_upstream.h" | |
12e41d03 DL |
39 | #include "pim_rpf.h" |
40 | #include "pim_ssmpingd.h" | |
6250610a | 41 | #include "pim_static.h" |
36d6bd7d | 42 | #include "pim_rp.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 */ | |
59ba0ac3 | 53 | struct thread *qpim_mroute_socket_reader = NULL; |
12e41d03 | 54 | int qpim_mroute_oif_highest_vif_index = -1; |
59ba0ac3 | 55 | struct list *qpim_channel_oil_list = NULL; |
12e41d03 | 56 | int qpim_t_periodic = PIM_DEFAULT_T_PERIODIC; /* Period between Join/Prune Messages */ |
59ba0ac3 | 57 | struct zclient *qpim_zclient_update = NULL; |
12e41d03 | 58 | struct pim_assert_metric qpim_infinite_assert_metric; |
fa6a18f1 | 59 | long qpim_rpf_cache_refresh_delay_msec = 2000; |
59ba0ac3 | 60 | struct thread *qpim_rpf_cache_refresher = NULL; |
12e41d03 DL |
61 | int64_t qpim_rpf_cache_refresh_requests = 0; |
62 | int64_t qpim_rpf_cache_refresh_events = 0; | |
63 | int64_t qpim_rpf_cache_refresh_last = 0; | |
64 | struct in_addr qpim_inaddr_any; | |
59ba0ac3 | 65 | struct list *qpim_ssmpingd_list = NULL; |
12e41d03 DL |
66 | struct in_addr qpim_ssmpingd_group_addr; |
67 | int64_t qpim_scan_oil_events = 0; | |
68 | int64_t qpim_scan_oil_last = 0; | |
69 | int64_t qpim_mroute_add_events = 0; | |
70 | int64_t qpim_mroute_add_last = 0; | |
71 | int64_t qpim_mroute_del_events = 0; | |
72 | int64_t qpim_mroute_del_last = 0; | |
59ba0ac3 | 73 | struct list *qpim_static_route_list = NULL; |
4304f95c | 74 | unsigned int qpim_keep_alive_time = PIM_KEEPALIVE_PERIOD; |
01408ede | 75 | signed int qpim_rp_keep_alive_time = 0; |
284b4301 | 76 | int64_t qpim_nexthop_lookups = 0; |
12e41d03 | 77 | |
4a4c4a07 DS |
78 | int32_t qpim_register_suppress_time = PIM_REGISTER_SUPPRESSION_TIME_DEFAULT; |
79 | int32_t qpim_register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT; | |
80 | ||
12e41d03 DL |
81 | static void pim_free() |
82 | { | |
83 | pim_ssmpingd_destroy(); | |
84 | ||
85 | if (qpim_channel_oil_list) | |
86 | list_free(qpim_channel_oil_list); | |
87 | ||
0f588989 | 88 | pim_upstream_terminate (); |
6250610a JAG |
89 | |
90 | if (qpim_static_route_list) | |
91 | list_free(qpim_static_route_list); | |
28b0c6b3 DW |
92 | |
93 | pim_route_map_terminate(); | |
36d6bd7d DS |
94 | |
95 | pim_rp_free (); | |
44a13ae3 | 96 | pim_route_map_terminate(); |
12e41d03 DL |
97 | } |
98 | ||
0d4f730c DW |
99 | static int |
100 | pim_channel_oil_compare (struct channel_oil *c1, struct channel_oil *c2) | |
101 | { | |
102 | if (ntohl(c1->oil.mfcc_mcastgrp.s_addr) < ntohl(c2->oil.mfcc_mcastgrp.s_addr)) | |
103 | return -1; | |
104 | ||
105 | if (ntohl(c1->oil.mfcc_mcastgrp.s_addr) > ntohl(c2->oil.mfcc_mcastgrp.s_addr)) | |
106 | return 1; | |
107 | ||
108 | if (ntohl(c1->oil.mfcc_origin.s_addr) < ntohl(c2->oil.mfcc_origin.s_addr)) | |
109 | return -1; | |
110 | ||
111 | if (ntohl(c1->oil.mfcc_origin.s_addr) > ntohl(c2->oil.mfcc_origin.s_addr)) | |
112 | return 1; | |
113 | ||
114 | return 0; | |
115 | } | |
116 | ||
12e41d03 DL |
117 | void pim_init() |
118 | { | |
60b40924 | 119 | srandom(time(NULL)); |
12e41d03 | 120 | |
01408ede DS |
121 | qpim_rp_keep_alive_time = PIM_RP_KEEPALIVE_PERIOD; |
122 | ||
36d6bd7d DS |
123 | pim_rp_init (); |
124 | ||
12e41d03 DL |
125 | if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) { |
126 | zlog_err("%s %s: could not solve %s to group address: errno=%d: %s", | |
127 | __FILE__, __PRETTY_FUNCTION__, | |
128 | PIM_ALL_PIM_ROUTERS, errno, safe_strerror(errno)); | |
129 | zassert(0); | |
130 | return; | |
131 | } | |
132 | ||
133 | qpim_channel_oil_list = list_new(); | |
134 | if (!qpim_channel_oil_list) { | |
135 | zlog_err("%s %s: failure: channel_oil_list=list_new()", | |
136 | __FILE__, __PRETTY_FUNCTION__); | |
137 | return; | |
138 | } | |
139 | qpim_channel_oil_list->del = (void (*)(void *)) pim_channel_oil_free; | |
0d4f730c | 140 | qpim_channel_oil_list->cmp = (int (*)(void *, void *)) pim_channel_oil_compare; |
12e41d03 | 141 | |
0f588989 | 142 | pim_upstream_init (); |
12e41d03 | 143 | |
6250610a JAG |
144 | qpim_static_route_list = list_new(); |
145 | if (!qpim_static_route_list) { | |
146 | zlog_err("%s %s: failure: static_route_list=list_new()", | |
147 | __FILE__, __PRETTY_FUNCTION__); | |
148 | return; | |
149 | } | |
150 | qpim_static_route_list->del = (void (*)(void *)) pim_static_route_free; | |
151 | ||
12e41d03 DL |
152 | qpim_mroute_socket_fd = -1; /* mark mroute as disabled */ |
153 | qpim_mroute_oif_highest_vif_index = -1; | |
154 | ||
12e41d03 DL |
155 | qpim_inaddr_any.s_addr = PIM_NET_INADDR_ANY; |
156 | ||
157 | /* | |
158 | RFC 4601: 4.6.3. Assert Metrics | |
159 | ||
160 | assert_metric | |
161 | infinite_assert_metric() { | |
162 | return {1,infinity,infinity,0} | |
163 | } | |
164 | */ | |
165 | qpim_infinite_assert_metric.rpt_bit_flag = 1; | |
166 | qpim_infinite_assert_metric.metric_preference = PIM_ASSERT_METRIC_PREFERENCE_MAX; | |
167 | qpim_infinite_assert_metric.route_metric = PIM_ASSERT_ROUTE_METRIC_MAX; | |
168 | qpim_infinite_assert_metric.ip_address = qpim_inaddr_any; | |
169 | ||
170 | pim_if_init(); | |
171 | pim_cmd_init(); | |
172 | pim_ssmpingd_init(); | |
173 | } | |
174 | ||
175 | void pim_terminate() | |
176 | { | |
177 | pim_free(); | |
178 | } |