1/* BGP attributes. 2 Copyright (C) 1996, 97, 98 Kunihiro Ishiguro 3 4This file is part of GNU Zebra. 5 6GNU Zebra is free software; you can redistribute it and/or modify it 7under the terms of the GNU General Public License as published by the 8Free Software Foundation; either version 2, or (at your option) any 9later version. 10 11GNU Zebra is distributed in the hope that it will be useful, but 12WITHOUT ANY WARRANTY; without even the implied warranty of 13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14General Public License for more details. 15 16You should have received a copy of the GNU General Public License 17along with GNU Zebra; see the file COPYING. If not, write to the Free 18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 1902111-1307, USA. */ 20 21#ifndef _QUAGGA_BGP_ATTR_H 22#define _QUAGGA_BGP_ATTR_H 23 24/* Simple bit mapping. */ 25#define BITMAP_NBBY 8 26 27#define SET_BITMAP(MAP, NUM) \ 28 SET_FLAG (MAP[(NUM) / BITMAP_NBBY], 1 << ((NUM) % BITMAP_NBBY)) 29 30#define CHECK_BITMAP(MAP, NUM) \ 31 CHECK_FLAG (MAP[(NUM) / BITMAP_NBBY], 1 << ((NUM) % BITMAP_NBBY)) 32 33#define BGP_MED_MAX UINT32_MAX 34 35 36/* BGP Attribute type range. */ 37#define BGP_ATTR_TYPE_RANGE 256 38#define BGP_ATTR_BITMAP_SIZE (BGP_ATTR_TYPE_RANGE / BITMAP_NBBY) 39 40/* BGP Attribute flags. */ 41#define BGP_ATTR_FLAG_OPTIONAL 0x80 /* Attribute is optional. */ 42#define BGP_ATTR_FLAG_TRANS 0x40 /* Attribute is transitive. */ 43#define BGP_ATTR_FLAG_PARTIAL 0x20 /* Attribute is partial. */ 44#define BGP_ATTR_FLAG_EXTLEN 0x10 /* Extended length flag. */ 45 46/* BGP attribute header must bigger than 2. */ 47#define BGP_ATTR_MIN_LEN 3 /* Attribute flag, type length. */ 48#define BGP_ATTR_DEFAULT_WEIGHT 32768 49 50/* Additional/uncommon BGP attributes. 51 * lazily allocated as and when a struct attr 52 * requires it. 53 */ 54struct attr_extra 55{ 56 /* Multi-Protocol Nexthop, AFI IPv6 */ 57#ifdef HAVE_IPV6 58 struct in6_addr mp_nexthop_global; 59 struct in6_addr mp_nexthop_local; 60#endif /* HAVE_IPV6 */ 61 62 /* Extended Communities attribute. */ 63 struct ecommunity *ecommunity; 64 65 /* Route-Reflector Cluster attribute */ 66 struct cluster_list *cluster; 67 68 /* Unknown transitive attribute. */ 69 struct transit *transit; 70 71 struct in_addr mp_nexthop_global_in; 72 struct in_addr mp_nexthop_local_in; 73 74 /* Aggregator Router ID attribute */ 75 struct in_addr aggregator_addr; 76 77 /* Route Reflector Originator attribute */ 78 struct in_addr originator_id; 79 80 /* Local weight, not actually an attribute */ 81 u_int32_t weight; 82 83 /* Aggregator ASN */ 84 as_t aggregator_as; 85 86 /* MP Nexthop length */ 87 u_char mp_nexthop_len; 88}; 89 90/* BGP core attribute structure. */ 91struct attr 92{ 93 /* AS Path structure */ 94 struct aspath *aspath; 95 96 /* Community structure */ 97 struct community *community; 98 99 /* Lazily allocated pointer to extra attributes */ 100 struct attr_extra *extra; 101 102 /* Reference count of this attribute. */ 103 unsigned long refcnt; 104 105 /* Flag of attribute is set or not. */ 106 u_int32_t flag; 107 108 /* Apart from in6_addr, the remaining static attributes */ 109 struct in_addr nexthop; 110 u_int32_t med; 111 u_int32_t local_pref; 112 113 /* Path origin attribute */ 114 u_char origin; 115}; 116 117/* Router Reflector related structure. */ 118struct cluster_list 119{ 120 unsigned long refcnt; 121 int length; 122 struct in_addr *list; 123}; 124 125/* Unknown transit attribute. */ 126struct transit 127{ 128 unsigned long refcnt; 129 int length; 130 u_char *val; 131}; 132 133#define ATTR_FLAG_BIT(X) (1 << ((X) - 1)) 134 135typedef enum { 136 BGP_ATTR_PARSE_PROCEED = 0, 137 BGP_ATTR_PARSE_ERROR = -1, 138 BGP_ATTR_PARSE_WITHDRAW = -2, 139 140 /* only used internally, send notify + convert to BGP_ATTR_PARSE_ERROR */ 141 BGP_ATTR_PARSE_ERROR_NOTIFYPLS = -3, 142} bgp_attr_parse_ret_t; 143 144/* Prototypes. */ 145extern void bgp_attr_init (void); 146extern void bgp_attr_finish (void); 147extern bgp_attr_parse_ret_t bgp_attr_parse (struct peer *, struct attr *, 148 bgp_size_t, struct bgp_nlri *, 149 struct bgp_nlri *); 150extern struct attr_extra *bgp_attr_extra_get (struct attr *); 151extern void bgp_attr_extra_free (struct attr *); 152extern void bgp_attr_dup (struct attr *, struct attr *); 153extern struct attr *bgp_attr_intern (struct attr *attr); 154extern void bgp_attr_unintern_sub (struct attr *); 155extern void bgp_attr_unintern (struct attr **); 156extern void bgp_attr_flush (struct attr *); 157extern struct attr *bgp_attr_default_set (struct attr *attr, u_char); 158extern struct attr *bgp_attr_default_intern (u_char); 159extern struct attr *bgp_attr_aggregate_intern (struct bgp *, u_char, 160 struct aspath *, 161 struct community *, int as_set); 162extern bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *, 163 struct stream *, struct attr *, 164 struct prefix *, afi_t, safi_t, 165 struct peer *, struct prefix_rd *, 166 u_char *); 167extern void bgp_dump_routes_attr (struct stream *, struct attr *, 168 struct prefix *); 169extern int attrhash_cmp (const void *, const void *); 170extern unsigned int attrhash_key_make (void *); 171extern void attr_show_all (struct vty *); 172extern unsigned long int attr_count (void); 173extern unsigned long int attr_unknown_count (void); 174 175/* Cluster list prototypes. */ 176extern int cluster_loop_check (struct cluster_list *, struct in_addr); 177extern void cluster_unintern (struct cluster_list *); 178 179/* Transit attribute prototypes. */ 180void transit_unintern (struct transit *); 181 182/* Below exported for unit-test purposes only */ 183struct bgp_attr_parser_args { 184 struct peer *peer; 185 bgp_size_t length; /* attribute data length; */ 186 bgp_size_t total; /* total length, inc header */ 187 struct attr *attr; 188 u_int8_t type; 189 u_int8_t flags; 190 u_char *startp; 191}; 192extern int bgp_mp_reach_parse (struct bgp_attr_parser_args *args, 193 struct bgp_nlri *); 194extern int bgp_mp_unreach_parse (struct bgp_attr_parser_args *args, 195 struct bgp_nlri *); 196 197/** 198 * Set of functions to encode MP_REACH_NLRI and MP_UNREACH_NLRI attributes. 199 * Typical call sequence is to call _start(), followed by multiple _prefix(), 200 * one for each NLRI that needs to be encoded into the UPDATE message, and 201 * finally the _end() function. 202 */ 203extern size_t bgp_packet_mpattr_start(struct stream *s, afi_t afi, safi_t safi, 204 struct attr *attr); 205extern void bgp_packet_mpattr_prefix(struct stream *s, afi_t afi, safi_t safi, 206 struct prefix *p, struct prefix_rd *prd, 207 u_char *tag); 208extern void bgp_packet_mpattr_end(struct stream *s, size_t sizep); 209 210extern size_t bgp_packet_mpunreach_start (struct stream *s, afi_t afi, 211 safi_t safi); 212extern void bgp_packet_mpunreach_prefix (struct stream *s, struct prefix *p, 213 afi_t afi, safi_t safi, struct prefix_rd *prd, 214 u_char *tag); 215extern void bgp_packet_mpunreach_end (struct stream *s, size_t attrlen_pnt); 216 217#endif /* _QUAGGA_BGP_ATTR_H */ 218