]> git.proxmox.com Git - mirror_frr.git/blob - pimd/pimd.h
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / pimd / pimd.h
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * PIM for Quagga
4 * Copyright (C) 2008 Everton da Silva Marques
5 */
6
7 #ifndef PIMD_H
8 #define PIMD_H
9
10 #include <stdint.h>
11 #include "zebra.h"
12 #include "libfrr.h"
13 #include "prefix.h"
14 #include "vty.h"
15 #include "plist.h"
16
17 #include "pim_addr.h"
18 #include "pim_str.h"
19 #include "pim_memory.h"
20 #include "pim_assert.h"
21
22 #define PIMD_VTY_PORT 2611
23 #define PIM6D_VTY_PORT 2622
24
25 #define PIM_IP_PROTO_IGMP (2)
26 #define PIM_IP_PROTO_PIM (103)
27 #define PIM_IGMP_MIN_LEN (8)
28
29 #define PIM_ENFORCE_LOOPFREE_MFC
30
31 /*
32 * PIM MSG Header Format
33 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
34 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35 * |PIM Ver| Type | Reserved | Checksum |
36 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37 */
38 #define PIM_MSG_HEADER_LEN (4)
39 #define PIM_PIM_MIN_LEN PIM_MSG_HEADER_LEN
40
41 #define PIM_ENCODED_IPV4_UCAST_SIZE (6)
42 #define PIM_ENCODED_IPV4_GROUP_SIZE (8)
43 #define PIM_ENCODED_IPV4_SOURCE_SIZE (8)
44
45 /*
46 * J/P Message Format, Group Header
47 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48 * | Upstream Neighbor Address (Encoded-Unicast format) |
49 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 * | Reserved | Num groups | Holdtime |
51 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 * | Multicast Group Address 1 (Encoded-Group format) |
53 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 * | Number of Joined Sources | Number of Pruned Sources |
55 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 */
57 #define PIM_JP_GROUP_HEADER_SIZE \
58 (PIM_ENCODED_IPV4_UCAST_SIZE + 1 + 1 + 2 + PIM_ENCODED_IPV4_GROUP_SIZE \
59 + 2 + 2)
60
61 #define PIM_PROTO_VERSION (2)
62
63 #define MCAST_ALL_SYSTEMS "224.0.0.1"
64 #define MCAST_ALL_ROUTERS "224.0.0.2"
65 #define MCAST_ALL_PIM_ROUTERS "224.0.0.13"
66 #define MCAST_ALL_IGMP_ROUTERS "224.0.0.22"
67
68 #define PIM_FORCE_BOOLEAN(expr) ((expr) != 0)
69
70 #define PIM_NET_INADDR_ANY (htonl(INADDR_ANY))
71
72 #define PIM_MASK_PIM_EVENTS (1 << 0)
73 #define PIM_MASK_PIM_EVENTS_DETAIL (1 << 1)
74 #define PIM_MASK_PIM_PACKETS (1 << 2)
75 #define PIM_MASK_PIM_PACKETDUMP_SEND (1 << 3)
76 #define PIM_MASK_PIM_PACKETDUMP_RECV (1 << 4)
77 #define PIM_MASK_PIM_TRACE (1 << 5)
78 #define PIM_MASK_PIM_TRACE_DETAIL (1 << 6)
79 #define PIM_MASK_GM_EVENTS (1 << 7)
80 #define PIM_MASK_GM_PACKETS (1 << 8)
81 #define PIM_MASK_GM_TRACE (1 << 9)
82 #define PIM_MASK_GM_TRACE_DETAIL (1 << 10)
83 #define PIM_MASK_ZEBRA (1 << 11)
84 #define PIM_MASK_SSMPINGD (1 << 12)
85 #define PIM_MASK_MROUTE (1 << 13)
86 #define PIM_MASK_MROUTE_DETAIL (1 << 14)
87 #define PIM_MASK_PIM_HELLO (1 << 15)
88 #define PIM_MASK_PIM_J_P (1 << 16)
89 #define PIM_MASK_STATIC (1 << 17)
90 #define PIM_MASK_PIM_REG (1 << 18)
91 #define PIM_MASK_MSDP_EVENTS (1 << 19)
92 #define PIM_MASK_MSDP_PACKETS (1 << 20)
93 #define PIM_MASK_MSDP_INTERNAL (1 << 21)
94 #define PIM_MASK_PIM_NHT (1 << 22)
95 #define PIM_MASK_PIM_NHT_DETAIL (1 << 23)
96 #define PIM_MASK_PIM_NHT_RP (1 << 24)
97 #define PIM_MASK_MTRACE (1 << 25)
98 #define PIM_MASK_VXLAN (1 << 26)
99 #define PIM_MASK_BSM_PROC (1 << 27)
100 #define PIM_MASK_MLAG (1 << 28)
101 /* Remember 32 bits!!! */
102
103 /* PIM error codes */
104 #define PIM_SUCCESS 0
105 #define PIM_GROUP_BAD_ADDRESS -2
106 #define PIM_GROUP_OVERLAP -3
107 #define PIM_GROUP_PFXLIST_OVERLAP -4
108 #define PIM_RP_BAD_ADDRESS -5
109 #define PIM_RP_NO_PATH -6
110 #define PIM_RP_NOT_FOUND -7
111 #define PIM_RP_PFXLIST_IN_USE -8
112 #define PIM_IFACE_NOT_FOUND -9
113 #define PIM_UPDATE_SOURCE_DUP -10
114 #define PIM_GROUP_BAD_ADDR_MASK_COMBO -11
115
116 extern const char *const PIM_ALL_SYSTEMS;
117 extern const char *const PIM_ALL_ROUTERS;
118 extern const char *const PIM_ALL_PIM_ROUTERS;
119 extern const char *const PIM_ALL_IGMP_ROUTERS;
120
121 extern struct zebra_privs_t pimd_privs;
122 extern pim_addr qpim_all_pim_routers_addr;
123 extern uint8_t qpim_ecmp_enable;
124 extern uint8_t qpim_ecmp_rebalance_enable;
125
126 #define PIM_DEFAULT_PACKET_PROCESS 3
127
128 #define PIM_JP_HOLDTIME (router->t_periodic * 7 / 2)
129
130 /*
131 * Register-Stop Timer (RST(S,G))
132 * Default values
133 */
134 #define PIM_REGISTER_SUPPRESSION_TIME_DEFAULT (60)
135 #define PIM_REGISTER_PROBE_TIME_DEFAULT (5)
136
137 #define PIM_DEBUG_PIM_EVENTS (router->debugs & PIM_MASK_PIM_EVENTS)
138 #define PIM_DEBUG_PIM_EVENTS_DETAIL \
139 (router->debugs & (PIM_MASK_PIM_EVENTS_DETAIL | PIM_MASK_PIM_EVENTS))
140 #define PIM_DEBUG_PIM_PACKETS (router->debugs & PIM_MASK_PIM_PACKETS)
141 #define PIM_DEBUG_PIM_PACKETDUMP_SEND \
142 (router->debugs & PIM_MASK_PIM_PACKETDUMP_SEND)
143 #define PIM_DEBUG_PIM_PACKETDUMP_RECV \
144 (router->debugs & PIM_MASK_PIM_PACKETDUMP_RECV)
145 #define PIM_DEBUG_PIM_TRACE \
146 (router->debugs & (PIM_MASK_PIM_TRACE | PIM_MASK_PIM_TRACE_DETAIL))
147 #define PIM_DEBUG_PIM_TRACE_DETAIL \
148 (router->debugs & PIM_MASK_PIM_TRACE_DETAIL)
149 #define PIM_DEBUG_GM_EVENTS (router->debugs & PIM_MASK_GM_EVENTS)
150 #define PIM_DEBUG_GM_PACKETS (router->debugs & PIM_MASK_GM_PACKETS)
151 #define PIM_DEBUG_GM_TRACE \
152 (router->debugs & (PIM_MASK_GM_TRACE | PIM_MASK_GM_TRACE_DETAIL))
153 #define PIM_DEBUG_GM_TRACE_DETAIL (router->debugs & PIM_MASK_GM_TRACE_DETAIL)
154 #define PIM_DEBUG_ZEBRA (router->debugs & PIM_MASK_ZEBRA)
155 #define PIM_DEBUG_MLAG (router->debugs & PIM_MASK_MLAG)
156 #define PIM_DEBUG_SSMPINGD (router->debugs & PIM_MASK_SSMPINGD)
157 #define PIM_DEBUG_MROUTE \
158 (router->debugs & (PIM_MASK_MROUTE | PIM_MASK_MROUTE_DETAIL))
159 #define PIM_DEBUG_MROUTE_DETAIL (router->debugs & PIM_MASK_MROUTE_DETAIL)
160 #define PIM_DEBUG_PIM_HELLO (router->debugs & PIM_MASK_PIM_HELLO)
161 #define PIM_DEBUG_PIM_J_P (router->debugs & PIM_MASK_PIM_J_P)
162 #define PIM_DEBUG_PIM_REG (router->debugs & PIM_MASK_PIM_REG)
163 #define PIM_DEBUG_STATIC (router->debugs & PIM_MASK_STATIC)
164 #define PIM_DEBUG_MSDP_EVENTS (router->debugs & PIM_MASK_MSDP_EVENTS)
165 #define PIM_DEBUG_MSDP_PACKETS (router->debugs & PIM_MASK_MSDP_PACKETS)
166 #define PIM_DEBUG_MSDP_INTERNAL (router->debugs & PIM_MASK_MSDP_INTERNAL)
167 #define PIM_DEBUG_PIM_NHT (router->debugs & PIM_MASK_PIM_NHT)
168 #define PIM_DEBUG_PIM_NHT_DETAIL (router->debugs & PIM_MASK_PIM_NHT_DETAIL)
169 #define PIM_DEBUG_PIM_NHT_RP (router->debugs & PIM_MASK_PIM_NHT_RP)
170 #define PIM_DEBUG_MTRACE (router->debugs & PIM_MASK_MTRACE)
171 #define PIM_DEBUG_VXLAN (router->debugs & PIM_MASK_VXLAN)
172 #define PIM_DEBUG_BSM (router->debugs & PIM_MASK_BSM_PROC)
173
174 #define PIM_DEBUG_EVENTS \
175 (router->debugs & (PIM_MASK_PIM_EVENTS | PIM_MASK_GM_EVENTS | \
176 PIM_MASK_MSDP_EVENTS | PIM_MASK_BSM_PROC))
177 #define PIM_DEBUG_PACKETS \
178 (router->debugs & \
179 (PIM_MASK_PIM_PACKETS | PIM_MASK_GM_PACKETS | PIM_MASK_MSDP_PACKETS))
180 #define PIM_DEBUG_TRACE \
181 (router->debugs & (PIM_MASK_PIM_TRACE | PIM_MASK_GM_TRACE))
182
183 #define PIM_DO_DEBUG_PIM_EVENTS (router->debugs |= PIM_MASK_PIM_EVENTS)
184 #define PIM_DO_DEBUG_PIM_PACKETS (router->debugs |= PIM_MASK_PIM_PACKETS)
185 #define PIM_DO_DEBUG_PIM_PACKETDUMP_SEND \
186 (router->debugs |= PIM_MASK_PIM_PACKETDUMP_SEND)
187 #define PIM_DO_DEBUG_PIM_PACKETDUMP_RECV \
188 (router->debugs |= PIM_MASK_PIM_PACKETDUMP_RECV)
189 #define PIM_DO_DEBUG_PIM_TRACE (router->debugs |= PIM_MASK_PIM_TRACE)
190 #define PIM_DO_DEBUG_PIM_TRACE_DETAIL \
191 (router->debugs |= PIM_MASK_PIM_TRACE_DETAIL)
192 #define PIM_DO_DEBUG_GM_EVENTS (router->debugs |= PIM_MASK_GM_EVENTS)
193 #define PIM_DO_DEBUG_GM_PACKETS (router->debugs |= PIM_MASK_GM_PACKETS)
194 #define PIM_DO_DEBUG_GM_TRACE (router->debugs |= PIM_MASK_GM_TRACE)
195 #define PIM_DO_DEBUG_GM_TRACE_DETAIL \
196 (router->debugs |= PIM_MASK_GM_TRACE_DETAIL)
197 #define PIM_DO_DEBUG_ZEBRA (router->debugs |= PIM_MASK_ZEBRA)
198 #define PIM_DO_DEBUG_MLAG (router->debugs |= PIM_MASK_MLAG)
199 #define PIM_DO_DEBUG_SSMPINGD (router->debugs |= PIM_MASK_SSMPINGD)
200 #define PIM_DO_DEBUG_MROUTE (router->debugs |= PIM_MASK_MROUTE)
201 #define PIM_DO_DEBUG_MROUTE_DETAIL (router->debugs |= PIM_MASK_MROUTE_DETAIL)
202 #define PIM_DO_DEBUG_BSM (router->debugs |= PIM_MASK_BSM_PROC)
203 #define PIM_DO_DEBUG_PIM_HELLO (router->debugs |= PIM_MASK_PIM_HELLO)
204 #define PIM_DO_DEBUG_PIM_J_P (router->debugs |= PIM_MASK_PIM_J_P)
205 #define PIM_DO_DEBUG_PIM_REG (router->debugs |= PIM_MASK_PIM_REG)
206 #define PIM_DO_DEBUG_STATIC (router->debugs |= PIM_MASK_STATIC)
207 #define PIM_DO_DEBUG_MSDP_EVENTS (router->debugs |= PIM_MASK_MSDP_EVENTS)
208 #define PIM_DO_DEBUG_MSDP_PACKETS (router->debugs |= PIM_MASK_MSDP_PACKETS)
209 #define PIM_DO_DEBUG_MSDP_INTERNAL (router->debugs |= PIM_MASK_MSDP_INTERNAL)
210 #define PIM_DO_DEBUG_PIM_NHT (router->debugs |= PIM_MASK_PIM_NHT)
211 #define PIM_DO_DEBUG_PIM_NHT_DETAIL (router->debugs |= PIM_MASK_PIM_NHT_DETAIL)
212 #define PIM_DO_DEBUG_PIM_NHT_RP (router->debugs |= PIM_MASK_PIM_NHT_RP)
213 #define PIM_DO_DEBUG_MTRACE (router->debugs |= PIM_MASK_MTRACE)
214 #define PIM_DO_DEBUG_VXLAN (router->debugs |= PIM_MASK_VXLAN)
215
216 #define PIM_DONT_DEBUG_PIM_EVENTS (router->debugs &= ~PIM_MASK_PIM_EVENTS)
217 #define PIM_DONT_DEBUG_PIM_PACKETS (router->debugs &= ~PIM_MASK_PIM_PACKETS)
218 #define PIM_DONT_DEBUG_PIM_PACKETDUMP_SEND \
219 (router->debugs &= ~PIM_MASK_PIM_PACKETDUMP_SEND)
220 #define PIM_DONT_DEBUG_PIM_PACKETDUMP_RECV \
221 (router->debugs &= ~PIM_MASK_PIM_PACKETDUMP_RECV)
222 #define PIM_DONT_DEBUG_PIM_TRACE (router->debugs &= ~PIM_MASK_PIM_TRACE)
223 #define PIM_DONT_DEBUG_PIM_TRACE_DETAIL \
224 (router->debugs &= ~PIM_MASK_PIM_TRACE_DETAIL)
225 #define PIM_DONT_DEBUG_GM_EVENTS (router->debugs &= ~PIM_MASK_GM_EVENTS)
226 #define PIM_DONT_DEBUG_GM_PACKETS (router->debugs &= ~PIM_MASK_GM_PACKETS)
227 #define PIM_DONT_DEBUG_GM_TRACE (router->debugs &= ~PIM_MASK_GM_TRACE)
228 #define PIM_DONT_DEBUG_GM_TRACE_DETAIL \
229 (router->debugs &= ~PIM_MASK_GM_TRACE_DETAIL)
230 #define PIM_DONT_DEBUG_ZEBRA (router->debugs &= ~PIM_MASK_ZEBRA)
231 #define PIM_DONT_DEBUG_MLAG (router->debugs &= ~PIM_MASK_MLAG)
232 #define PIM_DONT_DEBUG_SSMPINGD (router->debugs &= ~PIM_MASK_SSMPINGD)
233 #define PIM_DONT_DEBUG_MROUTE (router->debugs &= ~PIM_MASK_MROUTE)
234 #define PIM_DONT_DEBUG_MROUTE_DETAIL (router->debugs &= ~PIM_MASK_MROUTE_DETAIL)
235 #define PIM_DONT_DEBUG_PIM_HELLO (router->debugs &= ~PIM_MASK_PIM_HELLO)
236 #define PIM_DONT_DEBUG_PIM_J_P (router->debugs &= ~PIM_MASK_PIM_J_P)
237 #define PIM_DONT_DEBUG_PIM_REG (router->debugs &= ~PIM_MASK_PIM_REG)
238 #define PIM_DONT_DEBUG_STATIC (router->debugs &= ~PIM_MASK_STATIC)
239 #define PIM_DONT_DEBUG_MSDP_EVENTS (router->debugs &= ~PIM_MASK_MSDP_EVENTS)
240 #define PIM_DONT_DEBUG_MSDP_PACKETS (router->debugs &= ~PIM_MASK_MSDP_PACKETS)
241 #define PIM_DONT_DEBUG_MSDP_INTERNAL (router->debugs &= ~PIM_MASK_MSDP_INTERNAL)
242 #define PIM_DONT_DEBUG_PIM_NHT (router->debugs &= ~PIM_MASK_PIM_NHT)
243 #define PIM_DONT_DEBUG_PIM_NHT_DETAIL \
244 (router->debugs &= ~PIM_MASK_PIM_NHT_DETAIL)
245 #define PIM_DONT_DEBUG_PIM_NHT_RP (router->debugs &= ~PIM_MASK_PIM_NHT_RP)
246 #define PIM_DONT_DEBUG_MTRACE (router->debugs &= ~PIM_MASK_MTRACE)
247 #define PIM_DONT_DEBUG_VXLAN (router->debugs &= ~PIM_MASK_VXLAN)
248 #define PIM_DONT_DEBUG_BSM (router->debugs &= ~PIM_MASK_BSM_PROC)
249
250 /* RFC 3376: 8.1. Robustness Variable - Default: 2 for IGMP */
251 /* RFC 2710: 7.1. Robustness Variable - Default: 2 for MLD */
252 #define GM_DEFAULT_ROBUSTNESS_VARIABLE 2
253
254 /* RFC 3376: 8.2. Query Interval - Default: 125 seconds for IGMP */
255 /* RFC 2710: 7.2. Query Interval - Default: 125 seconds for MLD */
256 #define GM_GENERAL_QUERY_INTERVAL 125
257
258 /* RFC 3376: 8.3. Query Response Interval - Default: 100 deciseconds for IGMP */
259 /* RFC 2710: 7.3. Query Response Interval - Default: 100 deciseconds for MLD */
260 #define GM_QUERY_MAX_RESPONSE_TIME_DSEC 100
261
262 /* RFC 3376: 8.8. Last Member Query Interval - Default: 10 deciseconds for IGMP
263 */
264 /* RFC 2710: 7.8. Last Listener Query Interval - Default: 10 deciseconds for MLD
265 */
266 #define GM_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC 10
267
268 void pim_router_init(void);
269 void pim_router_terminate(void);
270
271 void pim_init(void);
272 void pim_terminate(void);
273
274 extern void pim_route_map_init(void);
275 extern void pim_route_map_terminate(void);
276 void pim_prefix_list_update(struct prefix_list *plist);
277
278 #endif /* PIMD_H */