]> git.proxmox.com Git - mirror_frr.git/blame - pimd/pim_upstream.h
Merge pull request #4749 from ton31337/fix/next-hop-self_force_alias_for_ipv6_7.1
[mirror_frr.git] / pimd / pim_upstream.h
CommitLineData
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 39#define PIM_UPSTREAM_FLAG_MASK_SRC_LHR (1 << 8)
820b4a40
AK
40/* In the case of pim vxlan we prime the pump by registering the
41 * vxlan source and keeping the SPT (FHR-RP) alive by sending periodic
42 * NULL registers. So we need to prevent KAT expiry because of the
43 * lack of BUM traffic.
44 */
45#define PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY (1 << 9)
6a5de0ad
AK
46/* for pim vxlan we need to pin the IIF to lo or MLAG-ISL on the
47 * originating VTEP. This flag allows that by setting IIF to the
48 * value specified and preventing next-hop-tracking on the entry
49 */
50#define PIM_UPSTREAM_FLAG_MASK_STATIC_IIF (1 << 10)
7d973323 51#define PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL (1 << 11)
76e4825a
AK
52/* Disable pimreg encasulation for a flow */
53#define PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA (1 << 12)
8eeaef9b
AK
54/* For some MDTs we need to register the router as a source even
55 * if the not DR or directly connected on the IIF. This is typically
56 * needed on a VxLAN-AA (MLAG) setup.
57 */
58#define PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG (1 << 13)
e12fa762
AK
59/* VxLAN origination mroute - SG was registered by EVPN where S is the
60 * local VTEP IP and G is the BUM multicast group address
61 */
62#define PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG (1 << 14)
63/* VxLAN termination mroute - *G entry where G is the BUM multicast group
64 * address
65 */
66#define PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM (1 << 15)
f376b701
AK
67/* MLAG mroute - synced to the MLAG peer and subject to DF (designated
68 * forwarder) election
69 */
70#define PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN (1 << 16)
71/* MLAG mroute that lost the DF election with peer and is installed in
72 * a dormant state i.e. MLAG OIFs are removed from the MFC.
73 * In most cases the OIL is empty (but not not always) simply
74 * blackholing the traffic pulled down to the LHR.
75 */
76#define PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF (1 << 17)
850a9f99 77#define PIM_UPSTREAM_FLAG_ALL 0xFFFFFFFF
12e41d03
DL
78
79#define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED)
80#define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED_UPDATED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED)
69ff3706 81#define PIM_UPSTREAM_FLAG_TEST_FHR(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_FHR)
1d3a62cd
DS
82#define PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
83#define PIM_UPSTREAM_FLAG_TEST_SRC_PIM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_PIM)
84#define PIM_UPSTREAM_FLAG_TEST_SRC_STREAM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_STREAM)
7667c556 85#define PIM_UPSTREAM_FLAG_TEST_SRC_MSDP(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_MSDP)
54179a37 86#define PIM_UPSTREAM_FLAG_TEST_SEND_SG_RPT_PRUNE(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE)
850a9f99 87#define PIM_UPSTREAM_FLAG_TEST_SRC_LHR(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_LHR)
820b4a40 88#define PIM_UPSTREAM_FLAG_TEST_DISABLE_KAT_EXPIRY(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY)
6a5de0ad 89#define PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_STATIC_IIF)
7d973323 90#define PIM_UPSTREAM_FLAG_TEST_ALLOW_IIF_IN_OIL(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL)
76e4825a 91#define PIM_UPSTREAM_FLAG_TEST_NO_PIMREG_DATA(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA)
8eeaef9b 92#define PIM_UPSTREAM_FLAG_TEST_FORCE_PIMREG(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG)
e12fa762
AK
93#define PIM_UPSTREAM_FLAG_TEST_SRC_VXLAN_ORIG(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG)
94#define PIM_UPSTREAM_FLAG_TEST_SRC_VXLAN_TERM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM)
95#define PIM_UPSTREAM_FLAG_TEST_SRC_VXLAN(flags) ((flags) & (PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG | PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM))
f376b701
AK
96#define PIM_UPSTREAM_FLAG_TEST_MLAG_VXLAN(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN)
97#define PIM_UPSTREAM_FLAG_TEST_MLAG_NON_DF(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF)
12e41d03
DL
98
99#define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED)
100#define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED)
69ff3706 101#define PIM_UPSTREAM_FLAG_SET_FHR(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_FHR)
1d3a62cd
DS
102#define PIM_UPSTREAM_FLAG_SET_SRC_IGMP(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
103#define PIM_UPSTREAM_FLAG_SET_SRC_PIM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_PIM)
104#define PIM_UPSTREAM_FLAG_SET_SRC_STREAM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_STREAM)
7667c556 105#define PIM_UPSTREAM_FLAG_SET_SRC_MSDP(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_MSDP)
54179a37 106#define PIM_UPSTREAM_FLAG_SET_SEND_SG_RPT_PRUNE(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE)
850a9f99 107#define PIM_UPSTREAM_FLAG_SET_SRC_LHR(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_LHR)
820b4a40 108#define PIM_UPSTREAM_FLAG_SET_DISABLE_KAT_EXPIRY(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY)
6a5de0ad 109#define PIM_UPSTREAM_FLAG_SET_STATIC_IIF(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_STATIC_IIF)
7d973323 110#define PIM_UPSTREAM_FLAG_SET_ALLOW_IIF_IN_OIL(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL)
76e4825a 111#define PIM_UPSTREAM_FLAG_SET_NO_PIMREG_DATA(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA)
8eeaef9b 112#define PIM_UPSTREAM_FLAG_SET_FORCE_PIMREG(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG)
e12fa762
AK
113#define PIM_UPSTREAM_FLAG_SET_SRC_VXLAN_ORIG(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG)
114#define PIM_UPSTREAM_FLAG_SET_SRC_VXLAN_TERM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM)
f376b701
AK
115#define PIM_UPSTREAM_FLAG_SET_MLAG_VXLAN(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN)
116#define PIM_UPSTREAM_FLAG_SET_MLAG_NON_DF(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF)
12e41d03
DL
117
118#define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED)
119#define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED)
69ff3706 120#define PIM_UPSTREAM_FLAG_UNSET_FHR(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_FHR)
1d3a62cd
DS
121#define PIM_UPSTREAM_FLAG_UNSET_SRC_IGMP(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_IGMP)
122#define PIM_UPSTREAM_FLAG_UNSET_SRC_PIM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_PIM)
123#define PIM_UPSTREAM_FLAG_UNSET_SRC_STREAM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_STREAM)
7667c556 124#define PIM_UPSTREAM_FLAG_UNSET_SRC_MSDP(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_MSDP)
54179a37 125#define PIM_UPSTREAM_FLAG_UNSET_SEND_SG_RPT_PRUNE(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SEND_SG_RPT_PRUNE)
850a9f99 126#define PIM_UPSTREAM_FLAG_UNSET_SRC_LHR(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_LHR)
820b4a40 127#define PIM_UPSTREAM_FLAG_UNSET_DISABLE_KAT_EXPIRY(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY)
6a5de0ad 128#define PIM_UPSTREAM_FLAG_UNSET_STATIC_IIF(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_STATIC_IIF)
7d973323 129#define PIM_UPSTREAM_FLAG_UNSET_ALLOW_IIF_IN_OIL(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL)
76e4825a 130#define PIM_UPSTREAM_FLAG_UNSET_NO_PIMREG_DATA(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA)
8eeaef9b 131#define PIM_UPSTREAM_FLAG_UNSET_FORCE_PIMREG(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_FORCE_PIMREG)
e12fa762
AK
132#define PIM_UPSTREAM_FLAG_UNSET_SRC_VXLAN_ORIG(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_ORIG)
133#define PIM_UPSTREAM_FLAG_UNSET_SRC_VXLAN_TERM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM)
f376b701
AK
134#define PIM_UPSTREAM_FLAG_UNSET_MLAG_VXLAN(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN)
135#define PIM_UPSTREAM_FLAG_UNSET_MLAG_NON_DF(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_MLAG_NON_DF)
12e41d03 136
12e41d03 137enum pim_upstream_state {
d62a17ae 138 PIM_UPSTREAM_NOTJOINED,
139 PIM_UPSTREAM_JOINED,
12e41d03
DL
140};
141
0c2ebf00 142enum pim_reg_state {
d62a17ae 143 PIM_REG_NOINFO,
144 PIM_REG_JOIN,
145 PIM_REG_JOIN_PENDING,
146 PIM_REG_PRUNE,
0c2ebf00 147};
148
d99764f6 149enum pim_upstream_sptbit {
d62a17ae 150 PIM_UPSTREAM_SPTBIT_FALSE,
151 PIM_UPSTREAM_SPTBIT_TRUE
d99764f6
DS
152};
153
12e41d03
DL
154/*
155 Upstream (S,G) channel in Joined state
12e41d03 156 (S,G) in the "Not Joined" state is not represented
12e41d03 157 See RFC 4601: 4.5.7. Sending (S,G) Join/Prune Message
bbe598df
SP
158
159 upstream_addr : Who we are talking to.
160 For (*, G), upstream_addr is RP address or INADDR_ANY(if RP not configured)
161 For (S, G), upstream_addr is source address
162
163 rpf: contains the nexthop information to whom we are talking to.
164
165 join_state: JOINED/NOTJOINED
166
167 In the case when FRR receives IGMP/PIM (*, G) join for group G and RP is not
168 configured, then create a pim_upstream with the below information.
169 pim_upstream->upstream address: INADDR_ANY
170 pim_upstream->rpf: Unknown
171 pim_upstream->state: NOTJOINED
172
173 When a new RP gets configured for G, find the corresponding pim upstream (*,G)
174 entries and update the upstream address as new RP address if it the better one
175 for the group G.
176
177 When RP becomes reachable, populate the nexthop information in
178 pim_upstream->rpf and update the state to JOINED.
179
12e41d03
DL
180*/
181struct pim_upstream {
d62a17ae 182 struct pim_upstream *parent;
183 struct in_addr upstream_addr; /* Who we are talking to */
184 struct in_addr upstream_register; /*Who we received a register from*/
185 struct prefix_sg sg; /* (S,G) group key */
186 char sg_str[PIM_SG_LEN];
187 uint32_t flags;
188 struct channel_oil *channel_oil;
189 struct list *sources;
190 struct list *ifchannels;
191
192 enum pim_upstream_state join_state;
193 enum pim_reg_state reg_state;
194 enum pim_upstream_sptbit sptbit;
195
196 int ref_count;
197
198 struct pim_rpf rpf;
199
200 struct thread *t_join_timer;
201
202 /*
203 * RST(S,G)
204 */
205 struct thread *t_rs_timer;
2ddab288 206#define PIM_REGISTER_SUPPRESSION_PERIOD (60)
38de2445 207#define PIM_REGISTER_PROBE_PERIOD (5)
2ddab288 208
d62a17ae 209 /*
210 * KAT(S,G)
211 */
212 struct thread *t_ka_timer;
4a4c4a07 213#define PIM_KEEPALIVE_PERIOD (210)
2925dff5 214#define PIM_RP_KEEPALIVE_PERIOD \
a6c5db59 215 (3 * router->register_suppress_time + router->register_probe_time)
4a4c4a07 216
d62a17ae 217 /* on the RP we restart a timer to indicate if registers are being rxed
218 * for
219 * SG. This is needed by MSDP to determine its local SA cache */
220 struct thread *t_msdp_reg_timer;
2925dff5 221#define PIM_MSDP_REG_RXED_PERIOD (3 * (1.5 * router->register_suppress_time))
1bf16443 222
d62a17ae 223 int64_t state_transition; /* Record current state uptime */
12e41d03
DL
224};
225
9b29ea95
DS
226struct pim_upstream *pim_upstream_find(struct pim_instance *pim,
227 struct prefix_sg *sg);
d62a17ae 228struct pim_upstream *pim_upstream_find_or_add(struct prefix_sg *sg,
229 struct interface *ifp, int flags,
230 const char *name);
2002dcdb
DS
231struct pim_upstream *pim_upstream_add(struct pim_instance *pim,
232 struct prefix_sg *sg,
d62a17ae 233 struct interface *ifp, int flags,
0885a9f1
DS
234 const char *name,
235 struct pim_ifchannel *ch);
d62a17ae 236void pim_upstream_ref(struct pim_upstream *up, int flags, const char *name);
9b29ea95
DS
237struct pim_upstream *pim_upstream_del(struct pim_instance *pim,
238 struct pim_upstream *up,
d62a17ae 239 const char *name);
12e41d03 240
9b29ea95
DS
241int pim_upstream_evaluate_join_desired(struct pim_instance *pim,
242 struct pim_upstream *up);
9f44d042 243int pim_upstream_evaluate_join_desired_interface(struct pim_upstream *up,
d62a17ae 244 struct pim_ifchannel *ch,
245 struct pim_ifchannel *starch);
9b29ea95
DS
246void pim_upstream_update_join_desired(struct pim_instance *pim,
247 struct pim_upstream *up);
12e41d03
DL
248
249void pim_upstream_join_suppress(struct pim_upstream *up,
d62a17ae 250 struct in_addr rpf_addr, int holdtime);
c48a612c 251
12e41d03 252void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label,
d62a17ae 253 struct pim_upstream *up);
c48a612c 254
d62a17ae 255void pim_upstream_join_timer_restart(struct pim_upstream *up,
256 struct pim_rpf *old);
9b29ea95
DS
257void pim_upstream_rpf_genid_changed(struct pim_instance *pim,
258 struct in_addr neigh_addr);
12e41d03
DL
259void pim_upstream_rpf_interface_changed(struct pim_upstream *up,
260 struct interface *old_rpf_ifp);
261
262void pim_upstream_update_could_assert(struct pim_upstream *up);
263void pim_upstream_update_my_assert_metric(struct pim_upstream *up);
264
d62a17ae 265void pim_upstream_keep_alive_timer_start(struct pim_upstream *up,
266 uint32_t time);
cb40b272 267
8e5f97e3
DS
268int pim_upstream_switch_to_spt_desired(struct pim_instance *pim,
269 struct prefix_sg *sg);
270#define SwitchToSptDesired(pim, sg) pim_upstream_switch_to_spt_desired (pim, sg)
d62a17ae 271int pim_upstream_is_sg_rpt(struct pim_upstream *up);
cb40b272 272
d62a17ae 273void pim_upstream_set_sptbit(struct pim_upstream *up,
274 struct interface *incoming);
3a66b17b 275
d62a17ae 276void pim_upstream_start_register_stop_timer(struct pim_upstream *up,
277 int null_register);
627ed2a3 278
d62a17ae 279void pim_upstream_send_join(struct pim_upstream *up);
56638739 280
1eca8576 281void pim_upstream_switch(struct pim_instance *pim, struct pim_upstream *up,
d62a17ae 282 enum pim_upstream_state new_state);
7fcdfb34 283
d62a17ae 284const char *pim_upstream_state2str(enum pim_upstream_state join_state);
e0e127b0 285#define PIM_REG_STATE_STR_LEN 12
d62a17ae 286const char *pim_reg_state2str(enum pim_reg_state state, char *state_str);
4fdc8f36 287
9b29ea95
DS
288int pim_upstream_inherited_olist_decide(struct pim_instance *pim,
289 struct pim_upstream *up);
290int pim_upstream_inherited_olist(struct pim_instance *pim,
291 struct pim_upstream *up);
d62a17ae 292int pim_upstream_empty_inherited_olist(struct pim_upstream *up);
d3dd1804 293
9b29ea95 294void pim_upstream_find_new_rpf(struct pim_instance *pim);
1bf16443 295void pim_upstream_msdp_reg_timer_start(struct pim_upstream *up);
d3dd1804 296
9b29ea95
DS
297void pim_upstream_init(struct pim_instance *pim);
298void pim_upstream_terminate(struct pim_instance *pim);
982bff89 299
d62a17ae 300void join_timer_start(struct pim_upstream *up);
301int pim_upstream_compare(void *arg1, void *arg2);
9b29ea95 302void pim_upstream_register_reevaluate(struct pim_instance *pim);
a7b2b1e2 303
9b29ea95
DS
304void pim_upstream_add_lhr_star_pimreg(struct pim_instance *pim);
305void pim_upstream_remove_lhr_star_pimreg(struct pim_instance *pim,
306 const char *nlist);
df94f9a9 307
9b29ea95
DS
308void pim_upstream_spt_prefix_list_update(struct pim_instance *pim,
309 struct prefix_list *pl);
7c591950
DS
310
311unsigned int pim_upstream_hash_key(void *arg);
74df8d6d 312bool pim_upstream_equal(const void *arg1, const void *arg2);
ff459c36
AK
313struct pim_upstream *pim_upstream_keep_alive_timer_proc(
314 struct pim_upstream *up);
6a5de0ad
AK
315void pim_upstream_fill_static_iif(struct pim_upstream *up,
316 struct interface *incoming);
12e41d03 317#endif /* PIM_UPSTREAM_H */