2 /* $Id: bgp.h,v 1.5 2005/06/04 15:42:35 bodea Exp $ */
7 #define BGP_MAX_PACKET_SIZE 4096
8 #define BGP_HOLD_TIME 180 /* seconds before peer times us out */
9 #define BGP_KEEPALIVE_TIME 60 /* seconds between messages */
10 #define BGP_STATE_TIME 60 /* state transition timeout in seconds */
11 #define BGP_MAX_RETRY 42 /* maximum number of times to retry */
12 #define BGP_RETRY_BACKOFF 60 /* number of seconds between retries,
15 #define BGP_METRIC 1 /* multi_exit_disc */
16 #define BGP_LOCAL_PREF 100 /* local preference value */
22 } __attribute__ ((packed
));
25 #define BGP_MSG_OPEN 1
26 #define BGP_MSG_UPDATE 2
27 #define BGP_MSG_NOTIFICATION 3
28 #define BGP_MSG_KEEPALIVE 4
31 struct bgp_header header
;
32 char data
[BGP_MAX_PACKET_SIZE
- sizeof(struct bgp_header
)]; /* variable */
33 } __attribute__ ((packed
));
35 struct bgp_data_open
{
42 #define BGP_DATA_OPEN_SIZE 10 /* size of struct excluding opt_params */
43 char opt_params
[sizeof(((struct bgp_packet
*)0)->data
) - BGP_DATA_OPEN_SIZE
]; /* variable */
44 } __attribute__ ((packed
));
46 struct bgp_opt_param
{
49 #define BGP_MAX_OPT_PARAM_SIZE 256
50 char value
[BGP_MAX_OPT_PARAM_SIZE
];
51 } __attribute__ ((packed
));
53 #define BGP_PARAM_TYPE_CAPABILITY 2
54 struct bgp_capability
{
57 #define BGP_MAX_CAPABILITY_SIZE 256
58 char value
[BGP_MAX_CAPABILITY_SIZE
];
59 } __attribute__ ((packed
));
61 /* RFC4760 Multiprotocol extension */
62 #define BGP_CAP_CODE_MP 1
64 struct bgp_mp_cap_param
{
65 uint16_t afi
; /* sa_family_t */
66 uint8_t reserved
; /* SHOULD be 0 */
68 } __attribute__ ((packed
));
70 /* bgp_mp_cap_param.safi */
71 #define BGP_MP_SAFI_UNICAST 1
72 #define BGP_MP_SAFI_MULTICAST 2
74 struct bgp_ip6_prefix
{
76 uint8_t prefix
[16]; /* variable */
77 } __attribute__ ((packed
));
79 /* end of RFC4760 specific definitions */
81 struct bgp_ip_prefix
{
83 uint32_t prefix
; /* variable */
84 } __attribute__ ((packed
));
86 /* works for both IPv4 and IPv6 prefixes */
87 #define BGP_IP_PREFIX_SIZE(p) (1 + ((p).len / 8) + ((p).len % 8 != 0))
89 struct bgp_path_attr
{
95 char value
[29]; /* semi-random size, adequate for l2tpns */
96 } __attribute__ ((packed
)) s
; /* short */
100 } __attribute__ ((packed
)) e
; /* extended */
101 } data
; /* variable */
102 } __attribute__ ((packed
));
104 struct bgp_attr_mp_reach_nlri_partial
{
105 uint16_t afi
; /* sa_family_t */
107 uint8_t next_hop_len
;
108 uint8_t next_hop
[16];
110 } __attribute__ ((packed
));
111 #define BGP_PATH_ATTR_MP_REACH_NLRI_PARTIAL_SIZE (3 + sizeof(struct bgp_attr_mp_reach_nlri_partial))
113 struct bgp_attr_mp_unreach_nlri_partial
{
114 uint16_t afi
; /* sa_family_t */
116 } __attribute__ ((packed
));
117 /* we use it as an extended attribute */
118 #define BGP_PATH_ATTR_MP_UNREACH_NLRI_PARTIAL_SIZE (4 + sizeof(struct bgp_attr_mp_unreach_nlri_partial))
120 /* bgp_path_attr.flags (bitfields) */
121 #define BGP_PATH_ATTR_FLAG_OPTIONAL (1 << 7)
122 #define BGP_PATH_ATTR_FLAG_TRANS (1 << 6)
123 #define BGP_PATH_ATTR_FLAG_PARTIAL (1 << 5)
124 #define BGP_PATH_ATTR_FLAG_EXTLEN (1 << 4)
126 /* bgp_path_attr.code, ...value */
127 #define BGP_PATH_ATTR_CODE_ORIGIN 1 /* well-known, mandatory */
128 # define BGP_PATH_ATTR_CODE_ORIGIN_IGP 0
129 # define BGP_PATH_ATTR_CODE_ORIGIN_EGP 1
130 # define BGP_PATH_ATTR_CODE_ORIGIN_INCOMPLETE 2
131 #define BGP_PATH_ATTR_CODE_AS_PATH 2 /* well-known, mandatory */
132 # define BGP_PATH_ATTR_CODE_AS_PATH_AS_SET 1
133 # define BGP_PATH_ATTR_CODE_AS_PATH_AS_SEQUENCE 2
134 #define BGP_PATH_ATTR_CODE_NEXT_HOP 3 /* well-known, mandatory */
135 #define BGP_PATH_ATTR_CODE_MULTI_EXIT_DISC 4 /* optional, non-transitive */
136 #define BGP_PATH_ATTR_CODE_LOCAL_PREF 5 /* well-known, discretionary */
137 #define BGP_PATH_ATTR_CODE_ATOMIC_AGGREGATE 6 /* well-known, discretionary */
138 #define BGP_PATH_ATTR_CODE_AGGREGATOR 7 /* optional, transitive */
139 #define BGP_PATH_ATTR_CODE_COMMUNITIES 8 /* optional, transitive (RFC1997) */
140 #define BGP_PATH_ATTR_CODE_MP_REACH_NLRI 14 /* optional, non-transitive (RFC4760) */
141 #define BGP_PATH_ATTR_CODE_MP_UNREACH_NLRI 15 /* optional, non-transitive (RFC4760) */
143 #define BGP_PATH_ATTR_SIZE(p) ((((p).flags & BGP_PATH_ATTR_FLAG_EXTLEN) \
144 ? ((p).data.e.len + 4) : (p).data.s.len) + 3)
146 /* well known COMMUNITIES */
147 #define BGP_COMMUNITY_NO_EXPORT 0xffffff01 /* don't advertise outside confederation */
148 #define BGP_COMMUNITY_NO_ADVERTISE 0xffffff02 /* don't advertise to any peer */
149 #define BGP_COMMUNITY_NO_EXPORT_SUBCONFED 0xffffff03 /* don't advertise to any other AS */
151 struct bgp_data_notification
{
153 uint8_t error_subcode
;
154 char data
[sizeof(((struct bgp_packet
*)0)->data
) - 2]; /* variable */
155 } __attribute__ ((packed
));
157 /* bgp_data_notification.error_code, .error_subcode */
158 #define BGP_ERR_UNSPEC 0
159 #define BGP_ERR_HEADER 1
160 # define BGP_ERR_HDR_NOT_SYNC 1
161 # define BGP_ERR_HDR_BAD_LEN 2
162 # define BGP_ERR_HDR_BAD_TYPE 3
163 #define BGP_ERR_OPEN 2
164 # define BGP_ERR_OPN_VERSION 1
165 # define BGP_ERR_OPN_BAD_AS 2
166 # define BGP_ERR_OPN_BAD_IDENT 3
167 # define BGP_ERR_OPN_UNSUP_PARAM 4
168 # define BGP_ERR_OPN_AUTH_FAILURE 5
169 # define BGP_ERR_OPN_HOLD_TIME 6
170 # define BGP_ERR_OPN_UNSUP_CAP 7
171 #define BGP_ERR_UPDATE 3
172 # define BGP_ERR_UPD_BAD_ATTR_LIST 1
173 # define BGP_ERR_UPD_UNKN_WK_ATTR 2
174 # define BGP_ERR_UPD_MISS_WK_ATTR 3
175 # define BGP_ERR_UPD_BAD_ATTR_FLAG 4
176 # define BGP_ERR_UPD_BAD_ATTR_LEN 5
177 # define BGP_ERR_UPD_BAD_ORIGIN 6
178 # define BGP_ERR_UPD_ROUTING_LOOP 7
179 # define BGP_ERR_UPD_BAD_NEXT_HOP 8
180 # define BGP_ERR_UPD_BAD_OPT_ATTR 9
181 # define BGP_ERR_UPD_BAD_NETWORK 10
182 # define BGP_ERR_UPD_BAD_AS_PATH 11
183 #define BGP_ERR_HOLD_TIMER_EXP 4
184 #define BGP_ERR_FSM 5
185 #define BGP_ERR_CEASE 6
188 Disabled
, /* initial, or failed */
189 Idle
, /* trying to connect */
190 Connect
, /* connect issued */
191 Active
, /* connected, waiting to send OPEN */
192 OpenSent
, /* OPEN sent, waiting for peer OPEN */
193 OpenConfirm
, /* KEEPALIVE sent, waiting for peer KEEPALIVE */
194 Established
, /* established */
197 struct bgp_route6_list
{
198 struct bgp_ip6_prefix dest
;
199 struct bgp_route6_list
*next
;
202 struct bgp_route_list
{
203 struct bgp_ip_prefix dest
;
204 struct bgp_route_list
*next
;
208 struct bgp_packet packet
; /* BGP packet */
209 size_t done
; /* bytes sent/recvd */
212 enum bgp_mp_handling
{
214 DoesntHandleIPv6Routes
,
220 char name
[32]; /* peer name */
221 in_addr_t addr
; /* peer address */
222 int as
; /* AS number */
224 enum bgp_state state
; /* FSM state */
225 enum bgp_state next_state
; /* next state after outbuf cleared */
226 time_t state_time
; /* time of last state change */
227 time_t keepalive_time
; /* time to send next keepalive */
228 time_t retry_time
; /* time for connection retry */
229 int retry_count
; /* connection retry count */
230 int init_keepalive
; /* initial keepalive time */
231 int init_hold
; /* initial hold time */
232 int keepalive
; /* negotiated keepalive time */
233 int hold
; /* negotiated hold time */
234 time_t expire_time
; /* time next peer packet expected */
235 int routing
; /* propagate routes */
236 int update_routes
; /* UPDATE required */
237 struct bgp_route_list
*routes
; /* routes known by this peer */
238 struct bgp_buf
*outbuf
; /* pending output */
239 struct bgp_buf
*inbuf
; /* pending input */
240 int cli_flag
; /* updates requested from CLI */
241 char *path_attrs
; /* path attrs to send in UPDATE message */
242 int path_attr_len
; /* length of path attrs */
243 int path_attr_len_without_nexthop
; /* length of path attrs without NEXT_HOP */
244 uint32_t events
; /* events to poll */
245 struct event_data edata
; /* poll data */
246 enum bgp_mp_handling mp_handling
; /* how it handles IPv6 routes advertisements */
247 int update_routes6
; /* UPDATE required for IPv6 routes */
248 struct bgp_route6_list
*routes6
; /* IPv6 routes known by this peer */
249 char mp_reach_nlri_partial
[BGP_PATH_ATTR_MP_REACH_NLRI_PARTIAL_SIZE
];
250 char mp_unreach_nlri_partial
[BGP_PATH_ATTR_MP_UNREACH_NLRI_PARTIAL_SIZE
];
253 /* bgp_peer.cli_flag */
254 #define BGP_CLI_SUSPEND 1
255 #define BGP_CLI_ENABLE 2
256 #define BGP_CLI_RESTART 3
258 extern struct bgp_peer
*bgp_peers
;
259 extern int bgp_configured
;
262 int bgp_setup(int as
);
263 int bgp_start(struct bgp_peer
*peer
, char *name
, int as
, int keepalive
,
264 int hold
, int enable
);
266 void bgp_stop(struct bgp_peer
*peer
);
267 void bgp_halt(struct bgp_peer
*peer
);
268 int bgp_restart(struct bgp_peer
*peer
);
269 int bgp_add_route(in_addr_t ip
, in_addr_t mask
);
270 int bgp_add_route6(struct in6_addr ip
, int prefixlen
);
271 int bgp_del_route(in_addr_t ip
, in_addr_t mask
);
272 int bgp_del_route6(struct in6_addr ip
, int prefixlen
);
273 void bgp_enable_routing(int enable
);
274 int bgp_set_poll(void);
275 int bgp_process(uint32_t events
[]);
276 char const *bgp_state_str(enum bgp_state state
);
278 extern char const *cvs_id_bgp
;
280 #endif /* __BGP_H__ */