]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_open.c
BGP: Use the new value of dynamic capability in Open
[mirror_frr.git] / bgpd / bgp_open.c
CommitLineData
718e3744 1/* BGP open message handling
2 Copyright (C) 1998, 1999 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#include <zebra.h>
22
23#include "linklist.h"
24#include "prefix.h"
25#include "stream.h"
26#include "thread.h"
27#include "log.h"
28#include "command.h"
6d58272b 29#include "memory.h"
3f9c7369 30#include "queue.h"
718e3744 31
32#include "bgpd/bgpd.h"
33#include "bgpd/bgp_attr.h"
34#include "bgpd/bgp_debug.h"
35#include "bgpd/bgp_fsm.h"
36#include "bgpd/bgp_packet.h"
37#include "bgpd/bgp_open.h"
0b2aa3a0 38#include "bgpd/bgp_aspath.h"
538621f2 39#include "bgpd/bgp_vty.h"
40
718e3744 41/* BGP-4 Multiprotocol Extentions lead us to the complex world. We can
42 negotiate remote peer supports extentions or not. But if
43 remote-peer doesn't supports negotiation process itself. We would
44 like to do manual configuration.
45
46 So there is many configurable point. First of all we want set each
47 peer whether we send capability negotiation to the peer or not.
48 Next, if we send capability to the peer we want to set my capabilty
49 inforation at each peer. */
50
51void
52bgp_capability_vty_out (struct vty *vty, struct peer *peer)
53{
5228ad27 54 char *pnt;
55 char *end;
6d58272b
PJ
56 struct capability_mp_data mpc;
57 struct capability_header *hdr;
718e3744 58
59 pnt = peer->notify.data;
60 end = pnt + peer->notify.length;
6d58272b 61
718e3744 62 while (pnt < end)
63 {
6d58272b 64 if (pnt + sizeof (struct capability_mp_data) + 2 > end)
718e3744 65 return;
6d58272b
PJ
66
67 hdr = (struct capability_header *)pnt;
68 if (pnt + hdr->length + 2 > end)
718e3744 69 return;
70
6d58272b
PJ
71 memcpy (&mpc, pnt + 2, sizeof(struct capability_mp_data));
72
73 if (hdr->code == CAPABILITY_CODE_MP)
718e3744 74 {
75 vty_out (vty, " Capability error for: Multi protocol ");
76
6d58272b 77 switch (ntohs (mpc.afi))
718e3744 78 {
79 case AFI_IP:
80 vty_out (vty, "AFI IPv4, ");
81 break;
82 case AFI_IP6:
83 vty_out (vty, "AFI IPv6, ");
84 break;
85 default:
6d58272b 86 vty_out (vty, "AFI Unknown %d, ", ntohs (mpc.afi));
718e3744 87 break;
88 }
6d58272b 89 switch (mpc.safi)
718e3744 90 {
91 case SAFI_UNICAST:
92 vty_out (vty, "SAFI Unicast");
93 break;
94 case SAFI_MULTICAST:
95 vty_out (vty, "SAFI Multicast");
96 break;
42e6d745
DO
97 case SAFI_MPLS_LABELED_VPN:
98 vty_out (vty, "SAFI MPLS-labeled VPN");
718e3744 99 break;
100 default:
6d58272b 101 vty_out (vty, "SAFI Unknown %d ", mpc.safi);
718e3744 102 break;
103 }
104 vty_out (vty, "%s", VTY_NEWLINE);
105 }
6d58272b 106 else if (hdr->code >= 128)
718e3744 107 vty_out (vty, " Capability error: vendor specific capability code %d",
6d58272b 108 hdr->code);
718e3744 109 else
110 vty_out (vty, " Capability error: unknown capability code %d",
6d58272b 111 hdr->code);
718e3744 112
6d58272b 113 pnt += hdr->length + 2;
718e3744 114 }
115}
116
6d58272b
PJ
117static void
118bgp_capability_mp_data (struct stream *s, struct capability_mp_data *mpc)
718e3744 119{
6d58272b
PJ
120 mpc->afi = stream_getw (s);
121 mpc->reserved = stream_getc (s);
122 mpc->safi = stream_getc (s);
123}
718e3744 124
6d58272b
PJ
125int
126bgp_afi_safi_valid_indices (afi_t afi, safi_t *safi)
127{
6d58272b 128 switch (afi)
718e3744 129 {
6d58272b
PJ
130 case AFI_IP:
131#ifdef HAVE_IPV6
132 case AFI_IP6:
133#endif
134 switch (*safi)
135 {
42e6d745
DO
136 /* BGP MPLS-labeled VPN SAFI isn't contigious with others, remap */
137 case SAFI_MPLS_LABELED_VPN:
6d58272b
PJ
138 *safi = SAFI_MPLS_VPN;
139 case SAFI_UNICAST:
140 case SAFI_MULTICAST:
141 case SAFI_MPLS_VPN:
142 return 1;
143 }
718e3744 144 }
6d58272b
PJ
145 zlog_debug ("unknown afi/safi (%u/%u)", afi, *safi);
146
147 return 0;
148}
149
150/* Set negotiated capability value. */
151static int
152bgp_capability_mp (struct peer *peer, struct capability_header *hdr)
153{
154 struct capability_mp_data mpc;
155 struct stream *s = BGP_INPUT (peer);
156
157 bgp_capability_mp_data (s, &mpc);
158
16286195 159 if (bgp_debug_neighbor_events(peer->host))
6d58272b
PJ
160 zlog_debug ("%s OPEN has MP_EXT CAP for afi/safi: %u/%u",
161 peer->host, mpc.afi, mpc.safi);
162
163 if (!bgp_afi_safi_valid_indices (mpc.afi, &mpc.safi))
164 return -1;
165
166 /* Now safi remapped, and afi/safi are valid array indices */
167 peer->afc_recv[mpc.afi][mpc.safi] = 1;
168
169 if (peer->afc[mpc.afi][mpc.safi])
e08286bc 170 peer->afc_nego[mpc.afi][mpc.safi] = 1;
6d58272b
PJ
171 else
172 return -1;
718e3744 173
174 return 0;
175}
176
94f2b392 177static void
718e3744 178bgp_capability_orf_not_support (struct peer *peer, afi_t afi, safi_t safi,
179 u_char type, u_char mode)
180{
16286195 181 if (bgp_debug_neighbor_events(peer))
8325cd7f 182 zlog_debug ("%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
718e3744 183 peer->host, afi, safi, type, mode);
184}
185
8f5abac1 186static const struct message orf_type_str[] =
6d58272b
PJ
187{
188 { ORF_TYPE_PREFIX, "Prefixlist" },
189 { ORF_TYPE_PREFIX_OLD, "Prefixlist (old)" },
190};
837d16cc 191static const int orf_type_str_max = array_size(orf_type_str);
6d58272b 192
8f5abac1 193static const struct message orf_mode_str[] =
6d58272b
PJ
194{
195 { ORF_MODE_RECEIVE, "Receive" },
196 { ORF_MODE_SEND, "Send" },
197 { ORF_MODE_BOTH, "Both" },
198};
837d16cc 199static const int orf_mode_str_max = array_size(orf_mode_str);
6d58272b 200
94f2b392 201static int
6d58272b 202bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr)
718e3744 203{
6d58272b
PJ
204 struct stream *s = BGP_INPUT (peer);
205 struct capability_orf_entry entry;
206 afi_t afi;
207 safi_t safi;
718e3744 208 u_char type;
209 u_char mode;
210 u_int16_t sm_cap = 0; /* capability send-mode receive */
211 u_int16_t rm_cap = 0; /* capability receive-mode receive */
212 int i;
213
6d58272b
PJ
214 /* ORF Entry header */
215 bgp_capability_mp_data (s, &entry.mpc);
216 entry.num = stream_getc (s);
217 afi = entry.mpc.afi;
218 safi = entry.mpc.safi;
219
16286195 220 if (bgp_debug_neighbor_events(peer))
6d58272b
PJ
221 zlog_debug ("%s ORF Cap entry for afi/safi: %u/%u",
222 peer->host, entry.mpc.afi, entry.mpc.safi);
718e3744 223
224 /* Check AFI and SAFI. */
6d58272b
PJ
225 if (!bgp_afi_safi_valid_indices (entry.mpc.afi, &safi))
226 {
227 zlog_info ("%s Addr-family %d/%d not supported."
228 " Ignoring the ORF capability",
229 peer->host, entry.mpc.afi, entry.mpc.safi);
230 return 0;
231 }
232
233 /* validate number field */
5e728e92 234 if (sizeof (struct capability_orf_entry) + (entry.num * 2) > hdr->length)
718e3744 235 {
6d58272b
PJ
236 zlog_info ("%s ORF Capability entry length error,"
237 " Cap length %u, num %u",
238 peer->host, hdr->length, entry.num);
239 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
718e3744 240 return -1;
241 }
242
6d58272b 243 for (i = 0 ; i < entry.num ; i++)
718e3744 244 {
6d58272b
PJ
245 type = stream_getc(s);
246 mode = stream_getc(s);
247
718e3744 248 /* ORF Mode error check */
6d58272b
PJ
249 switch (mode)
250 {
251 case ORF_MODE_BOTH:
252 case ORF_MODE_SEND:
253 case ORF_MODE_RECEIVE:
254 break;
255 default:
256 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
257 continue;
718e3744 258 }
6d58272b
PJ
259 /* ORF Type and afi/safi error checks */
260 /* capcode versus type */
261 switch (hdr->code)
262 {
263 case CAPABILITY_CODE_ORF:
264 switch (type)
265 {
266 case ORF_TYPE_PREFIX:
267 break;
268 default:
269 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
270 continue;
271 }
272 break;
273 case CAPABILITY_CODE_ORF_OLD:
274 switch (type)
275 {
276 case ORF_TYPE_PREFIX_OLD:
277 break;
278 default:
279 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
280 continue;
281 }
282 break;
283 default:
284 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
285 continue;
286 }
287
288 /* AFI vs SAFI */
289 if (!((afi == AFI_IP && safi == SAFI_UNICAST)
290 || (afi == AFI_IP && safi == SAFI_MULTICAST)
291 || (afi == AFI_IP6 && safi == SAFI_UNICAST)))
292 {
293 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
294 continue;
295 }
296
16286195 297 if (bgp_debug_neighbor_events(peer))
6d58272b
PJ
298 zlog_debug ("%s OPEN has %s ORF capability"
299 " as %s for afi/safi: %d/%d",
300 peer->host, LOOKUP (orf_type_str, type),
301 LOOKUP (orf_mode_str, mode),
302 entry.mpc.afi, safi);
718e3744 303
6d58272b 304 if (hdr->code == CAPABILITY_CODE_ORF)
718e3744 305 {
6d58272b
PJ
306 sm_cap = PEER_CAP_ORF_PREFIX_SM_RCV;
307 rm_cap = PEER_CAP_ORF_PREFIX_RM_RCV;
718e3744 308 }
6d58272b 309 else if (hdr->code == CAPABILITY_CODE_ORF_OLD)
718e3744 310 {
6d58272b
PJ
311 sm_cap = PEER_CAP_ORF_PREFIX_SM_OLD_RCV;
312 rm_cap = PEER_CAP_ORF_PREFIX_RM_OLD_RCV;
718e3744 313 }
314 else
315 {
316 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
317 continue;
318 }
319
320 switch (mode)
321 {
322 case ORF_MODE_BOTH:
323 SET_FLAG (peer->af_cap[afi][safi], sm_cap);
324 SET_FLAG (peer->af_cap[afi][safi], rm_cap);
325 break;
326 case ORF_MODE_SEND:
327 SET_FLAG (peer->af_cap[afi][safi], sm_cap);
328 break;
329 case ORF_MODE_RECEIVE:
330 SET_FLAG (peer->af_cap[afi][safi], rm_cap);
331 break;
332 }
333 }
334 return 0;
335}
336
6d58272b
PJ
337static int
338bgp_capability_restart (struct peer *peer, struct capability_header *caphdr)
339{
340 struct stream *s = BGP_INPUT (peer);
341 u_int16_t restart_flag_time;
342 int restart_bit = 0;
343 size_t end = stream_get_getp (s) + caphdr->length;
344
345 SET_FLAG (peer->cap, PEER_CAP_RESTART_RCV);
346 restart_flag_time = stream_getw(s);
347 if (CHECK_FLAG (restart_flag_time, RESTART_R_BIT))
fe7d2a48
DS
348 {
349 SET_FLAG (peer->cap, PEER_CAP_RESTART_BIT_RCV);
350 restart_bit = 1;
351 }
6d58272b
PJ
352 UNSET_FLAG (restart_flag_time, 0xF000);
353 peer->v_gr_restart = restart_flag_time;
718e3744 354
16286195 355 if (bgp_debug_neighbor_events(peer))
6d58272b
PJ
356 {
357 zlog_debug ("%s OPEN has Graceful Restart capability", peer->host);
358 zlog_debug ("%s Peer has%srestarted. Restart Time : %d",
359 peer->host, restart_bit ? " " : " not ",
360 peer->v_gr_restart);
361 }
718e3744 362
21cc7694 363 while (stream_get_getp (s) + 4 <= end)
6d58272b
PJ
364 {
365 afi_t afi = stream_getw (s);
366 safi_t safi = stream_getc (s);
367 u_char flag = stream_getc (s);
368
369 if (!bgp_afi_safi_valid_indices (afi, &safi))
370 {
16286195 371 if (bgp_debug_neighbor_events(peer))
6d58272b
PJ
372 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported."
373 " Ignore the Graceful Restart capability",
374 peer->host, afi, safi);
375 }
376 else if (!peer->afc[afi][safi])
377 {
16286195 378 if (bgp_debug_neighbor_events(peer))
6d58272b
PJ
379 zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled."
380 " Ignore the Graceful Restart capability",
381 peer->host, afi, safi);
382 }
383 else
384 {
16286195 385 if (bgp_debug_neighbor_events(peer))
6d58272b
PJ
386 zlog_debug ("%s Address family %s is%spreserved", peer->host,
387 afi_safi_print (afi, safi),
388 CHECK_FLAG (peer->af_cap[afi][safi],
389 PEER_CAP_RESTART_AF_PRESERVE_RCV)
390 ? " " : " not ");
391
392 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV);
393 if (CHECK_FLAG (flag, RESTART_F_BIT))
394 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV);
395
396 }
397 }
398 return 0;
399}
718e3744 400
0b2aa3a0
PJ
401static as_t
402bgp_capability_as4 (struct peer *peer, struct capability_header *hdr)
403{
5861739f
PJ
404 SET_FLAG (peer->cap, PEER_CAP_AS4_RCV);
405
406 if (hdr->length != CAPABILITY_CODE_AS4_LEN)
407 {
408 zlog_err ("%s AS4 capability has incorrect data length %d",
409 peer->host, hdr->length);
410 return 0;
411 }
412
0b2aa3a0
PJ
413 as_t as4 = stream_getl (BGP_INPUT(peer));
414
415 if (BGP_DEBUG (as4, AS4))
416 zlog_debug ("%s [AS4] about to set cap PEER_CAP_AS4_RCV, got as4 %u",
417 peer->host, as4);
0b2aa3a0
PJ
418 return as4;
419}
420
a82478b9
DS
421static int
422bgp_capability_addpath (struct peer *peer, struct capability_header *hdr)
423{
424 struct stream *s = BGP_INPUT (peer);
425 size_t end = stream_get_getp (s) + hdr->length;
426
427 SET_FLAG (peer->cap, PEER_CAP_ADDPATH_RCV);
428
429 while (stream_get_getp (s) + 4 <= end)
430 {
431 afi_t afi = stream_getw (s);
432 safi_t safi = stream_getc (s);
433 u_char send_receive = stream_getc (s);
434
435 if (bgp_debug_neighbor_events(peer->host))
436 zlog_debug ("%s OPEN has AddPath CAP for afi/safi: %u/%u%s%s",
437 peer->host, afi, safi,
438 (send_receive & BGP_ADDPATH_RX) ? ", receive" : "",
439 (send_receive & BGP_ADDPATH_TX) ? ", transmit" : "");
440
441 if (!bgp_afi_safi_valid_indices (afi, &safi))
442 return -1;
443
444 if (send_receive & BGP_ADDPATH_RX)
445 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV);
446
447 if (send_receive & BGP_ADDPATH_TX)
448 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV);
449 }
450
451 return 0;
452}
453
fc52f953 454static const struct message capcode_str[] =
6d58272b 455{
6d58272b
PJ
456 { CAPABILITY_CODE_MP, "MultiProtocol Extensions" },
457 { CAPABILITY_CODE_REFRESH, "Route Refresh" },
458 { CAPABILITY_CODE_ORF, "Cooperative Route Filtering" },
459 { CAPABILITY_CODE_RESTART, "Graceful Restart" },
460 { CAPABILITY_CODE_AS4, "4-octet AS number" },
89eeecb8 461 { CAPABILITY_CODE_ADDPATH, "AddPath" },
6d58272b 462 { CAPABILITY_CODE_DYNAMIC, "Dynamic" },
89eeecb8 463 { CAPABILITY_CODE_DYNAMIC_OLD, "Dynamic (Old)" },
6d58272b
PJ
464 { CAPABILITY_CODE_REFRESH_OLD, "Route Refresh (Old)" },
465 { CAPABILITY_CODE_ORF_OLD, "ORF (Old)" },
466};
837d16cc 467static const int capcode_str_max = array_size(capcode_str);
6d58272b
PJ
468
469/* Minimum sizes for length field of each cap (so not inc. the header) */
fc52f953 470static const size_t cap_minsizes[] =
6d58272b
PJ
471{
472 [CAPABILITY_CODE_MP] = sizeof (struct capability_mp_data),
473 [CAPABILITY_CODE_REFRESH] = CAPABILITY_CODE_REFRESH_LEN,
474 [CAPABILITY_CODE_ORF] = sizeof (struct capability_orf_entry),
370b64a2 475 [CAPABILITY_CODE_RESTART] = sizeof (struct capability_gr),
6d58272b 476 [CAPABILITY_CODE_AS4] = CAPABILITY_CODE_AS4_LEN,
a82478b9 477 [CAPABILITY_CODE_ADDPATH] = CAPABILITY_CODE_ADDPATH_LEN,
6d58272b 478 [CAPABILITY_CODE_DYNAMIC] = CAPABILITY_CODE_DYNAMIC_LEN,
89eeecb8 479 [CAPABILITY_CODE_DYNAMIC_OLD] = CAPABILITY_CODE_DYNAMIC_LEN,
6d58272b
PJ
480 [CAPABILITY_CODE_REFRESH_OLD] = CAPABILITY_CODE_REFRESH_LEN,
481 [CAPABILITY_CODE_ORF_OLD] = sizeof (struct capability_orf_entry),
482};
483
3b381c32
AS
484/**
485 * Parse given capability.
6d58272b 486 * XXX: This is reading into a stream, but not using stream API
3b381c32
AS
487 *
488 * @param[out] mp_capability Set to 1 on return iff one or more Multiprotocol
489 * capabilities were encountered.
6d58272b
PJ
490 */
491static int
3b381c32
AS
492bgp_capability_parse (struct peer *peer, size_t length, int *mp_capability,
493 u_char **error)
6d58272b
PJ
494{
495 int ret;
496 struct stream *s = BGP_INPUT (peer);
497 size_t end = stream_get_getp (s) + length;
498
499 assert (STREAM_READABLE (s) >= length);
500
501 while (stream_get_getp (s) < end)
502 {
503 size_t start;
504 u_char *sp = stream_pnt (s);
505 struct capability_header caphdr;
506
718e3744 507 /* We need at least capability code and capability length. */
6d58272b 508 if (stream_get_getp(s) + 2 > end)
718e3744 509 {
6d58272b 510 zlog_info ("%s Capability length error (< header)", peer->host);
718e3744 511 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
512 return -1;
513 }
6d58272b
PJ
514
515 caphdr.code = stream_getc (s);
516 caphdr.length = stream_getc (s);
517 start = stream_get_getp (s);
518
519 /* Capability length check sanity check. */
520 if (start + caphdr.length > end)
718e3744 521 {
6d58272b 522 zlog_info ("%s Capability length error (< length)", peer->host);
718e3744 523 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
524 return -1;
525 }
6d58272b 526
16286195 527 if (bgp_debug_neighbor_events(peer))
6d58272b
PJ
528 zlog_debug ("%s OPEN has %s capability (%u), length %u",
529 peer->host,
530 LOOKUP (capcode_str, caphdr.code),
531 caphdr.code, caphdr.length);
532
533 /* Length sanity check, type-specific, for known capabilities */
534 switch (caphdr.code)
535 {
536 case CAPABILITY_CODE_MP:
537 case CAPABILITY_CODE_REFRESH:
538 case CAPABILITY_CODE_REFRESH_OLD:
539 case CAPABILITY_CODE_ORF:
540 case CAPABILITY_CODE_ORF_OLD:
541 case CAPABILITY_CODE_RESTART:
0b2aa3a0 542 case CAPABILITY_CODE_AS4:
a82478b9 543 case CAPABILITY_CODE_ADDPATH:
6d58272b 544 case CAPABILITY_CODE_DYNAMIC:
89eeecb8 545 case CAPABILITY_CODE_DYNAMIC_OLD:
6d58272b
PJ
546 /* Check length. */
547 if (caphdr.length < cap_minsizes[caphdr.code])
548 {
549 zlog_info ("%s %s Capability length error: got %u,"
550 " expected at least %u",
551 peer->host,
552 LOOKUP (capcode_str, caphdr.code),
fc52f953
SH
553 caphdr.length,
554 (unsigned) cap_minsizes[caphdr.code]);
6d58272b
PJ
555 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
556 return -1;
557 }
558 /* we deliberately ignore unknown codes, see below */
559 default:
560 break;
561 }
562
563 switch (caphdr.code)
564 {
565 case CAPABILITY_CODE_MP:
566 {
3b381c32
AS
567 *mp_capability = 1;
568
6d58272b
PJ
569 /* Ignore capability when override-capability is set. */
570 if (! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
571 {
572 /* Set negotiated value. */
573 ret = bgp_capability_mp (peer, &caphdr);
574
575 /* Unsupported Capability. */
576 if (ret < 0)
577 {
578 /* Store return data. */
579 memcpy (*error, sp, caphdr.length + 2);
580 *error += caphdr.length + 2;
581 }
582 }
583 }
584 break;
585 case CAPABILITY_CODE_REFRESH:
586 case CAPABILITY_CODE_REFRESH_OLD:
587 {
588 /* BGP refresh capability */
589 if (caphdr.code == CAPABILITY_CODE_REFRESH_OLD)
590 SET_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV);
591 else
592 SET_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV);
593 }
594 break;
595 case CAPABILITY_CODE_ORF:
596 case CAPABILITY_CODE_ORF_OLD:
fe9bb645 597 if (bgp_capability_orf_entry (peer, &caphdr))
6d58272b
PJ
598 return -1;
599 break;
600 case CAPABILITY_CODE_RESTART:
601 if (bgp_capability_restart (peer, &caphdr))
602 return -1;
603 break;
604 case CAPABILITY_CODE_DYNAMIC:
89eeecb8 605 case CAPABILITY_CODE_DYNAMIC_OLD:
6d58272b
PJ
606 SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV);
607 break;
0b2aa3a0
PJ
608 case CAPABILITY_CODE_AS4:
609 /* Already handled as a special-case parsing of the capabilities
610 * at the beginning of OPEN processing. So we care not a jot
611 * for the value really, only error case.
612 */
613 if (!bgp_capability_as4 (peer, &caphdr))
614 return -1;
615 break;
a82478b9
DS
616 case CAPABILITY_CODE_ADDPATH:
617 if (bgp_capability_addpath (peer, &caphdr))
618 return -1;
619 break;
6d58272b
PJ
620 default:
621 if (caphdr.code > 128)
622 {
623 /* We don't send Notification for unknown vendor specific
624 capabilities. It seems reasonable for now... */
625 zlog_warn ("%s Vendor specific capability %d",
626 peer->host, caphdr.code);
627 }
628 else
629 {
630 zlog_warn ("%s unrecognized capability code: %d - ignored",
631 peer->host, caphdr.code);
632 memcpy (*error, sp, caphdr.length + 2);
633 *error += caphdr.length + 2;
634 }
635 }
636 if (stream_get_getp(s) != (start + caphdr.length))
637 {
638 if (stream_get_getp(s) > (start + caphdr.length))
639 zlog_warn ("%s Cap-parser for %s read past cap-length, %u!",
640 peer->host, LOOKUP (capcode_str, caphdr.code),
641 caphdr.length);
642 stream_set_getp (s, start + caphdr.length);
643 }
718e3744 644 }
645 return 0;
646}
647
94f2b392 648static int
6d58272b 649bgp_auth_parse (struct peer *peer, size_t length)
718e3744 650{
651 bgp_notify_send (peer,
652 BGP_NOTIFY_OPEN_ERR,
653 BGP_NOTIFY_OPEN_AUTH_FAILURE);
654 return -1;
655}
656
94f2b392 657static int
718e3744 658strict_capability_same (struct peer *peer)
659{
660 int i, j;
661
662 for (i = AFI_IP; i < AFI_MAX; i++)
663 for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
664 if (peer->afc[i][j] != peer->afc_nego[i][j])
665 return 0;
666 return 1;
667}
668
0b2aa3a0
PJ
669/* peek into option, stores ASN to *as4 if the AS4 capability was found.
670 * Returns 0 if no as4 found, as4cap value otherwise.
671 */
672as_t
673peek_for_as4_capability (struct peer *peer, u_char length)
674{
675 struct stream *s = BGP_INPUT (peer);
676 size_t orig_getp = stream_get_getp (s);
677 size_t end = orig_getp + length;
678 as_t as4 = 0;
679
680 /* The full capability parser will better flag the error.. */
681 if (STREAM_READABLE(s) < length)
682 return 0;
683
684 if (BGP_DEBUG (as4, AS4))
685 zlog_info ("%s [AS4] rcv OPEN w/ OPTION parameter len: %u,"
686 " peeking for as4",
687 peer->host, length);
688 /* the error cases we DONT handle, we ONLY try to read as4 out of
689 * correctly formatted options.
690 */
691 while (stream_get_getp(s) < end)
692 {
693 u_char opt_type;
694 u_char opt_length;
695
696 /* Check the length. */
697 if (stream_get_getp (s) + 2 > end)
698 goto end;
699
700 /* Fetch option type and length. */
701 opt_type = stream_getc (s);
702 opt_length = stream_getc (s);
703
704 /* Option length check. */
705 if (stream_get_getp (s) + opt_length > end)
706 goto end;
707
708 if (opt_type == BGP_OPEN_OPT_CAP)
709 {
710 unsigned long capd_start = stream_get_getp (s);
711 unsigned long capd_end = capd_start + opt_length;
712
713 assert (capd_end <= end);
714
715 while (stream_get_getp (s) < capd_end)
716 {
717 struct capability_header hdr;
718
719 if (stream_get_getp (s) + 2 > capd_end)
720 goto end;
721
722 hdr.code = stream_getc (s);
723 hdr.length = stream_getc (s);
724
725 if ((stream_get_getp(s) + hdr.length) > capd_end)
726 goto end;
727
728 if (hdr.code == CAPABILITY_CODE_AS4)
729 {
0b2aa3a0
PJ
730 if (BGP_DEBUG (as4, AS4))
731 zlog_info ("[AS4] found AS4 capability, about to parse");
732 as4 = bgp_capability_as4 (peer, &hdr);
733
734 goto end;
735 }
736 stream_forward_getp (s, hdr.length);
737 }
738 }
739 }
740
741end:
742 stream_set_getp (s, orig_getp);
743 return as4;
744}
745
3b381c32
AS
746/**
747 * Parse open option.
748 *
749 * @param[out] mp_capability @see bgp_capability_parse() for semantics.
750 */
718e3744 751int
3b381c32 752bgp_open_option_parse (struct peer *peer, u_char length, int *mp_capability)
718e3744 753{
754 int ret;
718e3744 755 u_char *error;
756 u_char error_data[BGP_MAX_PACKET_SIZE];
6d58272b
PJ
757 struct stream *s = BGP_INPUT(peer);
758 size_t end = stream_get_getp (s) + length;
718e3744 759
760 ret = 0;
718e3744 761 error = error_data;
762
16286195 763 if (bgp_debug_neighbor_events(peer))
8325cd7f 764 zlog_debug ("%s rcv OPEN w/ OPTION parameter len: %u",
718e3744 765 peer->host, length);
766
6d58272b 767 while (stream_get_getp(s) < end)
718e3744 768 {
6d58272b
PJ
769 u_char opt_type;
770 u_char opt_length;
771
772 /* Must have at least an OPEN option header */
773 if (STREAM_READABLE(s) < 2)
718e3744 774 {
775 zlog_info ("%s Option length error", peer->host);
776 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
777 return -1;
778 }
779
780 /* Fetch option type and length. */
6d58272b
PJ
781 opt_type = stream_getc (s);
782 opt_length = stream_getc (s);
718e3744 783
784 /* Option length check. */
6d58272b 785 if (STREAM_READABLE (s) < opt_length)
718e3744 786 {
787 zlog_info ("%s Option length error", peer->host);
788 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
789 return -1;
790 }
791
16286195 792 if (bgp_debug_neighbor_events(peer))
8325cd7f 793 zlog_debug ("%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
718e3744 794 peer->host, opt_type,
795 opt_type == BGP_OPEN_OPT_AUTH ? "Authentication" :
796 opt_type == BGP_OPEN_OPT_CAP ? "Capability" : "Unknown",
797 opt_length);
798
799 switch (opt_type)
800 {
801 case BGP_OPEN_OPT_AUTH:
6d58272b 802 ret = bgp_auth_parse (peer, opt_length);
718e3744 803 break;
804 case BGP_OPEN_OPT_CAP:
3b381c32 805 ret = bgp_capability_parse (peer, opt_length, mp_capability, &error);
718e3744 806 break;
807 default:
808 bgp_notify_send (peer,
809 BGP_NOTIFY_OPEN_ERR,
810 BGP_NOTIFY_OPEN_UNSUP_PARAM);
811 ret = -1;
812 break;
813 }
814
815 /* Parse error. To accumulate all unsupported capability codes,
816 bgp_capability_parse does not return -1 when encounter
817 unsupported capability code. To detect that, please check
818 error and erro_data pointer, like below. */
819 if (ret < 0)
820 return -1;
718e3744 821 }
822
823 /* All OPEN option is parsed. Check capability when strict compare
824 flag is enabled.*/
825 if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
826 {
827 /* If Unsupported Capability exists. */
828 if (error != error_data)
829 {
830 bgp_notify_send_with_data (peer,
831 BGP_NOTIFY_OPEN_ERR,
832 BGP_NOTIFY_OPEN_UNSUP_CAPBL,
833 error_data, error - error_data);
834 return -1;
835 }
836
837 /* Check local capability does not negotiated with remote
838 peer. */
839 if (! strict_capability_same (peer))
840 {
841 bgp_notify_send (peer,
842 BGP_NOTIFY_OPEN_ERR,
843 BGP_NOTIFY_OPEN_UNSUP_CAPBL);
844 return -1;
845 }
846 }
847
3b381c32 848 /* Check there are no common AFI/SAFIs and send Unsupported Capability
718e3744 849 error. */
3b381c32
AS
850 if (*mp_capability &&
851 ! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
718e3744 852 {
853 if (! peer->afc_nego[AFI_IP][SAFI_UNICAST]
854 && ! peer->afc_nego[AFI_IP][SAFI_MULTICAST]
855 && ! peer->afc_nego[AFI_IP][SAFI_MPLS_VPN]
856 && ! peer->afc_nego[AFI_IP6][SAFI_UNICAST]
857 && ! peer->afc_nego[AFI_IP6][SAFI_MULTICAST])
858 {
16286195 859 zlog_err ("%s [Error] Configured AFI/SAFIs do not "
3b381c32
AS
860 "overlap with received MP capabilities",
861 peer->host);
718e3744 862
863 if (error != error_data)
718e3744 864 bgp_notify_send_with_data (peer,
865 BGP_NOTIFY_OPEN_ERR,
866 BGP_NOTIFY_OPEN_UNSUP_CAPBL,
867 error_data, error - error_data);
868 else
869 bgp_notify_send (peer,
870 BGP_NOTIFY_OPEN_ERR,
871 BGP_NOTIFY_OPEN_UNSUP_CAPBL);
872 return -1;
873 }
874 }
875 return 0;
876}
877
94f2b392 878static void
718e3744 879bgp_open_capability_orf (struct stream *s, struct peer *peer,
880 afi_t afi, safi_t safi, u_char code)
881{
882 u_char cap_len;
883 u_char orf_len;
884 unsigned long capp;
885 unsigned long orfp;
886 unsigned long numberp;
887 int number_of_orfs = 0;
888
889 if (safi == SAFI_MPLS_VPN)
42e6d745 890 safi = SAFI_MPLS_LABELED_VPN;
718e3744 891
892 stream_putc (s, BGP_OPEN_OPT_CAP);
9985f83c 893 capp = stream_get_endp (s); /* Set Capability Len Pointer */
718e3744 894 stream_putc (s, 0); /* Capability Length */
895 stream_putc (s, code); /* Capability Code */
9985f83c 896 orfp = stream_get_endp (s); /* Set ORF Len Pointer */
718e3744 897 stream_putc (s, 0); /* ORF Length */
898 stream_putw (s, afi);
899 stream_putc (s, 0);
900 stream_putc (s, safi);
9985f83c 901 numberp = stream_get_endp (s); /* Set Number Pointer */
718e3744 902 stream_putc (s, 0); /* Number of ORFs */
903
904 /* Address Prefix ORF */
905 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
906 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
907 {
908 stream_putc (s, (code == CAPABILITY_CODE_ORF ?
909 ORF_TYPE_PREFIX : ORF_TYPE_PREFIX_OLD));
910
911 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
912 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
913 {
914 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
915 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
916 stream_putc (s, ORF_MODE_BOTH);
917 }
918 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM))
919 {
920 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
921 stream_putc (s, ORF_MODE_SEND);
922 }
923 else
924 {
925 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
926 stream_putc (s, ORF_MODE_RECEIVE);
927 }
928 number_of_orfs++;
929 }
930
931 /* Total Number of ORFs. */
932 stream_putc_at (s, numberp, number_of_orfs);
933
934 /* Total ORF Len. */
9985f83c 935 orf_len = stream_get_endp (s) - orfp - 1;
718e3744 936 stream_putc_at (s, orfp, orf_len);
937
938 /* Total Capability Len. */
9985f83c 939 cap_len = stream_get_endp (s) - capp - 1;
718e3744 940 stream_putc_at (s, capp, cap_len);
941}
942
943/* Fill in capability open option to the packet. */
944void
945bgp_open_capability (struct stream *s, struct peer *peer)
946{
947 u_char len;
fe7d2a48 948 unsigned long cp, capp, rcapp;
718e3744 949 afi_t afi;
950 safi_t safi;
0b2aa3a0 951 as_t local_as;
fe7d2a48 952 u_int32_t restart_time;
a82478b9 953 u_char afi_safi_count = 0;
718e3744 954
955 /* Remember current pointer for Opt Parm Len. */
9985f83c 956 cp = stream_get_endp (s);
718e3744 957
958 /* Opt Parm Len. */
959 stream_putc (s, 0);
960
961 /* Do not send capability. */
962 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN)
963 || CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
964 return;
965
718e3744 966 /* IPv4 unicast. */
967 if (peer->afc[AFI_IP][SAFI_UNICAST])
968 {
969 peer->afc_adv[AFI_IP][SAFI_UNICAST] = 1;
970 stream_putc (s, BGP_OPEN_OPT_CAP);
971 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
972 stream_putc (s, CAPABILITY_CODE_MP);
973 stream_putc (s, CAPABILITY_CODE_MP_LEN);
974 stream_putw (s, AFI_IP);
975 stream_putc (s, 0);
976 stream_putc (s, SAFI_UNICAST);
977 }
978 /* IPv4 multicast. */
979 if (peer->afc[AFI_IP][SAFI_MULTICAST])
980 {
981 peer->afc_adv[AFI_IP][SAFI_MULTICAST] = 1;
982 stream_putc (s, BGP_OPEN_OPT_CAP);
983 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
984 stream_putc (s, CAPABILITY_CODE_MP);
985 stream_putc (s, CAPABILITY_CODE_MP_LEN);
986 stream_putw (s, AFI_IP);
987 stream_putc (s, 0);
988 stream_putc (s, SAFI_MULTICAST);
989 }
990 /* IPv4 VPN */
991 if (peer->afc[AFI_IP][SAFI_MPLS_VPN])
992 {
993 peer->afc_adv[AFI_IP][SAFI_MPLS_VPN] = 1;
994 stream_putc (s, BGP_OPEN_OPT_CAP);
995 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
996 stream_putc (s, CAPABILITY_CODE_MP);
997 stream_putc (s, CAPABILITY_CODE_MP_LEN);
998 stream_putw (s, AFI_IP);
999 stream_putc (s, 0);
42e6d745 1000 stream_putc (s, SAFI_MPLS_LABELED_VPN);
718e3744 1001 }
1002#ifdef HAVE_IPV6
1003 /* IPv6 unicast. */
1004 if (peer->afc[AFI_IP6][SAFI_UNICAST])
1005 {
1006 peer->afc_adv[AFI_IP6][SAFI_UNICAST] = 1;
1007 stream_putc (s, BGP_OPEN_OPT_CAP);
1008 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1009 stream_putc (s, CAPABILITY_CODE_MP);
1010 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1011 stream_putw (s, AFI_IP6);
1012 stream_putc (s, 0);
1013 stream_putc (s, SAFI_UNICAST);
1014 }
1015 /* IPv6 multicast. */
1016 if (peer->afc[AFI_IP6][SAFI_MULTICAST])
1017 {
1018 peer->afc_adv[AFI_IP6][SAFI_MULTICAST] = 1;
1019 stream_putc (s, BGP_OPEN_OPT_CAP);
1020 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1021 stream_putc (s, CAPABILITY_CODE_MP);
1022 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1023 stream_putw (s, AFI_IP6);
1024 stream_putc (s, 0);
1025 stream_putc (s, SAFI_MULTICAST);
1026 }
1027#endif /* HAVE_IPV6 */
1028
1029 /* Route refresh. */
c9502438 1030 SET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV);
1031 stream_putc (s, BGP_OPEN_OPT_CAP);
1032 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
1033 stream_putc (s, CAPABILITY_CODE_REFRESH_OLD);
1034 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
1035 stream_putc (s, BGP_OPEN_OPT_CAP);
1036 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
1037 stream_putc (s, CAPABILITY_CODE_REFRESH);
1038 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
718e3744 1039
0b2aa3a0
PJ
1040 /* AS4 */
1041 SET_FLAG (peer->cap, PEER_CAP_AS4_ADV);
1042 stream_putc (s, BGP_OPEN_OPT_CAP);
1043 stream_putc (s, CAPABILITY_CODE_AS4_LEN + 2);
1044 stream_putc (s, CAPABILITY_CODE_AS4);
1045 stream_putc (s, CAPABILITY_CODE_AS4_LEN);
1046 if ( peer->change_local_as )
1047 local_as = peer->change_local_as;
1048 else
1049 local_as = peer->local_as;
1050 stream_putl (s, local_as );
1051
a82478b9
DS
1052 /* AddPath
1053 * For now we will only advertise RX support. TX support will be added later.
1054 */
1055 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1056 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1057 if (peer->afc[afi][safi])
1058 afi_safi_count++;
1059
1060 SET_FLAG (peer->cap, PEER_CAP_ADDPATH_ADV);
1061 stream_putc (s, BGP_OPEN_OPT_CAP);
1062 stream_putc (s, (CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count) + 2);
1063 stream_putc (s, CAPABILITY_CODE_ADDPATH);
1064 stream_putc (s, CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count);
1065
1066 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1067 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1068 if (peer->afc[afi][safi])
1069 {
1070 stream_putw (s, afi);
1071 stream_putc (s, safi);
1072 stream_putc (s, BGP_ADDPATH_RX);
1073 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV);
1074 }
1075
718e3744 1076 /* ORF capability. */
1077 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1078 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1079 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
1080 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
1081 {
1082 bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF_OLD);
1083 bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF);
1084 }
1085
1086 /* Dynamic capability. */
1087 if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
1088 {
1089 SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV);
1090 stream_putc (s, BGP_OPEN_OPT_CAP);
1091 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN + 2);
89eeecb8
DS
1092 stream_putc (s, CAPABILITY_CODE_DYNAMIC_OLD);
1093 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN);
1094 stream_putc (s, BGP_OPEN_OPT_CAP);
1095 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN + 2);
718e3744 1096 stream_putc (s, CAPABILITY_CODE_DYNAMIC);
1097 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN);
1098 }
1099
fe7d2a48
DS
1100 /* Sending base graceful-restart capability irrespective of the config */
1101 SET_FLAG (peer->cap, PEER_CAP_RESTART_ADV);
1102 stream_putc (s, BGP_OPEN_OPT_CAP);
1103 capp = stream_get_endp (s); /* Set Capability Len Pointer */
1104 stream_putc (s, 0); /* Capability Length */
1105 stream_putc (s, CAPABILITY_CODE_RESTART);
1106 rcapp = stream_get_endp (s); /* Set Restart Capability Len Pointer */
1107 stream_putc (s, 0);
1108 restart_time = peer->bgp->restart_time;
1109 if (peer->bgp->t_startup)
1110 {
1111 SET_FLAG (restart_time, RESTART_R_BIT);
1112 SET_FLAG (peer->cap, PEER_CAP_RESTART_BIT_ADV);
1113 }
1114 stream_putw (s, restart_time);
1115
1116 /* Send address-family specific graceful-restart capability only when GR config
1117 is present */
538621f2 1118 if (bgp_flag_check (peer->bgp, BGP_FLAG_GRACEFUL_RESTART))
1119 {
fe7d2a48
DS
1120 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1121 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1122 if (peer->afc[afi][safi])
1123 {
1124 stream_putw (s, afi);
1125 stream_putc (s, safi);
1126 stream_putc (s, 0); //Forwarding is not retained as of now.
1127 }
1128 }
1129
1130 /* Total Graceful restart capability Len. */
1131 len = stream_get_endp (s) - rcapp - 1;
1132 stream_putc_at (s, rcapp, len);
1133
1134 /* Total Capability Len. */
1135 len = stream_get_endp (s) - capp - 1;
1136 stream_putc_at (s, capp, len);
538621f2 1137
718e3744 1138 /* Total Opt Parm Len. */
9985f83c 1139 len = stream_get_endp (s) - cp - 1;
718e3744 1140 stream_putc_at (s, cp, len);
1141}