]> git.proxmox.com Git - mirror_frr.git/blob - pimd/pim_nht.h
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / pimd / pim_nht.h
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * PIM for Quagga
4 * Copyright (C) 2017 Cumulus Networks, Inc.
5 * Chirag Shah
6 */
7 #ifndef PIM_NHT_H
8 #define PIM_NHT_H
9
10 #include "prefix.h"
11 #include <zebra.h>
12 #include "zclient.h"
13 #include "vrf.h"
14
15 #include "pimd.h"
16 #include "pim_rp.h"
17 #include "pim_rpf.h"
18
19 /* PIM nexthop cache value structure. */
20 struct pim_nexthop_cache {
21 struct pim_rpf rpf;
22 /* IGP route's metric. */
23 uint32_t metric;
24 uint32_t distance;
25 /* Nexthop number and nexthop linked list. */
26 uint8_t nexthop_num;
27 struct nexthop *nexthop;
28 int64_t last_update;
29 uint16_t flags;
30 #define PIM_NEXTHOP_VALID (1 << 0)
31 #define PIM_NEXTHOP_ANSWER_RECEIVED (1 << 1)
32
33 struct list *rp_list;
34 struct hash *upstream_hash;
35
36 /* bsr_count won't currently go above 1 as we only have global_scope,
37 * but if anyone adds scope support multiple scopes may NHT-track the
38 * same BSR
39 */
40 uint32_t bsr_count;
41 };
42
43 struct pnc_hash_walk_data {
44 struct pim_instance *pim;
45 struct interface *ifp;
46 };
47
48 int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS);
49 int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr addr,
50 struct pim_upstream *up, struct rp_info *rp,
51 struct pim_nexthop_cache *out_pnc);
52 void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr addr,
53 struct pim_upstream *up, struct rp_info *rp);
54 struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim,
55 struct pim_rpf *rpf);
56 uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp);
57 int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
58 struct pim_nexthop *nexthop, pim_addr src,
59 struct prefix *grp, int neighbor_needed);
60 void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient,
61 struct pim_nexthop_cache *pnc, int command);
62 int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr src,
63 struct prefix *grp);
64 void pim_rp_nexthop_del(struct rp_info *rp_info);
65
66 /* for RPF check on BSM message receipt */
67 void pim_nht_bsr_add(struct pim_instance *pim, pim_addr bsr_addr);
68 void pim_nht_bsr_del(struct pim_instance *pim, pim_addr bsr_addr);
69 /* RPF(bsr_addr) == src_ip%src_ifp? */
70 bool pim_nht_bsr_rpf_check(struct pim_instance *pim, pim_addr bsr_addr,
71 struct interface *src_ifp, pim_addr src_ip);
72 void pim_upstream_nh_if_update(struct pim_instance *pim, struct interface *ifp);
73 #endif