]>
Commit | Line | Data |
---|---|---|
12e41d03 | 1 | /* |
896014f4 DL |
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 | */ | |
12e41d03 DL |
19 | |
20 | #ifndef PIM_UPSTREAM_H | |
21 | #define PIM_UPSTREAM_H | |
22 | ||
23 | #include <zebra.h> | |
05e451f8 | 24 | #include <prefix.h> |
ba4eb1bc | 25 | #include "plist.h" |
12e41d03 | 26 | |
f9717886 | 27 | #include <pimd/pim_rpf.h> |
ba4eb1bc CS |
28 | #include "pim_str.h" |
29 | #include "pim_ifchannel.h" | |
bfea315d | 30 | |
12e41d03 | 31 | #define PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED (1 << 0) |
ca973133 DS |
32 | #define PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED (1 << 1) |
33 | #define PIM_UPSTREAM_FLAG_MASK_FHR (1 << 2) | |
34 | #define PIM_UPSTREAM_FLAG_MASK_SRC_IGMP (1 << 3) | |
35 | #define PIM_UPSTREAM_FLAG_MASK_SRC_PIM (1 << 4) | |
36 | #define PIM_UPSTREAM_FLAG_MASK_SRC_STREAM (1 << 5) | |
1bf16443 | 37 | #define PIM_UPSTREAM_FLAG_MASK_SRC_MSDP (1 << 6) |
54179a37 | 38 | #define PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE (1 << 7) |
850a9f99 DS |
39 | #define PIM_UPSTREAM_FLAG_MASK_SRC_LHR (1 << 8) |
40 | #define PIM_UPSTREAM_FLAG_ALL 0xFFFFFFFF | |
12e41d03 DL |
41 | |
42 | #define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) | |
43 | #define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED_UPDATED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) | |
69ff3706 | 44 | #define PIM_UPSTREAM_FLAG_TEST_FHR(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_FHR) |
1d3a62cd DS |
45 | #define PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) |
46 | #define PIM_UPSTREAM_FLAG_TEST_SRC_PIM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_PIM) | |
47 | #define PIM_UPSTREAM_FLAG_TEST_SRC_STREAM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) | |
7667c556 | 48 | #define PIM_UPSTREAM_FLAG_TEST_SRC_MSDP(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) |
54179a37 | 49 | #define PIM_UPSTREAM_FLAG_TEST_SEND_SG_RPT_PRUNE(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) |
850a9f99 | 50 | #define PIM_UPSTREAM_FLAG_TEST_SRC_LHR(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_LHR) |
12e41d03 DL |
51 | |
52 | #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) | |
53 | #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) | |
69ff3706 | 54 | #define PIM_UPSTREAM_FLAG_SET_FHR(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_FHR) |
1d3a62cd DS |
55 | #define PIM_UPSTREAM_FLAG_SET_SRC_IGMP(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) |
56 | #define PIM_UPSTREAM_FLAG_SET_SRC_PIM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_PIM) | |
57 | #define PIM_UPSTREAM_FLAG_SET_SRC_STREAM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) | |
7667c556 | 58 | #define PIM_UPSTREAM_FLAG_SET_SRC_MSDP(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) |
54179a37 | 59 | #define PIM_UPSTREAM_FLAG_SET_SEND_SG_RPT_PRUNE(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) |
850a9f99 | 60 | #define PIM_UPSTREAM_FLAG_SET_SRC_LHR(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_LHR) |
12e41d03 DL |
61 | |
62 | #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) | |
63 | #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) | |
69ff3706 | 64 | #define PIM_UPSTREAM_FLAG_UNSET_FHR(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_FHR) |
1d3a62cd DS |
65 | #define PIM_UPSTREAM_FLAG_UNSET_SRC_IGMP(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) |
66 | #define PIM_UPSTREAM_FLAG_UNSET_SRC_PIM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_PIM) | |
67 | #define PIM_UPSTREAM_FLAG_UNSET_SRC_STREAM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) | |
7667c556 | 68 | #define PIM_UPSTREAM_FLAG_UNSET_SRC_MSDP(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_MSDP) |
54179a37 | 69 | #define PIM_UPSTREAM_FLAG_UNSET_SEND_SG_RPT_PRUNE(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE) |
850a9f99 | 70 | #define PIM_UPSTREAM_FLAG_UNSET_SRC_LHR(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_LHR) |
12e41d03 | 71 | |
12e41d03 | 72 | enum pim_upstream_state { |
d62a17ae | 73 | PIM_UPSTREAM_NOTJOINED, |
74 | PIM_UPSTREAM_JOINED, | |
12e41d03 DL |
75 | }; |
76 | ||
0c2ebf00 | 77 | enum pim_reg_state { |
d62a17ae | 78 | PIM_REG_NOINFO, |
79 | PIM_REG_JOIN, | |
80 | PIM_REG_JOIN_PENDING, | |
81 | PIM_REG_PRUNE, | |
0c2ebf00 | 82 | }; |
83 | ||
d99764f6 | 84 | enum pim_upstream_sptbit { |
d62a17ae | 85 | PIM_UPSTREAM_SPTBIT_FALSE, |
86 | PIM_UPSTREAM_SPTBIT_TRUE | |
d99764f6 DS |
87 | }; |
88 | ||
12e41d03 DL |
89 | /* |
90 | Upstream (S,G) channel in Joined state | |
d62a17ae | 91 | |
12e41d03 | 92 | (S,G) in the "Not Joined" state is not represented |
d62a17ae | 93 | |
12e41d03 DL |
94 | See RFC 4601: 4.5.7. Sending (S,G) Join/Prune Message |
95 | */ | |
96 | struct pim_upstream { | |
d62a17ae | 97 | struct pim_upstream *parent; |
98 | struct in_addr upstream_addr; /* Who we are talking to */ | |
99 | struct in_addr upstream_register; /*Who we received a register from*/ | |
100 | struct prefix_sg sg; /* (S,G) group key */ | |
101 | char sg_str[PIM_SG_LEN]; | |
102 | uint32_t flags; | |
103 | struct channel_oil *channel_oil; | |
104 | struct list *sources; | |
105 | struct list *ifchannels; | |
106 | ||
107 | enum pim_upstream_state join_state; | |
108 | enum pim_reg_state reg_state; | |
109 | enum pim_upstream_sptbit sptbit; | |
110 | ||
111 | int ref_count; | |
112 | ||
113 | struct pim_rpf rpf; | |
114 | ||
115 | struct thread *t_join_timer; | |
116 | ||
117 | /* | |
118 | * RST(S,G) | |
119 | */ | |
120 | struct thread *t_rs_timer; | |
2ddab288 | 121 | #define PIM_REGISTER_SUPPRESSION_PERIOD (60) |
38de2445 | 122 | #define PIM_REGISTER_PROBE_PERIOD (5) |
2ddab288 | 123 | |
d62a17ae | 124 | /* |
125 | * KAT(S,G) | |
126 | */ | |
127 | struct thread *t_ka_timer; | |
4a4c4a07 | 128 | #define PIM_KEEPALIVE_PERIOD (210) |
2925dff5 | 129 | #define PIM_RP_KEEPALIVE_PERIOD \ |
a6c5db59 | 130 | (3 * router->register_suppress_time + router->register_probe_time) |
4a4c4a07 | 131 | |
d62a17ae | 132 | /* on the RP we restart a timer to indicate if registers are being rxed |
133 | * for | |
134 | * SG. This is needed by MSDP to determine its local SA cache */ | |
135 | struct thread *t_msdp_reg_timer; | |
2925dff5 | 136 | #define PIM_MSDP_REG_RXED_PERIOD (3 * (1.5 * router->register_suppress_time)) |
1bf16443 | 137 | |
d62a17ae | 138 | int64_t state_transition; /* Record current state uptime */ |
12e41d03 DL |
139 | }; |
140 | ||
9b29ea95 DS |
141 | struct pim_upstream *pim_upstream_find(struct pim_instance *pim, |
142 | struct prefix_sg *sg); | |
d62a17ae | 143 | struct pim_upstream *pim_upstream_find_or_add(struct prefix_sg *sg, |
144 | struct interface *ifp, int flags, | |
145 | const char *name); | |
2002dcdb DS |
146 | struct pim_upstream *pim_upstream_add(struct pim_instance *pim, |
147 | struct prefix_sg *sg, | |
d62a17ae | 148 | struct interface *ifp, int flags, |
0885a9f1 DS |
149 | const char *name, |
150 | struct pim_ifchannel *ch); | |
d62a17ae | 151 | void pim_upstream_ref(struct pim_upstream *up, int flags, const char *name); |
9b29ea95 DS |
152 | struct pim_upstream *pim_upstream_del(struct pim_instance *pim, |
153 | struct pim_upstream *up, | |
d62a17ae | 154 | const char *name); |
12e41d03 | 155 | |
9b29ea95 DS |
156 | int pim_upstream_evaluate_join_desired(struct pim_instance *pim, |
157 | struct pim_upstream *up); | |
9f44d042 | 158 | int pim_upstream_evaluate_join_desired_interface(struct pim_upstream *up, |
d62a17ae | 159 | struct pim_ifchannel *ch, |
160 | struct pim_ifchannel *starch); | |
9b29ea95 DS |
161 | void pim_upstream_update_join_desired(struct pim_instance *pim, |
162 | struct pim_upstream *up); | |
12e41d03 DL |
163 | |
164 | void pim_upstream_join_suppress(struct pim_upstream *up, | |
d62a17ae | 165 | struct in_addr rpf_addr, int holdtime); |
c48a612c | 166 | |
12e41d03 | 167 | void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label, |
d62a17ae | 168 | struct pim_upstream *up); |
c48a612c | 169 | |
d62a17ae | 170 | void pim_upstream_join_timer_restart(struct pim_upstream *up, |
171 | struct pim_rpf *old); | |
9b29ea95 DS |
172 | void pim_upstream_rpf_genid_changed(struct pim_instance *pim, |
173 | struct in_addr neigh_addr); | |
12e41d03 DL |
174 | void pim_upstream_rpf_interface_changed(struct pim_upstream *up, |
175 | struct interface *old_rpf_ifp); | |
176 | ||
177 | void pim_upstream_update_could_assert(struct pim_upstream *up); | |
178 | void pim_upstream_update_my_assert_metric(struct pim_upstream *up); | |
179 | ||
d62a17ae | 180 | void pim_upstream_keep_alive_timer_start(struct pim_upstream *up, |
181 | uint32_t time); | |
cb40b272 | 182 | |
8e5f97e3 DS |
183 | int pim_upstream_switch_to_spt_desired(struct pim_instance *pim, |
184 | struct prefix_sg *sg); | |
185 | #define SwitchToSptDesired(pim, sg) pim_upstream_switch_to_spt_desired (pim, sg) | |
d62a17ae | 186 | int pim_upstream_is_sg_rpt(struct pim_upstream *up); |
cb40b272 | 187 | |
d62a17ae | 188 | void pim_upstream_set_sptbit(struct pim_upstream *up, |
189 | struct interface *incoming); | |
3a66b17b | 190 | |
d62a17ae | 191 | void pim_upstream_start_register_stop_timer(struct pim_upstream *up, |
192 | int null_register); | |
627ed2a3 | 193 | |
d62a17ae | 194 | void pim_upstream_send_join(struct pim_upstream *up); |
56638739 | 195 | |
1eca8576 | 196 | void pim_upstream_switch(struct pim_instance *pim, struct pim_upstream *up, |
d62a17ae | 197 | enum pim_upstream_state new_state); |
7fcdfb34 | 198 | |
d62a17ae | 199 | const char *pim_upstream_state2str(enum pim_upstream_state join_state); |
e0e127b0 | 200 | #define PIM_REG_STATE_STR_LEN 12 |
d62a17ae | 201 | const char *pim_reg_state2str(enum pim_reg_state state, char *state_str); |
4fdc8f36 | 202 | |
9b29ea95 DS |
203 | int pim_upstream_inherited_olist_decide(struct pim_instance *pim, |
204 | struct pim_upstream *up); | |
205 | int pim_upstream_inherited_olist(struct pim_instance *pim, | |
206 | struct pim_upstream *up); | |
d62a17ae | 207 | int pim_upstream_empty_inherited_olist(struct pim_upstream *up); |
d3dd1804 | 208 | |
9b29ea95 | 209 | void pim_upstream_find_new_rpf(struct pim_instance *pim); |
1bf16443 | 210 | void pim_upstream_msdp_reg_timer_start(struct pim_upstream *up); |
d3dd1804 | 211 | |
9b29ea95 DS |
212 | void pim_upstream_init(struct pim_instance *pim); |
213 | void pim_upstream_terminate(struct pim_instance *pim); | |
982bff89 | 214 | |
d62a17ae | 215 | void join_timer_start(struct pim_upstream *up); |
216 | int pim_upstream_compare(void *arg1, void *arg2); | |
9b29ea95 | 217 | void pim_upstream_register_reevaluate(struct pim_instance *pim); |
a7b2b1e2 | 218 | |
9b29ea95 DS |
219 | void pim_upstream_add_lhr_star_pimreg(struct pim_instance *pim); |
220 | void pim_upstream_remove_lhr_star_pimreg(struct pim_instance *pim, | |
221 | const char *nlist); | |
df94f9a9 | 222 | |
9b29ea95 DS |
223 | void pim_upstream_spt_prefix_list_update(struct pim_instance *pim, |
224 | struct prefix_list *pl); | |
7c591950 DS |
225 | |
226 | unsigned int pim_upstream_hash_key(void *arg); | |
74df8d6d | 227 | bool pim_upstream_equal(const void *arg1, const void *arg2); |
12e41d03 | 228 | #endif /* PIM_UPSTREAM_H */ |