back to topotato report
topotato coverage report
Current view: top level - bgpd - bgp_attr.h (source / functions) Hit Total Coverage
Test: test_bgp_set_aspath_replace.py::BGPSetAspathReplace Lines: 35 67 52.2 %
Date: 2023-02-24 18:37:49 Functions: 0 0 -

          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          16 : static inline bool bgp_rmap_nhop_changed(uint32_t out_rmap_flags,
     481             :                                          uint32_t in_rmap_flags)
     482             : {
     483          16 :         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          16 :                             BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED) ||
     493             :                  CHECK_FLAG(out_rmap_flags, BATTR_RMAP_IPV6_LL_NHOP_CHANGED) ||
     494          16 :                  CHECK_FLAG(in_rmap_flags, BATTR_RMAP_NEXTHOP_UNCHANGED))
     495             :                         ? true
     496          16 :                         : 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         295 : bgp_attr_get_ecommunity(const struct attr *attr)
     517             : {
     518         295 :         return attr->ecommunity;
     519             : }
     520             : 
     521          69 : static inline void bgp_attr_set_ecommunity(struct attr *attr,
     522             :                                            struct ecommunity *ecomm)
     523             : {
     524          69 :         attr->ecommunity = ecomm;
     525             : 
     526           0 :         if (ecomm)
     527           0 :                 SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES));
     528             :         else
     529          69 :                 UNSET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES));
     530           0 : }
     531             : 
     532             : static inline struct lcommunity *
     533         295 : bgp_attr_get_lcommunity(const struct attr *attr)
     534             : {
     535         295 :         return attr->lcommunity;
     536             : }
     537             : 
     538          69 : static inline void bgp_attr_set_lcommunity(struct attr *attr,
     539             :                                            struct lcommunity *lcomm)
     540             : {
     541          69 :         attr->lcommunity = lcomm;
     542             : 
     543           0 :         if (lcomm)
     544           0 :                 SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES));
     545             :         else
     546          69 :                 UNSET_FLAG(attr->flag,
     547             :                            ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES));
     548           0 : }
     549             : 
     550         353 : static inline struct community *bgp_attr_get_community(const struct attr *attr)
     551             : {
     552         342 :         return attr->community;
     553             : }
     554             : 
     555          69 : static inline void bgp_attr_set_community(struct attr *attr,
     556             :                                           struct community *comm)
     557             : {
     558          69 :         attr->community = comm;
     559             : 
     560           0 :         if (comm)
     561           0 :                 SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES));
     562             :         else
     563          69 :                 UNSET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES));
     564           0 : }
     565             : 
     566             : static inline struct ecommunity *
     567         295 : bgp_attr_get_ipv6_ecommunity(const struct attr *attr)
     568             : {
     569         295 :         return attr->ipv6_ecommunity;
     570             : }
     571             : 
     572          69 : static inline void bgp_attr_set_ipv6_ecommunity(struct attr *attr,
     573             :                                                 struct ecommunity *ipv6_ecomm)
     574             : {
     575          69 :         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          69 :                 UNSET_FLAG(attr->flag,
     582             :                            ATTR_FLAG_BIT(BGP_ATTR_IPV6_EXT_COMMUNITIES));
     583             : }
     584             : 
     585         318 : static inline struct transit *bgp_attr_get_transit(const struct attr *attr)
     586             : {
     587         318 :         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         173 : static inline uint64_t bgp_attr_get_aigp_metric(const struct attr *attr)
     597             : {
     598         173 :         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         310 : static inline struct cluster_list *bgp_attr_get_cluster(const struct attr *attr)
     610             : {
     611         310 :         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          69 : bgp_attr_get_evpn_overlay(const struct attr *attr)
     622             : {
     623          69 :         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         323 : bgp_attr_get_vnc_subtlvs(const struct attr *attr)
     634             : {
     635             : #ifdef ENABLE_BGP_VNC
     636         323 :         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 */

Generated by: LCOV version v1.16-topotato