]>
Commit | Line | Data |
---|---|---|
acddc0ed | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
d62a17ae | 2 | /* |
65efcfce LB |
3 | * |
4 | * Copyright 2009-2016, LabN Consulting, L.L.C. | |
5 | * | |
65efcfce LB |
6 | */ |
7 | ||
8 | #ifndef QUAGGA_HGP_RFAPI_MONITOR_H | |
9 | #define QUAGGA_HGP_RFAPI_MONITOR_H | |
10 | ||
f8b6f499 LB |
11 | #include "lib/zebra.h" |
12 | #include "lib/prefix.h" | |
13 | #include "lib/table.h" | |
65efcfce LB |
14 | |
15 | /* | |
16 | * These get attached to the nodes in an import table (using "aggregate" ptr) | |
17 | * to indicate which nves are interested in a prefix/target | |
18 | */ | |
d62a17ae | 19 | struct rfapi_monitor_vpn { |
fe08ba7e | 20 | struct rfapi_monitor_vpn *next; /* chain from struct agg_node */ |
d62a17ae | 21 | struct rfapi_descriptor *rfd; /* which NVE requested the route */ |
22 | struct prefix p; /* constant: pfx in original request */ | |
fe08ba7e | 23 | struct agg_node *node; /* node we're currently attached to */ |
d62a17ae | 24 | uint32_t flags; |
65efcfce LB |
25 | #define RFAPI_MON_FLAG_NEEDCALLBACK 0x00000001 /* deferred callback */ |
26 | ||
d62a17ae | 27 | // int dcount; /* debugging counter */ |
28 | struct thread *timer; | |
65efcfce LB |
29 | }; |
30 | ||
d62a17ae | 31 | struct rfapi_monitor_encap { |
32 | struct rfapi_monitor_encap *next; | |
33 | struct rfapi_monitor_encap *prev; | |
fe08ba7e | 34 | struct agg_node *node; /* VPN node */ |
40381db7 | 35 | struct bgp_path_info *bpi; /* VPN bpi */ |
fe08ba7e | 36 | struct agg_node *rn; /* parent node */ |
65efcfce LB |
37 | }; |
38 | ||
d62a17ae | 39 | struct rfapi_monitor_eth { |
40 | struct rfapi_monitor_eth *next; /* for use in vpn0_queries list */ | |
41 | struct rfapi_descriptor *rfd; /* which NVE requested the route */ | |
42 | struct ethaddr macaddr; | |
43 | uint32_t logical_net_id; | |
44 | struct thread *timer; | |
65efcfce LB |
45 | }; |
46 | ||
47 | /* | |
48 | * This is referenced by the "aggregate" field of a route node | |
49 | * in an RFAPI import table. | |
50 | * | |
51 | * node lock/unlock: | |
52 | * - one lock increment for this structure itself | |
53 | * - one lock per chained struct rfapi_monitor_vpn | |
54 | * - one lock for the mon_eth skiplist itself | |
55 | * - one lock per mon_eth skiplist entry | |
56 | * - one lock for the ext skiplist itself | |
57 | * - one lock for each ext skiplist entry | |
58 | * remember to free skiplist when freeing rfapi_it_extra | |
59 | * - one lock per chained struct rfapi_monitor_encap | |
60 | * | |
61 | */ | |
d62a17ae | 62 | struct rfapi_it_extra { |
63 | union { | |
64 | struct { | |
65 | struct rfapi_monitor_vpn *v; | |
66 | struct skiplist *idx_rd; /* RD index */ | |
67 | struct skiplist *mon_eth; /* ether queries */ | |
68 | struct { | |
69 | /* routes with UN addrs, either cached encap or | |
70 | * Encap TLV */ | |
71 | int valid_interior_count; | |
72 | ||
40381db7 | 73 | /* unicast exterior routes, key=bpi, |
d62a17ae | 74 | * val=allocated prefix */ |
75 | struct skiplist *source; | |
76 | } e; | |
77 | } vpn; | |
78 | struct { | |
79 | struct rfapi_monitor_encap *e; | |
80 | } encap; | |
81 | } u; | |
65efcfce LB |
82 | }; |
83 | ||
d62a17ae | 84 | #define RFAPI_IT_EXTRA_GET(rn) \ |
85 | ((struct rfapi_it_extra \ | |
86 | *)((rn)->aggregate \ | |
87 | ? (rn)->aggregate \ | |
fe08ba7e | 88 | : (agg_lock_node(rn), \ |
d62a17ae | 89 | (rn)->aggregate = XCALLOC( \ |
90 | MTYPE_RFAPI_IT_EXTRA, \ | |
91 | sizeof(struct rfapi_it_extra))))) | |
65efcfce | 92 | |
d62a17ae | 93 | #define RFAPI_RDINDEX(rn) \ |
94 | ((rn)->aggregate ? RFAPI_IT_EXTRA_GET(rn)->u.vpn.idx_rd : NULL) | |
65efcfce LB |
95 | |
96 | #define RFAPI_RDINDEX_W_ALLOC(rn) (RFAPI_IT_EXTRA_GET(rn)->u.vpn.idx_rd) | |
97 | ||
d62a17ae | 98 | #define RFAPI_MONITOR_ETH(rn) \ |
99 | ((rn)->aggregate ? RFAPI_IT_EXTRA_GET(rn)->u.vpn.mon_eth : NULL) | |
65efcfce LB |
100 | |
101 | #define RFAPI_MONITOR_ETH_W_ALLOC(rn) (RFAPI_IT_EXTRA_GET(rn)->u.vpn.mon_eth) | |
102 | ||
d62a17ae | 103 | #define RFAPI_MONITOR_VPN(rn) \ |
104 | ((rn)->aggregate ? RFAPI_IT_EXTRA_GET(rn)->u.vpn.v : NULL) | |
65efcfce LB |
105 | |
106 | #define RFAPI_MONITOR_VPN_W_ALLOC(rn) (RFAPI_IT_EXTRA_GET(rn)->u.vpn.v) | |
107 | ||
d62a17ae | 108 | #define RFAPI_MONITOR_ENCAP(rn) \ |
109 | ((rn)->aggregate ? RFAPI_IT_EXTRA_GET(rn)->u.encap.e : NULL) | |
65efcfce LB |
110 | |
111 | #define RFAPI_MONITOR_ENCAP_W_ALLOC(rn) (RFAPI_IT_EXTRA_GET(rn)->u.encap.e) | |
112 | ||
113 | #define RFAPI_MONITOR_EXTERIOR(rn) (&(RFAPI_IT_EXTRA_GET(rn)->u.vpn.e)) | |
114 | ||
d62a17ae | 115 | #define RFAPI_HAS_MONITOR_EXTERIOR(rn) \ |
116 | (rn && rn->aggregate \ | |
117 | && ((struct rfapi_it_extra *)(rn->aggregate))->u.vpn.e.source \ | |
118 | && !skiplist_first(((struct rfapi_it_extra *)(rn->aggregate)) \ | |
119 | ->u.vpn.e.source, \ | |
120 | NULL, NULL)) | |
65efcfce | 121 | |
d62a17ae | 122 | extern void rfapiMonitorLoopCheck(struct rfapi_monitor_vpn *mchain); |
65efcfce | 123 | |
d62a17ae | 124 | extern void rfapiMonitorCleanCheck(struct bgp *bgp); |
65efcfce | 125 | |
d62a17ae | 126 | extern void rfapiMonitorCheckAttachAllowed(void); |
65efcfce | 127 | |
fe08ba7e | 128 | extern void rfapiMonitorExtraFlush(safi_t safi, struct agg_node *rn); |
65efcfce | 129 | |
fe08ba7e DS |
130 | extern struct agg_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd, |
131 | struct prefix *p); | |
65efcfce | 132 | |
d62a17ae | 133 | extern void rfapiMonitorAttachImportHd(struct rfapi_descriptor *rfd); |
65efcfce | 134 | |
fe08ba7e DS |
135 | extern struct agg_node *rfapiMonitorAdd(struct bgp *bgp, |
136 | struct rfapi_descriptor *rfd, | |
137 | struct prefix *p); | |
65efcfce | 138 | |
d62a17ae | 139 | extern void rfapiMonitorDetachImportHd(struct rfapi_descriptor *rfd); |
65efcfce | 140 | |
d62a17ae | 141 | extern void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd, |
142 | struct prefix *p); | |
65efcfce | 143 | |
d62a17ae | 144 | extern int rfapiMonitorDelHd(struct rfapi_descriptor *rfd); |
65efcfce | 145 | |
d62a17ae | 146 | extern void rfapiMonitorCallbacksOff(struct bgp *bgp); |
65efcfce | 147 | |
d62a17ae | 148 | extern void rfapiMonitorCallbacksOn(struct bgp *bgp); |
65efcfce | 149 | |
d62a17ae | 150 | extern void rfapiMonitorResponseRemovalOff(struct bgp *bgp); |
65efcfce | 151 | |
d62a17ae | 152 | extern void rfapiMonitorResponseRemovalOn(struct bgp *bgp); |
65efcfce | 153 | |
fe08ba7e | 154 | extern void rfapiMonitorExtraPrune(safi_t safi, struct agg_node *rn); |
65efcfce | 155 | |
d62a17ae | 156 | extern void rfapiMonitorTimersRestart(struct rfapi_descriptor *rfd, |
26a3ffd6 | 157 | const struct prefix *p); |
65efcfce | 158 | |
d62a17ae | 159 | extern void rfapiMonitorItNodeChanged(struct rfapi_import_table *import_table, |
fe08ba7e | 160 | struct agg_node *it_node, |
d62a17ae | 161 | struct rfapi_monitor_vpn *monitor_list); |
65efcfce | 162 | |
d62a17ae | 163 | extern void rfapiMonitorMovedUp(struct rfapi_import_table *import_table, |
fe08ba7e DS |
164 | struct agg_node *old_node, |
165 | struct agg_node *new_node, | |
d62a17ae | 166 | struct rfapi_monitor_vpn *monitor_list); |
65efcfce | 167 | |
fe08ba7e DS |
168 | extern struct agg_node *rfapiMonitorEthAdd(struct bgp *bgp, |
169 | struct rfapi_descriptor *rfd, | |
170 | struct ethaddr *macaddr, | |
171 | uint32_t logical_net_id); | |
d62a17ae | 172 | |
173 | extern void rfapiMonitorEthDel(struct bgp *bgp, struct rfapi_descriptor *rfd, | |
174 | struct ethaddr *macaddr, | |
175 | uint32_t logical_net_id); | |
65efcfce LB |
176 | |
177 | #endif /* QUAGGA_HGP_RFAPI_MONITOR_H */ |