Line data Source code
1 : /* BGP attributes.
2 : * Copyright (C) 1996, 97, 98 Kunihiro Ishiguro
3 : *
4 : * This file is part of GNU Zebra.
5 : *
6 : * GNU Zebra is free software; you can redistribute it and/or modify it
7 : * under the terms of the GNU General Public License as published by the
8 : * Free Software Foundation; either version 2, or (at your option) any
9 : * later version.
10 : *
11 : * GNU Zebra is distributed in the hope that it will be useful, but
12 : * WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : * General Public License for more details.
15 : *
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
19 : */
20 :
21 : #ifndef _QUAGGA_BGP_ATTR_H
22 : #define _QUAGGA_BGP_ATTR_H
23 :
24 : #include "mpls.h"
25 : #include "bgp_attr_evpn.h"
26 : #include "bgpd/bgp_encap_types.h"
27 : #include "srte.h"
28 :
29 : /* Simple bit mapping. */
30 : #define BITMAP_NBBY 8
31 :
32 : #define SET_BITMAP(MAP, NUM) \
33 : SET_FLAG(MAP[(NUM) / BITMAP_NBBY], 1 << ((NUM) % BITMAP_NBBY))
34 :
35 : #define CHECK_BITMAP(MAP, NUM) \
36 : CHECK_FLAG(MAP[(NUM) / BITMAP_NBBY], 1 << ((NUM) % BITMAP_NBBY))
37 :
38 : #define BGP_MED_MAX UINT32_MAX
39 :
40 : /* BGP Attribute type range. */
41 : #define BGP_ATTR_TYPE_RANGE 256
42 : #define BGP_ATTR_BITMAP_SIZE (BGP_ATTR_TYPE_RANGE / BITMAP_NBBY)
43 :
44 : /* BGP Attribute flags. */
45 : #define BGP_ATTR_FLAG_OPTIONAL 0x80 /* Attribute is optional. */
46 : #define BGP_ATTR_FLAG_TRANS 0x40 /* Attribute is transitive. */
47 : #define BGP_ATTR_FLAG_PARTIAL 0x20 /* Attribute is partial. */
48 : #define BGP_ATTR_FLAG_EXTLEN 0x10 /* Extended length flag. */
49 :
50 : /* BGP attribute header must bigger than 2. */
51 : #define BGP_ATTR_MIN_LEN 3 /* Attribute flag, type length. */
52 : #define BGP_ATTR_DEFAULT_WEIGHT 32768
53 :
54 : /* Valid lengths for mp_nexthop_len */
55 : #define BGP_ATTR_NHLEN_IPV4 IPV4_MAX_BYTELEN
56 : #define BGP_ATTR_NHLEN_VPNV4 8+IPV4_MAX_BYTELEN
57 : #define BGP_ATTR_NHLEN_IPV6_GLOBAL IPV6_MAX_BYTELEN
58 : #define BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL (IPV6_MAX_BYTELEN * 2)
59 : #define BGP_ATTR_NHLEN_VPNV6_GLOBAL 8+IPV6_MAX_BYTELEN
60 : #define BGP_ATTR_NHLEN_VPNV6_GLOBAL_AND_LL ((8+IPV6_MAX_BYTELEN) * 2)
61 :
62 : /* Prefix SID types */
63 : #define BGP_PREFIX_SID_LABEL_INDEX 1
64 : #define BGP_PREFIX_SID_IPV6 2
65 : #define BGP_PREFIX_SID_ORIGINATOR_SRGB 3
66 : #define BGP_PREFIX_SID_VPN_SID 4
67 : #define BGP_PREFIX_SID_SRV6_L3_SERVICE 5
68 : #define BGP_PREFIX_SID_SRV6_L2_SERVICE 6
69 :
70 : #define BGP_PREFIX_SID_LABEL_INDEX_LENGTH 7
71 : #define BGP_PREFIX_SID_IPV6_LENGTH 19
72 : #define BGP_PREFIX_SID_ORIGINATOR_SRGB_LENGTH 6
73 : #define BGP_PREFIX_SID_VPN_SID_LENGTH 19
74 :
75 : /* SRv6 Service Sub-TLV types */
76 : #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO 1
77 : #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH 21
78 :
79 : /* SRv6 Service Data Sub-Sub-TLV types */
80 : #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE 1
81 : #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE_LENGTH 6
82 :
83 : #define BGP_ATTR_NH_AFI(afi, attr) \
84 : ((afi != AFI_L2VPN) ? afi : \
85 : ((attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4) ? AFI_IP : AFI_IP6))
86 :
87 : /* PMSI tunnel types (RFC 6514) */
88 :
89 : struct bgp_attr_encap_subtlv {
90 : struct bgp_attr_encap_subtlv *next; /* for chaining */
91 : /* Reference count of this attribute. */
92 : unsigned long refcnt;
93 : uint16_t type;
94 : uint16_t length;
95 : uint8_t value[0]; /* will be extended */
96 : };
97 :
98 : #ifdef ENABLE_BGP_VNC
99 : /*
100 : * old rfp<->rfapi representation
101 : */
102 : struct bgp_tea_options {
103 : struct bgp_tea_options *next;
104 : uint8_t options_count;
105 : uint16_t options_length; /* each TLV may be 256 in length */
106 : uint8_t type;
107 : uint8_t length;
108 : void *value; /* pointer to data */
109 : };
110 :
111 : #endif
112 :
113 : enum pta_type {
114 : PMSI_TNLTYPE_NO_INFO = 0,
115 : PMSI_TNLTYPE_RSVP_TE_P2MP,
116 : PMSI_TNLTYPE_MLDP_P2MP,
117 : PMSI_TNLTYPE_PIM_SSM,
118 : PMSI_TNLTYPE_PIM_SM,
119 : PMSI_TNLTYPE_PIM_BIDIR,
120 : PMSI_TNLTYPE_INGR_REPL,
121 : PMSI_TNLTYPE_MLDP_MP2MP,
122 : PMSI_TNLTYPE_MAX = PMSI_TNLTYPE_MLDP_MP2MP
123 : };
124 :
125 : /*
126 : * Prefix-SID type-4
127 : * SRv6-VPN-SID-TLV
128 : * draft-dawra-idr-srv6-vpn-04
129 : */
130 : struct bgp_attr_srv6_vpn {
131 : unsigned long refcnt;
132 : uint8_t sid_flags;
133 : struct in6_addr sid;
134 : };
135 :
136 : /*
137 : * Prefix-SID type-5
138 : * SRv6-L3VPN-Service-TLV
139 : * draft-dawra-idr-srv6-vpn-05
140 : */
141 : struct bgp_attr_srv6_l3vpn {
142 : unsigned long refcnt;
143 : uint8_t sid_flags;
144 : uint16_t endpoint_behavior;
145 : struct in6_addr sid;
146 : uint8_t loc_block_len;
147 : uint8_t loc_node_len;
148 : uint8_t func_len;
149 : uint8_t arg_len;
150 : uint8_t transposition_len;
151 : uint8_t transposition_offset;
152 : };
153 :
154 : /* BGP core attribute structure. */
155 : struct attr {
156 : /* AS Path structure */
157 : struct aspath *aspath;
158 :
159 : /* Community structure */
160 : struct community *community;
161 :
162 : /* Reference count of this attribute. */
163 : unsigned long refcnt;
164 :
165 : /* Flag of attribute is set or not. */
166 : uint64_t flag;
167 :
168 : /* Apart from in6_addr, the remaining static attributes */
169 : struct in_addr nexthop;
170 : uint32_t med;
171 : uint32_t local_pref;
172 : ifindex_t nh_ifindex;
173 :
174 : /* Path origin attribute */
175 : uint8_t origin;
176 :
177 : /* PMSI tunnel type (RFC 6514). */
178 : enum pta_type pmsi_tnl_type;
179 :
180 : /* has the route-map changed any attribute?
181 : Used on the peer outbound side. */
182 : uint32_t rmap_change_flags;
183 :
184 : /* Multi-Protocol Nexthop, AFI IPv6 */
185 : struct in6_addr mp_nexthop_global;
186 : struct in6_addr mp_nexthop_local;
187 :
188 : /* ifIndex corresponding to mp_nexthop_local. */
189 : ifindex_t nh_lla_ifindex;
190 :
191 : /* Extended Communities attribute. */
192 : struct ecommunity *ecommunity;
193 :
194 : /* Extended Communities attribute. */
195 : struct ecommunity *ipv6_ecommunity;
196 :
197 : /* Large Communities attribute. */
198 : struct lcommunity *lcommunity;
199 :
200 : /* Route-Reflector Cluster attribute */
201 : struct cluster_list *cluster1;
202 :
203 : /* Unknown transitive attribute. */
204 : struct transit *transit;
205 :
206 : struct in_addr mp_nexthop_global_in;
207 :
208 : /* Aggregator Router ID attribute */
209 : struct in_addr aggregator_addr;
210 :
211 : /* Route Reflector Originator attribute */
212 : struct in_addr originator_id;
213 :
214 : /* Local weight, not actually an attribute */
215 : uint32_t weight;
216 :
217 : /* Aggregator ASN */
218 : as_t aggregator_as;
219 :
220 : /* MP Nexthop length */
221 : uint8_t mp_nexthop_len;
222 :
223 : /* MP Nexthop preference */
224 : uint8_t mp_nexthop_prefer_global;
225 :
226 : /* Static MAC for EVPN */
227 : uint8_t sticky;
228 :
229 : /* Flag for default gateway extended community in EVPN */
230 : uint8_t default_gw;
231 :
232 : /* NA router flag (R-bit) support in EVPN */
233 : uint8_t router_flag;
234 :
235 : /* ES info */
236 : uint8_t es_flags;
237 : /* Path is not "locally-active" on the advertising VTEP. This is
238 : * translated into an ARP-ND ECOM.
239 : */
240 : #define ATTR_ES_PROXY_ADVERT (1 << 0)
241 : /* Destination ES is present locally. This flag is set on local
242 : * paths and sync paths
243 : */
244 : #define ATTR_ES_IS_LOCAL (1 << 1)
245 : /* There are one or more non-best paths from ES peers. Note that
246 : * this flag is only set on the local MAC-IP paths in the VNI
247 : * route table (not set in the global routing table). And only
248 : * non-proxy advertisements from an ES peer can result in this
249 : * flag being set.
250 : */
251 : #define ATTR_ES_PEER_ACTIVE (1 << 2)
252 : /* There are one or more non-best proxy paths from ES peers */
253 : #define ATTR_ES_PEER_PROXY (1 << 3)
254 : /* An ES peer has router bit set - only applicable if
255 : * ATTR_ES_PEER_ACTIVE is set
256 : */
257 : #define ATTR_ES_PEER_ROUTER (1 << 4)
258 :
259 : /* These two flags are only set on L3 routes installed in a
260 : * VRF as a result of EVPN MAC-IP route
261 : * XXX - while splitting up per-family attrs these need to be
262 : * classified as non-EVPN
263 : */
264 : #define ATTR_ES_L3_NHG_USE (1 << 5)
265 : #define ATTR_ES_L3_NHG_ACTIVE (1 << 6)
266 : #define ATTR_ES_L3_NHG (ATTR_ES_L3_NHG_USE | ATTR_ES_L3_NHG_ACTIVE)
267 :
268 : /* route tag */
269 : route_tag_t tag;
270 :
271 : /* Label index */
272 : uint32_t label_index;
273 :
274 : /* MPLS label */
275 : mpls_label_t label;
276 :
277 : /* SRv6 VPN SID */
278 : struct bgp_attr_srv6_vpn *srv6_vpn;
279 :
280 : /* SRv6 L3VPN SID */
281 : struct bgp_attr_srv6_l3vpn *srv6_l3vpn;
282 :
283 : uint16_t encap_tunneltype; /* grr */
284 : struct bgp_attr_encap_subtlv *encap_subtlvs; /* rfc5512 */
285 :
286 : #ifdef ENABLE_BGP_VNC
287 : struct bgp_attr_encap_subtlv *vnc_subtlvs; /* VNC-specific */
288 : #endif
289 : /* EVPN */
290 : struct bgp_route_evpn evpn_overlay;
291 :
292 : /* EVPN MAC Mobility sequence number, if any. */
293 : uint32_t mm_seqnum;
294 : /* highest MM sequence number rxed in a MAC-IP route from an
295 : * ES peer (this includes both proxy and non-proxy MAC-IP
296 : * advertisements from ES peers).
297 : * This is only applicable to local paths in the VNI routing
298 : * table and derived from other imported/non-best paths.
299 : */
300 : uint32_t mm_sync_seqnum;
301 :
302 : /* EVPN local router-mac */
303 : struct ethaddr rmac;
304 :
305 : /* Distance as applied by Route map */
306 : uint8_t distance;
307 :
308 : /* rmap set table */
309 : uint32_t rmap_table_id;
310 :
311 : /* Link bandwidth value, if any. */
312 : uint32_t link_bw;
313 :
314 : /* EVPN ES */
315 : esi_t esi;
316 :
317 : /* SR-TE Color */
318 : uint32_t srte_color;
319 :
320 : /* EVPN DF preference and algorithm for DF election on local ESs */
321 : uint16_t df_pref;
322 : uint8_t df_alg;
323 :
324 : /* Nexthop type */
325 : enum nexthop_types_t nh_type;
326 :
327 : /* If NEXTHOP_TYPE_BLACKHOLE, then blackhole type */
328 : enum blackhole_type bh_type;
329 :
330 : /* OTC value if set */
331 : uint32_t otc;
332 :
333 : /* AIGP Metric */
334 : uint64_t aigp_metric;
335 : };
336 :
337 : /* rmap_change_flags definition */
338 : #define BATTR_RMAP_IPV4_NHOP_CHANGED (1 << 0)
339 : #define BATTR_RMAP_NEXTHOP_PEER_ADDRESS (1 << 1)
340 : #define BATTR_REFLECTED (1 << 2)
341 : #define BATTR_RMAP_NEXTHOP_UNCHANGED (1 << 3)
342 : #define BATTR_RMAP_IPV6_GLOBAL_NHOP_CHANGED (1 << 4)
343 : #define BATTR_RMAP_IPV6_LL_NHOP_CHANGED (1 << 5)
344 : #define BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED (1 << 6)
345 : #define BATTR_RMAP_LINK_BW_SET (1 << 7)
346 : #define BATTR_RMAP_L3VPN_ACCEPT_GRE (1 << 8)
347 : #define BATTR_RMAP_VPNV4_NHOP_CHANGED (1 << 9)
348 : #define BATTR_RMAP_VPNV6_GLOBAL_NHOP_CHANGED (1 << 10)
349 :
350 : /* Router Reflector related structure. */
351 : struct cluster_list {
352 : unsigned long refcnt;
353 : int length;
354 : struct in_addr *list;
355 : };
356 :
357 : /* Unknown transit attribute. */
358 : struct transit {
359 : unsigned long refcnt;
360 : int length;
361 : uint8_t *val;
362 : };
363 :
364 : /* "(void) 0" will generate a compiler error. this is a safety check to
365 : * ensure we're not using a value that exceeds the bit size of attr->flag. */
366 : #define ATTR_FLAG_BIT(X) \
367 : __builtin_choose_expr((X) >= 1 && (X) <= 64, 1ULL << ((X)-1), (void)0)
368 :
369 : #define BGP_CLUSTER_LIST_LENGTH(attr) \
370 : (((attr)->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST)) \
371 : ? bgp_attr_get_cluster((attr))->length \
372 : : 0)
373 :
374 : enum bgp_attr_parse_ret {
375 : BGP_ATTR_PARSE_PROCEED = 0,
376 : BGP_ATTR_PARSE_ERROR = -1,
377 : BGP_ATTR_PARSE_WITHDRAW = -2,
378 :
379 : /* only used internally, send notify + convert to BGP_ATTR_PARSE_ERROR
380 : */
381 : BGP_ATTR_PARSE_ERROR_NOTIFYPLS = -3,
382 : BGP_ATTR_PARSE_EOR = -4,
383 : };
384 :
385 : struct bpacket_attr_vec_arr;
386 :
387 : /* Prototypes. */
388 : extern void bgp_attr_init(void);
389 : extern void bgp_attr_finish(void);
390 : extern enum bgp_attr_parse_ret
391 : bgp_attr_parse(struct peer *peer, struct attr *attr, bgp_size_t size,
392 : struct bgp_nlri *mp_update, struct bgp_nlri *mp_withdraw);
393 : extern struct attr *bgp_attr_intern(struct attr *attr);
394 : extern void bgp_attr_unintern_sub(struct attr *attr);
395 : extern void bgp_attr_unintern(struct attr **pattr);
396 : extern void bgp_attr_flush(struct attr *attr);
397 : extern struct attr *bgp_attr_default_set(struct attr *attr, struct bgp *bgp,
398 : uint8_t origin);
399 : extern struct attr *bgp_attr_aggregate_intern(
400 : struct bgp *bgp, uint8_t origin, struct aspath *aspath,
401 : struct community *community, struct ecommunity *ecommunity,
402 : struct lcommunity *lcommunity, struct bgp_aggregate *aggregate,
403 : uint8_t atomic_aggregate, const struct prefix *p);
404 : extern bgp_size_t bgp_packet_attribute(
405 : struct bgp *bgp, struct peer *peer, struct stream *s, struct attr *attr,
406 : struct bpacket_attr_vec_arr *vecarr, struct prefix *p, afi_t afi,
407 : safi_t safi, struct peer *from, struct prefix_rd *prd,
408 : mpls_label_t *label, uint32_t num_labels, bool addpath_capable,
409 : uint32_t addpath_tx_id, struct bgp_path_info *bpi);
410 : extern void bgp_dump_routes_attr(struct stream *s, struct bgp_path_info *bpi,
411 : const struct prefix *p);
412 : extern bool attrhash_cmp(const void *arg1, const void *arg2);
413 : extern unsigned int attrhash_key_make(const void *p);
414 : extern void attr_show_all(struct vty *vty);
415 : extern unsigned long int attr_count(void);
416 : extern unsigned long int attr_unknown_count(void);
417 : extern void bgp_path_attribute_discard_vty(struct vty *vty, struct peer *peer,
418 : const char *discard_attrs, bool set);
419 :
420 : /* Cluster list prototypes. */
421 : extern bool cluster_loop_check(struct cluster_list *cluster,
422 : struct in_addr originator);
423 :
424 : /* Below exported for unit-test purposes only */
425 : struct bgp_attr_parser_args {
426 : struct peer *peer;
427 : bgp_size_t length; /* attribute data length; */
428 : bgp_size_t total; /* total length, inc header */
429 : struct attr *attr;
430 : uint8_t type;
431 : uint8_t flags;
432 : uint8_t *startp;
433 : };
434 : extern int bgp_mp_reach_parse(struct bgp_attr_parser_args *args,
435 : struct bgp_nlri *mp_update);
436 : extern int bgp_mp_unreach_parse(struct bgp_attr_parser_args *args,
437 : struct bgp_nlri *mp_withdraw);
438 : extern enum bgp_attr_parse_ret
439 : bgp_attr_prefix_sid(struct bgp_attr_parser_args *args);
440 :
441 : extern struct bgp_attr_encap_subtlv *
442 : encap_tlv_dup(struct bgp_attr_encap_subtlv *orig);
443 :
444 : extern void bgp_attr_flush_encap(struct attr *attr);
445 :
446 : extern void bgp_attr_extcom_tunnel_type(struct attr *attr,
447 : bgp_encap_types *tunnel_type);
448 :
449 : /**
450 : * Set of functions to encode MP_REACH_NLRI and MP_UNREACH_NLRI attributes.
451 : * Typical call sequence is to call _start(), followed by multiple _prefix(),
452 : * one for each NLRI that needs to be encoded into the UPDATE message, and
453 : * finally the _end() function.
454 : */
455 : extern size_t bgp_packet_mpattr_start(struct stream *s, struct peer *peer,
456 : afi_t afi, safi_t safi,
457 : struct bpacket_attr_vec_arr *vecarr,
458 : struct attr *attr);
459 : extern void bgp_packet_mpattr_prefix(struct stream *s, afi_t afi, safi_t safi,
460 : const struct prefix *p,
461 : const struct prefix_rd *prd,
462 : mpls_label_t *label, uint32_t num_labels,
463 : bool addpath_capable,
464 : uint32_t addpath_tx_id, struct attr *);
465 : extern size_t bgp_packet_mpattr_prefix_size(afi_t afi, safi_t safi,
466 : const struct prefix *p);
467 : extern void bgp_packet_mpattr_end(struct stream *s, size_t sizep);
468 :
469 : extern size_t bgp_packet_mpunreach_start(struct stream *s, afi_t afi,
470 : safi_t safi);
471 : extern void bgp_packet_mpunreach_prefix(
472 : struct stream *s, const struct prefix *p, afi_t afi, safi_t safi,
473 : const struct prefix_rd *prd, mpls_label_t *label, uint32_t num_labels,
474 : bool addpath_capable, uint32_t addpath_tx_id, struct attr *attr);
475 : extern void bgp_packet_mpunreach_end(struct stream *s, size_t attrlen_pnt);
476 :
477 : extern enum bgp_attr_parse_ret bgp_attr_nexthop_valid(struct peer *peer,
478 : struct attr *attr);
479 :
480 88 : static inline bool bgp_rmap_nhop_changed(uint32_t out_rmap_flags,
481 : uint32_t in_rmap_flags)
482 : {
483 88 : return ((CHECK_FLAG(out_rmap_flags, BATTR_RMAP_NEXTHOP_PEER_ADDRESS) ||
484 : CHECK_FLAG(out_rmap_flags, BATTR_RMAP_NEXTHOP_UNCHANGED) ||
485 : CHECK_FLAG(out_rmap_flags, BATTR_RMAP_IPV4_NHOP_CHANGED) ||
486 : CHECK_FLAG(out_rmap_flags, BATTR_RMAP_VPNV4_NHOP_CHANGED) ||
487 : CHECK_FLAG(out_rmap_flags,
488 : BATTR_RMAP_VPNV6_GLOBAL_NHOP_CHANGED) ||
489 : CHECK_FLAG(out_rmap_flags,
490 : BATTR_RMAP_IPV6_GLOBAL_NHOP_CHANGED) ||
491 : CHECK_FLAG(out_rmap_flags,
492 88 : BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED) ||
493 : CHECK_FLAG(out_rmap_flags, BATTR_RMAP_IPV6_LL_NHOP_CHANGED) ||
494 83 : CHECK_FLAG(in_rmap_flags, BATTR_RMAP_NEXTHOP_UNCHANGED))
495 : ? true
496 88 : : false);
497 : }
498 :
499 0 : static inline uint32_t mac_mobility_seqnum(struct attr *attr)
500 : {
501 0 : return (attr) ? attr->mm_seqnum : 0;
502 : }
503 :
504 0 : static inline enum pta_type bgp_attr_get_pmsi_tnl_type(struct attr *attr)
505 : {
506 0 : return attr->pmsi_tnl_type;
507 : }
508 :
509 0 : static inline void bgp_attr_set_pmsi_tnl_type(struct attr *attr,
510 : enum pta_type pmsi_tnl_type)
511 : {
512 0 : attr->pmsi_tnl_type = pmsi_tnl_type;
513 0 : }
514 :
515 : static inline struct ecommunity *
516 1811 : bgp_attr_get_ecommunity(const struct attr *attr)
517 : {
518 1811 : return attr->ecommunity;
519 : }
520 :
521 477 : static inline void bgp_attr_set_ecommunity(struct attr *attr,
522 : struct ecommunity *ecomm)
523 : {
524 477 : attr->ecommunity = ecomm;
525 :
526 14 : if (ecomm)
527 14 : SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES));
528 : else
529 463 : UNSET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES));
530 0 : }
531 :
532 : static inline struct lcommunity *
533 1750 : bgp_attr_get_lcommunity(const struct attr *attr)
534 : {
535 1750 : return attr->lcommunity;
536 : }
537 :
538 461 : static inline void bgp_attr_set_lcommunity(struct attr *attr,
539 : struct lcommunity *lcomm)
540 : {
541 461 : attr->lcommunity = lcomm;
542 :
543 0 : if (lcomm)
544 0 : SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES));
545 : else
546 461 : UNSET_FLAG(attr->flag,
547 : ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES));
548 0 : }
549 :
550 2222 : static inline struct community *bgp_attr_get_community(const struct attr *attr)
551 : {
552 2163 : return attr->community;
553 : }
554 :
555 514 : static inline void bgp_attr_set_community(struct attr *attr,
556 : struct community *comm)
557 : {
558 514 : attr->community = comm;
559 :
560 51 : if (comm)
561 51 : SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES));
562 : else
563 461 : UNSET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES));
564 2 : }
565 :
566 : static inline struct ecommunity *
567 1750 : bgp_attr_get_ipv6_ecommunity(const struct attr *attr)
568 : {
569 1750 : return attr->ipv6_ecommunity;
570 : }
571 :
572 461 : static inline void bgp_attr_set_ipv6_ecommunity(struct attr *attr,
573 : struct ecommunity *ipv6_ecomm)
574 : {
575 461 : attr->ipv6_ecommunity = ipv6_ecomm;
576 :
577 0 : if (ipv6_ecomm)
578 0 : SET_FLAG(attr->flag,
579 : ATTR_FLAG_BIT(BGP_ATTR_IPV6_EXT_COMMUNITIES));
580 : else
581 461 : UNSET_FLAG(attr->flag,
582 : ATTR_FLAG_BIT(BGP_ATTR_IPV6_EXT_COMMUNITIES));
583 : }
584 :
585 1976 : static inline struct transit *bgp_attr_get_transit(const struct attr *attr)
586 : {
587 1976 : return attr->transit;
588 : }
589 :
590 0 : static inline void bgp_attr_set_transit(struct attr *attr,
591 : struct transit *transit)
592 : {
593 0 : attr->transit = transit;
594 0 : }
595 :
596 1004 : static inline uint64_t bgp_attr_get_aigp_metric(const struct attr *attr)
597 : {
598 1004 : return attr->aigp_metric;
599 : }
600 :
601 0 : static inline void bgp_attr_set_aigp_metric(struct attr *attr, uint64_t aigp)
602 : {
603 0 : attr->aigp_metric = aigp;
604 :
605 0 : if (aigp)
606 0 : attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_AIGP);
607 0 : }
608 :
609 1806 : static inline struct cluster_list *bgp_attr_get_cluster(const struct attr *attr)
610 : {
611 1806 : return attr->cluster1;
612 : }
613 :
614 0 : static inline void bgp_attr_set_cluster(struct attr *attr,
615 : struct cluster_list *cl)
616 : {
617 0 : attr->cluster1 = cl;
618 0 : }
619 :
620 : static inline const struct bgp_route_evpn *
621 378 : bgp_attr_get_evpn_overlay(const struct attr *attr)
622 : {
623 378 : return &attr->evpn_overlay;
624 : }
625 :
626 : static inline void bgp_attr_set_evpn_overlay(struct attr *attr,
627 : struct bgp_route_evpn *eo)
628 : {
629 : memcpy(&attr->evpn_overlay, eo, sizeof(struct bgp_route_evpn));
630 : }
631 :
632 : static inline struct bgp_attr_encap_subtlv *
633 2001 : bgp_attr_get_vnc_subtlvs(const struct attr *attr)
634 : {
635 : #ifdef ENABLE_BGP_VNC
636 2001 : return attr->vnc_subtlvs;
637 : #else
638 : return NULL;
639 : #endif
640 : }
641 :
642 : static inline void
643 0 : bgp_attr_set_vnc_subtlvs(struct attr *attr,
644 : struct bgp_attr_encap_subtlv *vnc_subtlvs)
645 : {
646 : #ifdef ENABLE_BGP_VNC
647 0 : attr->vnc_subtlvs = vnc_subtlvs;
648 : #endif
649 0 : }
650 :
651 : #endif /* _QUAGGA_BGP_ATTR_H */
|