]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/rfapi/rfapi_monitor.h
Merge pull request #12751 from Pdoijode/pdoijode/ospf-vrf-neighbor-detail-1
[mirror_frr.git] / bgpd / rfapi / rfapi_monitor.h
CommitLineData
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 19struct 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 31struct 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 39struct 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 62struct 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 122extern void rfapiMonitorLoopCheck(struct rfapi_monitor_vpn *mchain);
65efcfce 123
d62a17ae 124extern void rfapiMonitorCleanCheck(struct bgp *bgp);
65efcfce 125
d62a17ae 126extern void rfapiMonitorCheckAttachAllowed(void);
65efcfce 127
fe08ba7e 128extern void rfapiMonitorExtraFlush(safi_t safi, struct agg_node *rn);
65efcfce 129
fe08ba7e
DS
130extern struct agg_node *rfapiMonitorGetAttachNode(struct rfapi_descriptor *rfd,
131 struct prefix *p);
65efcfce 132
d62a17ae 133extern void rfapiMonitorAttachImportHd(struct rfapi_descriptor *rfd);
65efcfce 134
fe08ba7e
DS
135extern struct agg_node *rfapiMonitorAdd(struct bgp *bgp,
136 struct rfapi_descriptor *rfd,
137 struct prefix *p);
65efcfce 138
d62a17ae 139extern void rfapiMonitorDetachImportHd(struct rfapi_descriptor *rfd);
65efcfce 140
d62a17ae 141extern void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd,
142 struct prefix *p);
65efcfce 143
d62a17ae 144extern int rfapiMonitorDelHd(struct rfapi_descriptor *rfd);
65efcfce 145
d62a17ae 146extern void rfapiMonitorCallbacksOff(struct bgp *bgp);
65efcfce 147
d62a17ae 148extern void rfapiMonitorCallbacksOn(struct bgp *bgp);
65efcfce 149
d62a17ae 150extern void rfapiMonitorResponseRemovalOff(struct bgp *bgp);
65efcfce 151
d62a17ae 152extern void rfapiMonitorResponseRemovalOn(struct bgp *bgp);
65efcfce 153
fe08ba7e 154extern void rfapiMonitorExtraPrune(safi_t safi, struct agg_node *rn);
65efcfce 155
d62a17ae 156extern void rfapiMonitorTimersRestart(struct rfapi_descriptor *rfd,
26a3ffd6 157 const struct prefix *p);
65efcfce 158
d62a17ae 159extern 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 163extern 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
168extern struct agg_node *rfapiMonitorEthAdd(struct bgp *bgp,
169 struct rfapi_descriptor *rfd,
170 struct ethaddr *macaddr,
171 uint32_t logical_net_id);
d62a17ae 172
173extern 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 */