]>
Commit | Line | Data |
---|---|---|
718e3744 | 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 | |
17 | along with GNU Zebra; see the file COPYING. If not, write to the Free | |
18 | Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
19 | 02111-1307, USA. */ | |
20 | ||
00d252cb | 21 | #ifndef _QUAGGA_BGP_ATTR_H |
22 | #define _QUAGGA_BGP_ATTR_H | |
23 | ||
718e3744 | 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 | ||
3b424979 | 33 | #define BGP_MED_MAX UINT32_MAX |
34 | ||
718e3744 | 35 | /* BGP Attribute type range. */ |
36 | #define BGP_ATTR_TYPE_RANGE 256 | |
37 | #define BGP_ATTR_BITMAP_SIZE (BGP_ATTR_TYPE_RANGE / BITMAP_NBBY) | |
38 | ||
39 | /* BGP Attribute flags. */ | |
40 | #define BGP_ATTR_FLAG_OPTIONAL 0x80 /* Attribute is optional. */ | |
41 | #define BGP_ATTR_FLAG_TRANS 0x40 /* Attribute is transitive. */ | |
42 | #define BGP_ATTR_FLAG_PARTIAL 0x20 /* Attribute is partial. */ | |
43 | #define BGP_ATTR_FLAG_EXTLEN 0x10 /* Extended length flag. */ | |
44 | ||
45 | /* BGP attribute header must bigger than 2. */ | |
46 | #define BGP_ATTR_MIN_LEN 2 /* Attribute flag and type. */ | |
47 | ||
48 | /* BGP attribute structure. */ | |
49 | struct attr | |
50 | { | |
718e3744 | 51 | /* Attributes. */ |
718e3744 | 52 | #ifdef HAVE_IPV6 |
53 | struct in6_addr mp_nexthop_global; | |
54 | struct in6_addr mp_nexthop_local; | |
55 | #endif /* HAVE_IPV6 */ | |
718e3744 | 56 | |
57 | /* AS Path structure */ | |
58 | struct aspath *aspath; | |
59 | ||
60 | /* Community structure */ | |
61 | struct community *community; | |
62 | ||
63 | /* Extended Communities attribute. */ | |
64 | struct ecommunity *ecommunity; | |
cbdfbaa5 PJ |
65 | |
66 | /* Route-Reflector Cluster attribute */ | |
67 | struct cluster_list *cluster; | |
68 | ||
718e3744 | 69 | /* Unknown transitive attribute. */ |
70 | struct transit *transit; | |
cbdfbaa5 PJ |
71 | |
72 | /* Reference count of this attribute. */ | |
73 | unsigned long refcnt; | |
74 | ||
75 | /* Flag of attribute is set or not. */ | |
76 | u_int32_t flag; | |
77 | ||
78 | /* Apart from in6_addr, the remaining static attributes */ | |
79 | struct in_addr nexthop; | |
80 | u_int32_t med; | |
81 | u_int32_t local_pref; | |
82 | struct in_addr aggregator_addr; | |
83 | struct in_addr originator_id; | |
84 | struct in_addr mp_nexthop_global_in; | |
85 | struct in_addr mp_nexthop_local_in; | |
86 | u_int32_t weight; | |
87 | as_t aggregator_as; | |
88 | u_char origin; | |
89 | u_char mp_nexthop_len; | |
718e3744 | 90 | }; |
91 | ||
92 | /* Router Reflector related structure. */ | |
93 | struct cluster_list | |
94 | { | |
95 | unsigned long refcnt; | |
96 | int length; | |
97 | struct in_addr *list; | |
98 | }; | |
99 | ||
100 | /* Unknown transit attribute. */ | |
101 | struct transit | |
102 | { | |
103 | unsigned long refcnt; | |
104 | int length; | |
105 | u_char *val; | |
106 | }; | |
107 | ||
108 | #define ATTR_FLAG_BIT(X) (1 << ((X) - 1)) | |
109 | ||
110 | /* Prototypes. */ | |
94f2b392 | 111 | extern void bgp_attr_init (void); |
112 | extern int bgp_attr_parse (struct peer *, struct attr *, bgp_size_t, | |
718e3744 | 113 | struct bgp_nlri *, struct bgp_nlri *); |
94f2b392 | 114 | extern int bgp_attr_check (struct peer *, struct attr *); |
115 | extern struct attr *bgp_attr_intern (struct attr *attr); | |
116 | extern void bgp_attr_unintern (struct attr *); | |
117 | extern void bgp_attr_flush (struct attr *); | |
118 | extern struct attr *bgp_attr_default_set (struct attr *attr, u_char); | |
119 | extern struct attr *bgp_attr_default_intern (u_char); | |
120 | extern struct attr *bgp_attr_aggregate_intern (struct bgp *, u_char, | |
5228ad27 | 121 | struct aspath *, |
122 | struct community *, int as_set); | |
94f2b392 | 123 | extern bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *, |
5228ad27 | 124 | struct stream *, struct attr *, |
125 | struct prefix *, afi_t, safi_t, | |
a3b6ea56 | 126 | struct peer *, struct prefix_rd *, u_char *); |
94f2b392 | 127 | extern bgp_size_t bgp_packet_withdraw (struct peer *peer, struct stream *s, |
5228ad27 | 128 | struct prefix *p, afi_t, safi_t, |
a3b6ea56 | 129 | struct prefix_rd *, u_char *); |
94f2b392 | 130 | extern void bgp_dump_routes_attr (struct stream *, struct attr *, |
131 | struct prefix *); | |
923de654 PJ |
132 | extern int attrhash_cmp (void *, void *); |
133 | extern unsigned int attrhash_key_make (void *); | |
94f2b392 | 134 | extern void attr_show_all (struct vty *); |
cbdfbaa5 PJ |
135 | extern unsigned long int attr_count (void); |
136 | extern unsigned long int attr_unknown_count (void); | |
718e3744 | 137 | |
138 | /* Cluster list prototypes. */ | |
94f2b392 | 139 | extern int cluster_loop_check (struct cluster_list *, struct in_addr); |
140 | extern void cluster_unintern (struct cluster_list *); | |
718e3744 | 141 | |
142 | /* Transit attribute prototypes. */ | |
143 | void transit_unintern (struct transit *); | |
00d252cb | 144 | |
145 | #endif /* _QUAGGA_BGP_ATTR_H */ |