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:
20: $QuaggaId: $Format:%an, %ai, %h$ $
21: */
22:
23: #include <zebra.h>
24:
25: #include "log.h"
26: #include "memory.h"
27: #include "vrf.h"
28:
29: #include "pimd.h"
30: #include "pim_cmd.h"
31: #include "pim_iface.h"
32: #include "pim_zebra.h"
33: #include "pim_str.h"
34: #include "pim_oil.h"
35: #include "pim_pim.h"
36: #include "pim_upstream.h"
37: #include "pim_rpf.h"
38: #include "pim_ssmpingd.h"
39: #include "pim_static.h"
40:
41: const char *const PIM_ALL_SYSTEMS = MCAST_ALL_SYSTEMS;
42: const char *const PIM_ALL_ROUTERS = MCAST_ALL_ROUTERS;
43: const char *const PIM_ALL_PIM_ROUTERS = MCAST_ALL_PIM_ROUTERS;
44: const char *const PIM_ALL_IGMP_ROUTERS = MCAST_ALL_IGMP_ROUTERS;
45:
46: struct thread_master *master = 0;
47: uint32_t qpim_debugs = 0;
48: int qpim_mroute_socket_fd = -1;
49: int64_t qpim_mroute_socket_creation = 0; /* timestamp of creation */
50: struct thread *qpim_mroute_socket_reader = 0;
51: int qpim_mroute_oif_highest_vif_index = -1;
52: struct list *qpim_channel_oil_list = 0;
53: int qpim_t_periodic = PIM_DEFAULT_T_PERIODIC; /* Period between Join/Prune Messages */
54: struct list *qpim_upstream_list = 0;
55: struct zclient *qpim_zclient_update = 0;
56: struct zclient *qpim_zclient_lookup = 0;
57: struct pim_assert_metric qpim_infinite_assert_metric;
58: long qpim_rpf_cache_refresh_delay_msec = 10000;
59: struct thread *qpim_rpf_cache_refresher = 0;
60: int64_t qpim_rpf_cache_refresh_requests = 0;
61: int64_t qpim_rpf_cache_refresh_events = 0;
62: int64_t qpim_rpf_cache_refresh_last = 0;
63: struct in_addr qpim_inaddr_any;
64: struct list *qpim_ssmpingd_list = 0;
65: struct in_addr qpim_ssmpingd_group_addr;
66: int64_t qpim_scan_oil_events = 0;
67: int64_t qpim_scan_oil_last = 0;
68: int64_t qpim_mroute_add_events = 0;
69: int64_t qpim_mroute_add_last = 0;
70: int64_t qpim_mroute_del_events = 0;
71: int64_t qpim_mroute_del_last = 0;
72: struct list *qpim_static_route_list = 0;
73:
74: static void pim_free()
75: {
76: pim_ssmpingd_destroy();
77:
78: if (qpim_channel_oil_list)
79: list_free(qpim_channel_oil_list);
80:
81: if (qpim_upstream_list)
82: list_free(qpim_upstream_list);
83:
84: if (qpim_static_route_list)
85: list_free(qpim_static_route_list);
86: }
87:
88: void pim_init()
89: {
90: srandom(time(NULL));
91:
92: if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) {
93: zlog_err("%s %s: could not solve %s to group address: errno=%d: %s",
94: __FILE__, __PRETTY_FUNCTION__,
95: PIM_ALL_PIM_ROUTERS, errno, safe_strerror(errno));
96: zassert(0);
97: return;
98: }
99:
100: qpim_channel_oil_list = list_new();
101: if (!qpim_channel_oil_list) {
102: zlog_err("%s %s: failure: channel_oil_list=list_new()",
103: __FILE__, __PRETTY_FUNCTION__);
104: return;
105: }
106: qpim_channel_oil_list->del = (void (*)(void *)) pim_channel_oil_free;
107:
108: qpim_upstream_list = list_new();
109: if (!qpim_upstream_list) {
110: zlog_err("%s %s: failure: upstream_list=list_new()",
111: __FILE__, __PRETTY_FUNCTION__);
112: pim_free();
113: return;
114: }
115: qpim_upstream_list->del = (void (*)(void *)) pim_upstream_free;
116:
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:
125: qpim_mroute_socket_fd = -1; /* mark mroute as disabled */
126: qpim_mroute_oif_highest_vif_index = -1;
127:
128: zassert(!qpim_debugs);
129: zassert(!PIM_MROUTE_IS_ENABLED);
130:
131: qpim_inaddr_any.s_addr = PIM_NET_INADDR_ANY;
132:
133: /*
134: RFC 4601: 4.6.3. Assert Metrics
135:
136: assert_metric
137: infinite_assert_metric() {
138: return {1,infinity,infinity,0}
139: }
140: */
141: qpim_infinite_assert_metric.rpt_bit_flag = 1;
142: qpim_infinite_assert_metric.metric_preference = PIM_ASSERT_METRIC_PREFERENCE_MAX;
143: qpim_infinite_assert_metric.route_metric = PIM_ASSERT_ROUTE_METRIC_MAX;
144: qpim_infinite_assert_metric.ip_address = qpim_inaddr_any;
145:
146: pim_cmd_init();
147: pim_ssmpingd_init();
148: }
149:
150: void pim_terminate()
151: {
152: vrf_terminate();
153: pim_free();
154: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>