]>
git.proxmox.com Git - mirror_frr.git/blob - bgpd/rfapi/rfapi_import.h
3 * Copyright 2009-2016, LabN Consulting, L.L.C.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 * File: rfapi_import.h
23 * Purpose: Handle import of routes from BGP to RFAPI
26 #ifndef QUAGGA_HGP_RFAPI_IMPORT_H
27 #define QUAGGA_HGP_RFAPI_IMPORT_H
29 #include "lib/thread.h"
32 * These are per-rt-import-list
34 * routes are not segregated by RD - the RD is stored in bgp_info_extra
35 * and is needed to determine if two prefixes are the same.
37 struct rfapi_import_table
{
38 struct rfapi_import_table
*next
;
39 struct rfapi_nve_group_cfg
*rfg
;
40 struct ecommunity
*rt_import_list
; /* copied from nve grp */
41 int refcount
; /* nve grps and nves */
42 uint32_t l2_logical_net_id
; /* L2 only: EVPN Eth Seg Id */
43 struct route_table
*imported_vpn
[AFI_MAX
];
44 struct rfapi_monitor_vpn
*vpn0_queries
[AFI_MAX
];
45 struct rfapi_monitor_eth
*eth0_queries
;
46 struct route_table
*imported_encap
[AFI_MAX
];
47 struct skiplist
*monitor_exterior_orphans
;
48 int local_count
[AFI_MAX
];
49 int remote_count
[AFI_MAX
];
50 int holddown_count
[AFI_MAX
];
51 int imported_count
[AFI_MAX
];
54 #define RFAPI_LOCAL_BI(bi) \
55 (((bi)->type == ZEBRA_ROUTE_BGP) && ((bi)->sub_type == BGP_ROUTE_RFP))
57 #define RFAPI_DIRECT_IMPORT_BI(bi) \
58 (((bi)->type == ZEBRA_ROUTE_BGP_DIRECT) \
59 || ((bi)->type == ZEBRA_ROUTE_BGP_DIRECT_EXT))
61 #define RFAPI_UPDATE_ITABLE_COUNT(bi, itable, afi, cnt) \
62 if (RFAPI_LOCAL_BI(bi)) { \
63 (itable)->local_count[(afi)] += (cnt); \
65 if (RFAPI_DIRECT_IMPORT_BI(bi)) \
66 (itable)->imported_count[(afi)] += (cnt); \
68 (itable)->remote_count[(afi)] += (cnt); \
71 extern uint8_t rfapiRfpCost(struct attr
*attr
);
73 extern void rfapiDebugBacktrace(void);
75 extern void rfapiCheckRouteCount(void);
78 * Print BI in an Import Table
80 extern void rfapiPrintBi(void *stream
, struct bgp_info
*bi
);
82 extern void rfapiShowImportTable(void *stream
, const char *label
,
83 struct route_table
*rt
, int isvpn
);
85 extern struct rfapi_import_table
*
86 rfapiImportTableRefAdd(struct bgp
*bgp
, struct ecommunity
*rt_import_list
,
87 struct rfapi_nve_group_cfg
*rfg
);
89 extern void rfapiImportTableRefDelByIt(struct bgp
*bgp
,
90 struct rfapi_import_table
*it_target
);
94 * Construct an rfapi nexthop list based on the routes attached to
97 * If there are any routes that do NOT have BGP_INFO_REMOVED set,
98 * return those only. If there are ONLY routes with BGP_INFO_REMOVED,
99 * then return those, and also include all the non-removed routes from the
100 * next less-specific node (i.e., this node's parent) at the end.
102 extern struct rfapi_next_hop_entry
*rfapiRouteNode2NextHopList(
103 struct route_node
*rn
, uint32_t lifetime
, /* put into nexthop entries */
104 struct rfapi_ip_addr
*exclude_vnaddr
, /* omit routes to same NVE */
105 struct route_table
*rfd_rib_table
, /* preload this NVE rib table */
106 struct prefix
*pfx_target_original
); /* query target */
108 extern struct rfapi_next_hop_entry
*rfapiRouteTable2NextHopList(
109 struct route_table
*rt
,
110 uint32_t lifetime
, /* put into nexthop entries */
111 struct rfapi_ip_addr
*exclude_vnaddr
, /* omit routes to same NVE */
112 struct route_table
*rfd_rib_table
, /* preload this NVE rib table */
113 struct prefix
*pfx_target_original
); /* query target */
115 extern struct rfapi_next_hop_entry
*rfapiEthRouteTable2NextHopList(
116 uint32_t logical_net_id
, struct rfapi_ip_prefix
*rprefix
,
117 uint32_t lifetime
, /* put into nexthop entries */
118 struct rfapi_ip_addr
*exclude_vnaddr
, /* omit routes to same NVE */
119 struct route_table
*rib_route_table
, /* preload NVE rib node */
120 struct prefix
*pfx_target_original
); /* query target */
122 extern int rfapiEcommunitiesIntersect(struct ecommunity
*e1
,
123 struct ecommunity
*e2
);
125 extern void rfapiCheckRefcount(struct route_node
*rn
, safi_t safi
,
128 extern int rfapiHasNonRemovedRoutes(struct route_node
*rn
);
130 extern int rfapiProcessDeferredClose(struct thread
*t
);
132 extern int rfapiGetUnAddrOfVpnBi(struct bgp_info
*bi
, struct prefix
*p
);
134 extern void rfapiNexthop2Prefix(struct attr
*attr
, struct prefix
*p
);
136 extern void rfapiUnicastNexthop2Prefix(afi_t afi
, struct attr
*attr
,
139 /* Filtered Import Function actions */
140 #define FIF_ACTION_UPDATE 0
141 #define FIF_ACTION_WITHDRAW 1
142 #define FIF_ACTION_KILL 2
144 extern void rfapiBgpInfoFilteredImportVPN(
145 struct rfapi_import_table
*import_table
, int action
, struct peer
*peer
,
146 void *rfd
, /* set for looped back routes */
148 struct prefix
*aux_prefix
, /* AFI_ETHER: optional IP */
149 afi_t afi
, struct prefix_rd
*prd
,
150 struct attr
*attr
, /* part of bgp_info */
151 uint8_t type
, /* part of bgp_info */
152 uint8_t sub_type
, /* part of bgp_info */
153 uint32_t *label
); /* part of bgp_info */
155 extern struct rfapi_next_hop_entry
*rfapiEthRouteNode2NextHopList(
156 struct route_node
*rn
, struct rfapi_ip_prefix
*rprefix
,
157 uint32_t lifetime
, /* put into nexthop entries */
158 struct rfapi_ip_addr
*exclude_vnaddr
, /* omit routes to same NVE */
159 struct route_table
*rib_route_table
, /* preload NVE rib table */
160 struct prefix
*pfx_target_original
); /* query target */
162 extern struct rfapi_import_table
*rfapiMacImportTableGetNoAlloc(struct bgp
*bgp
,
165 extern struct rfapi_import_table
*rfapiMacImportTableGet(struct bgp
*bgp
,
168 extern int rfapiGetL2o(struct attr
*attr
, struct rfapi_l2address_option
*l2o
);
170 extern int rfapiEcommunityGetLNI(struct ecommunity
*ecom
, uint32_t *lni
);
172 extern int rfapiEcommunityGetEthernetTag(struct ecommunity
*ecom
,
175 /* enable for debugging; disable for performance */
177 #define RFAPI_CHECK_REFCOUNT(rn, safi, lo) rfapiCheckRefcount((rn),(safi),(lo))
179 #define RFAPI_CHECK_REFCOUNT(rn, safi, lo) {}
182 /*------------------------------------------
183 * rfapiDeleteRemotePrefixes
185 * UI helper: For use by the "clear vnc prefixes" command
188 * un if set, tunnel must match this prefix
189 * vn if set, nexthop prefix must match this prefix
190 * p if set, prefix must match this prefix
191 * it if set, only look in this import table
194 * pARcount number of active routes deleted
195 * pAHcount number of active nves deleted
196 * pHRcount number of holddown routes deleted
197 * pHHcount number of holddown nves deleted
201 --------------------------------------------*/
202 extern void rfapiDeleteRemotePrefixes(struct prefix
*un
, struct prefix
*vn
,
204 struct rfapi_import_table
*it
,
205 int delete_active
, int delete_holddown
,
206 uint32_t *pARcount
, /* active routes */
207 uint32_t *pAHcount
, /* active nves */
208 uint32_t *pHRcount
, /* holddown routes */
209 uint32_t *pHHcount
); /* holddown nves */
211 /*------------------------------------------
212 * rfapiCountAllItRoutes
214 * UI helper: count VRF routes from BGP side
219 * pARcount count of active routes
220 * pHRcount count of holddown routes
221 * pIRcount count of holddown routes
225 --------------------------------------------*/
226 extern void rfapiCountAllItRoutes(int *pALRcount
, /* active local routes */
227 int *pARRcount
, /* active remote routes */
228 int *pHRcount
, /* holddown routes */
229 int *pIRcount
); /* direct imported routes */
231 /*------------------------------------------
232 * rfapiGetHolddownFromLifetime
234 * calculate holddown value based on lifetime
240 * Holddown value based on lifetime, holddown_factor,
241 * and RFAPI_LIFETIME_INFINITE_WITHDRAW_DELAY
243 --------------------------------------------*/
244 extern uint32_t rfapiGetHolddownFromLifetime(uint32_t lifetime
);
246 #endif /* QUAGGA_HGP_RFAPI_IMPORT_H */