]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_open.c
bgpd: Clean up some static analysis warnings
[mirror_frr.git] / bgpd / bgp_open.c
1 /* BGP open message handling
2 Copyright (C) 1998, 1999 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
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"
29 #include "memory.h"
30 #include "queue.h"
31
32 #include "lib/json.h"
33 #include "bgpd/bgpd.h"
34 #include "bgpd/bgp_attr.h"
35 #include "bgpd/bgp_debug.h"
36 #include "bgpd/bgp_fsm.h"
37 #include "bgpd/bgp_packet.h"
38 #include "bgpd/bgp_open.h"
39 #include "bgpd/bgp_aspath.h"
40 #include "bgpd/bgp_vty.h"
41
42 /* BGP-4 Multiprotocol Extentions lead us to the complex world. We can
43 negotiate remote peer supports extentions or not. But if
44 remote-peer doesn't supports negotiation process itself. We would
45 like to do manual configuration.
46
47 So there is many configurable point. First of all we want set each
48 peer whether we send capability negotiation to the peer or not.
49 Next, if we send capability to the peer we want to set my capabilty
50 inforation at each peer. */
51
52 void
53 bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, json_object *json_neigh)
54 {
55 char *pnt;
56 char *end;
57 struct capability_mp_data mpc;
58 struct capability_header *hdr;
59 json_object *json_cap = NULL;
60
61 if (use_json)
62 json_cap = json_object_new_object();
63
64 pnt = peer->notify.data;
65 end = pnt + peer->notify.length;
66
67 while (pnt < end)
68 {
69 if (pnt + sizeof (struct capability_mp_data) + 2 > end)
70 return;
71
72 hdr = (struct capability_header *)pnt;
73 if (pnt + hdr->length + 2 > end)
74 return;
75
76 memcpy (&mpc, pnt + 2, sizeof(struct capability_mp_data));
77
78 if (hdr->code == CAPABILITY_CODE_MP)
79 {
80 if (use_json)
81 {
82 switch (ntohs (mpc.afi))
83 {
84 case AFI_IP:
85 json_object_string_add(json_cap, "capabilityErrorMultiProtocolAfi", "IPv4");
86 break;
87 case AFI_IP6:
88 json_object_string_add(json_cap, "capabilityErrorMultiProtocolAfi", "IPv6");
89 break;
90 default:
91 json_object_int_add(json_cap, "capabilityErrorMultiProtocolAfiUnknown", ntohs (mpc.afi));
92 break;
93 }
94 switch (mpc.safi)
95 {
96 case SAFI_UNICAST:
97 json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "unicast");
98 break;
99 case SAFI_MULTICAST:
100 json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "multicast");
101 break;
102 case SAFI_MPLS_LABELED_VPN:
103 json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "MPLS-labeled VPN");
104 break;
105 default:
106 json_object_int_add(json_cap, "capabilityErrorMultiProtocolSafiUnknown", mpc.safi);
107 break;
108 }
109 }
110 else
111 {
112 vty_out (vty, " Capability error for: Multi protocol ");
113 switch (ntohs (mpc.afi))
114 {
115 case AFI_IP:
116 vty_out (vty, "AFI IPv4, ");
117 break;
118 case AFI_IP6:
119 vty_out (vty, "AFI IPv6, ");
120 break;
121 default:
122 vty_out (vty, "AFI Unknown %d, ", ntohs (mpc.afi));
123 break;
124 }
125 switch (mpc.safi)
126 {
127 case SAFI_UNICAST:
128 vty_out (vty, "SAFI Unicast");
129 break;
130 case SAFI_MULTICAST:
131 vty_out (vty, "SAFI Multicast");
132 break;
133 case SAFI_MPLS_LABELED_VPN:
134 vty_out (vty, "SAFI MPLS-labeled VPN");
135 break;
136 default:
137 vty_out (vty, "SAFI Unknown %d ", mpc.safi);
138 break;
139 }
140 vty_out (vty, "%s", VTY_NEWLINE);
141 }
142 }
143 else if (hdr->code >= 128)
144 {
145 if (use_json)
146 json_object_int_add(json_cap, "capabilityErrorVendorSpecificCapabilityCode", hdr->code);
147 else
148 vty_out (vty, " Capability error: vendor specific capability code %d",
149 hdr->code);
150 }
151 else
152 {
153 if (use_json)
154 json_object_int_add(json_cap, "capabilityErrorUnknownCapabilityCode", hdr->code);
155 else
156 vty_out (vty, " Capability error: unknown capability code %d",
157 hdr->code);
158 }
159 pnt += hdr->length + 2;
160 }
161 if (use_json)
162 json_object_object_add(json_neigh, "capabilityErrors", json_cap);
163 }
164
165 static void
166 bgp_capability_mp_data (struct stream *s, struct capability_mp_data *mpc)
167 {
168 mpc->afi = stream_getw (s);
169 mpc->reserved = stream_getc (s);
170 mpc->safi = stream_getc (s);
171 }
172
173 int
174 bgp_afi_safi_valid_indices (afi_t afi, safi_t *safi)
175 {
176 switch (afi)
177 {
178 case AFI_IP:
179 #ifdef HAVE_IPV6
180 case AFI_IP6:
181 #endif
182 switch (*safi)
183 {
184 /* BGP MPLS-labeled VPN SAFI isn't contigious with others, remap */
185 case SAFI_MPLS_LABELED_VPN:
186 *safi = SAFI_MPLS_VPN;
187 case SAFI_UNICAST:
188 case SAFI_MULTICAST:
189 case SAFI_MPLS_VPN:
190 return 1;
191 }
192 }
193 zlog_debug ("unknown afi/safi (%u/%u)", afi, *safi);
194
195 return 0;
196 }
197
198 /* Set negotiated capability value. */
199 static int
200 bgp_capability_mp (struct peer *peer, struct capability_header *hdr)
201 {
202 struct capability_mp_data mpc;
203 struct stream *s = BGP_INPUT (peer);
204
205 /* Verify length is 4 */
206 if (hdr->length != 4)
207 {
208 zlog_warn("MP Cap: Received invalid length %d, non-multiple of 4",
209 hdr->length);
210 return -1;
211 }
212
213 bgp_capability_mp_data (s, &mpc);
214
215 if (bgp_debug_neighbor_events(peer))
216 zlog_debug ("%s OPEN has MP_EXT CAP for afi/safi: %u/%u",
217 peer->host, mpc.afi, mpc.safi);
218
219 if (!bgp_afi_safi_valid_indices (mpc.afi, &mpc.safi))
220 return -1;
221
222 /* Now safi remapped, and afi/safi are valid array indices */
223 peer->afc_recv[mpc.afi][mpc.safi] = 1;
224
225 if (peer->afc[mpc.afi][mpc.safi])
226 peer->afc_nego[mpc.afi][mpc.safi] = 1;
227 else
228 return -1;
229
230 return 0;
231 }
232
233 static void
234 bgp_capability_orf_not_support (struct peer *peer, afi_t afi, safi_t safi,
235 u_char type, u_char mode)
236 {
237 if (bgp_debug_neighbor_events(peer))
238 zlog_debug ("%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
239 peer->host, afi, safi, type, mode);
240 }
241
242 static const struct message orf_type_str[] =
243 {
244 { ORF_TYPE_PREFIX, "Prefixlist" },
245 { ORF_TYPE_PREFIX_OLD, "Prefixlist (old)" },
246 };
247 static const int orf_type_str_max = array_size(orf_type_str);
248
249 static const struct message orf_mode_str[] =
250 {
251 { ORF_MODE_RECEIVE, "Receive" },
252 { ORF_MODE_SEND, "Send" },
253 { ORF_MODE_BOTH, "Both" },
254 };
255 static const int orf_mode_str_max = array_size(orf_mode_str);
256
257 static int
258 bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr)
259 {
260 struct stream *s = BGP_INPUT (peer);
261 struct capability_orf_entry entry;
262 afi_t afi;
263 safi_t safi;
264 u_char type;
265 u_char mode;
266 u_int16_t sm_cap = 0; /* capability send-mode receive */
267 u_int16_t rm_cap = 0; /* capability receive-mode receive */
268 int i;
269
270 /* ORF Entry header */
271 bgp_capability_mp_data (s, &entry.mpc);
272 entry.num = stream_getc (s);
273 afi = entry.mpc.afi;
274 safi = entry.mpc.safi;
275
276 if (bgp_debug_neighbor_events(peer))
277 zlog_debug ("%s ORF Cap entry for afi/safi: %u/%u",
278 peer->host, entry.mpc.afi, entry.mpc.safi);
279
280 /* Check AFI and SAFI. */
281 if (!bgp_afi_safi_valid_indices (entry.mpc.afi, &safi))
282 {
283 zlog_info ("%s Addr-family %d/%d not supported."
284 " Ignoring the ORF capability",
285 peer->host, entry.mpc.afi, entry.mpc.safi);
286 return 0;
287 }
288
289 /* validate number field */
290 if (sizeof (struct capability_orf_entry) + (entry.num * 2) > hdr->length)
291 {
292 zlog_info ("%s ORF Capability entry length error,"
293 " Cap length %u, num %u",
294 peer->host, hdr->length, entry.num);
295 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
296 return -1;
297 }
298
299 for (i = 0 ; i < entry.num ; i++)
300 {
301 type = stream_getc(s);
302 mode = stream_getc(s);
303
304 /* ORF Mode error check */
305 switch (mode)
306 {
307 case ORF_MODE_BOTH:
308 case ORF_MODE_SEND:
309 case ORF_MODE_RECEIVE:
310 break;
311 default:
312 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
313 continue;
314 }
315 /* ORF Type and afi/safi error checks */
316 /* capcode versus type */
317 switch (hdr->code)
318 {
319 case CAPABILITY_CODE_ORF:
320 switch (type)
321 {
322 case ORF_TYPE_PREFIX:
323 break;
324 default:
325 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
326 continue;
327 }
328 break;
329 case CAPABILITY_CODE_ORF_OLD:
330 switch (type)
331 {
332 case ORF_TYPE_PREFIX_OLD:
333 break;
334 default:
335 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
336 continue;
337 }
338 break;
339 default:
340 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
341 continue;
342 }
343
344 /* AFI vs SAFI */
345 if (!((afi == AFI_IP && safi == SAFI_UNICAST)
346 || (afi == AFI_IP && safi == SAFI_MULTICAST)
347 || (afi == AFI_IP6 && safi == SAFI_UNICAST)))
348 {
349 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
350 continue;
351 }
352
353 if (bgp_debug_neighbor_events(peer))
354 zlog_debug ("%s OPEN has %s ORF capability"
355 " as %s for afi/safi: %d/%d",
356 peer->host, LOOKUP (orf_type_str, type),
357 LOOKUP (orf_mode_str, mode),
358 entry.mpc.afi, safi);
359
360 if (hdr->code == CAPABILITY_CODE_ORF)
361 {
362 sm_cap = PEER_CAP_ORF_PREFIX_SM_RCV;
363 rm_cap = PEER_CAP_ORF_PREFIX_RM_RCV;
364 }
365 else if (hdr->code == CAPABILITY_CODE_ORF_OLD)
366 {
367 sm_cap = PEER_CAP_ORF_PREFIX_SM_OLD_RCV;
368 rm_cap = PEER_CAP_ORF_PREFIX_RM_OLD_RCV;
369 }
370 else
371 {
372 bgp_capability_orf_not_support (peer, afi, safi, type, mode);
373 continue;
374 }
375
376 switch (mode)
377 {
378 case ORF_MODE_BOTH:
379 SET_FLAG (peer->af_cap[afi][safi], sm_cap);
380 SET_FLAG (peer->af_cap[afi][safi], rm_cap);
381 break;
382 case ORF_MODE_SEND:
383 SET_FLAG (peer->af_cap[afi][safi], sm_cap);
384 break;
385 case ORF_MODE_RECEIVE:
386 SET_FLAG (peer->af_cap[afi][safi], rm_cap);
387 break;
388 }
389 }
390 return 0;
391 }
392
393 static int
394 bgp_capability_restart (struct peer *peer, struct capability_header *caphdr)
395 {
396 struct stream *s = BGP_INPUT (peer);
397 u_int16_t restart_flag_time;
398 int restart_bit = 0;
399 size_t end = stream_get_getp (s) + caphdr->length;
400
401 /* Verify length is a multiple of 4 */
402 if ((caphdr->length-2) % 4)
403 {
404 zlog_warn("Restart Cap: Received invalid length %d, non-multiple of 4",
405 caphdr->length);
406 return -1;
407 }
408
409 SET_FLAG (peer->cap, PEER_CAP_RESTART_RCV);
410 restart_flag_time = stream_getw(s);
411 if (CHECK_FLAG (restart_flag_time, RESTART_R_BIT))
412 {
413 SET_FLAG (peer->cap, PEER_CAP_RESTART_BIT_RCV);
414 restart_bit = 1;
415 }
416 UNSET_FLAG (restart_flag_time, 0xF000);
417 peer->v_gr_restart = restart_flag_time;
418
419 if (bgp_debug_neighbor_events(peer))
420 {
421 zlog_debug ("%s OPEN has Graceful Restart capability", peer->host);
422 zlog_debug ("%s Peer has%srestarted. Restart Time : %d",
423 peer->host, restart_bit ? " " : " not ",
424 peer->v_gr_restart);
425 }
426
427 while (stream_get_getp (s) + 4 <= end)
428 {
429 afi_t afi = stream_getw (s);
430 safi_t safi = stream_getc (s);
431 u_char flag = stream_getc (s);
432
433 if (!bgp_afi_safi_valid_indices (afi, &safi))
434 {
435 if (bgp_debug_neighbor_events(peer))
436 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported."
437 " Ignore the Graceful Restart capability for this AFI/SAFI",
438 peer->host, afi, safi);
439 }
440 else if (!peer->afc[afi][safi])
441 {
442 if (bgp_debug_neighbor_events(peer))
443 zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled."
444 " Ignore the Graceful Restart capability",
445 peer->host, afi, safi);
446 }
447 else
448 {
449 if (bgp_debug_neighbor_events(peer))
450 zlog_debug ("%s Address family %s is%spreserved", peer->host,
451 afi_safi_print (afi, safi),
452 CHECK_FLAG (peer->af_cap[afi][safi],
453 PEER_CAP_RESTART_AF_PRESERVE_RCV)
454 ? " " : " not ");
455
456 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV);
457 if (CHECK_FLAG (flag, RESTART_F_BIT))
458 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV);
459
460 }
461 }
462 return 0;
463 }
464
465 /* Unlike other capability parsing routines, this one returns 0 on error */
466 static as_t
467 bgp_capability_as4 (struct peer *peer, struct capability_header *hdr)
468 {
469 SET_FLAG (peer->cap, PEER_CAP_AS4_RCV);
470
471 if (hdr->length != CAPABILITY_CODE_AS4_LEN)
472 {
473 zlog_err ("%s AS4 capability has incorrect data length %d",
474 peer->host, hdr->length);
475 return 0;
476 }
477
478 as_t as4 = stream_getl (BGP_INPUT(peer));
479
480 if (BGP_DEBUG (as4, AS4))
481 zlog_debug ("%s [AS4] about to set cap PEER_CAP_AS4_RCV, got as4 %u",
482 peer->host, as4);
483 return as4;
484 }
485
486 static int
487 bgp_capability_addpath (struct peer *peer, struct capability_header *hdr)
488 {
489 struct stream *s = BGP_INPUT (peer);
490 size_t end = stream_get_getp (s) + hdr->length;
491
492 SET_FLAG (peer->cap, PEER_CAP_ADDPATH_RCV);
493
494 /* Verify length is a multiple of 4 */
495 if (hdr->length % 4)
496 {
497 zlog_warn("Add Path: Received invalid length %d, non-multiple of 4",
498 hdr->length);
499 return -1;
500 }
501
502 while (stream_get_getp (s) + 4 <= end)
503 {
504 afi_t afi = stream_getw (s);
505 safi_t safi = stream_getc (s);
506 u_char send_receive = stream_getc (s);
507
508 if (bgp_debug_neighbor_events(peer))
509 zlog_debug ("%s OPEN has AddPath CAP for afi/safi: %u/%u%s%s",
510 peer->host, afi, safi,
511 (send_receive & BGP_ADDPATH_RX) ? ", receive" : "",
512 (send_receive & BGP_ADDPATH_TX) ? ", transmit" : "");
513
514 if (!bgp_afi_safi_valid_indices (afi, &safi))
515 {
516 if (bgp_debug_neighbor_events(peer))
517 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported."
518 " Ignore the Addpath Attribute for this AFI/SAFI",
519 peer->host, afi, safi);
520 continue;
521 }
522 else if (!peer->afc[afi][safi])
523 {
524 if (bgp_debug_neighbor_events(peer))
525 zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled."
526 " Ignore the AddPath capability for this AFI/SAFI",
527 peer->host, afi, safi);
528 continue;
529 }
530
531 if (send_receive & BGP_ADDPATH_RX)
532 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV);
533
534 if (send_receive & BGP_ADDPATH_TX)
535 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV);
536 }
537
538 return 0;
539 }
540
541 static int
542 bgp_capability_enhe (struct peer *peer, struct capability_header *hdr)
543 {
544 struct stream *s = BGP_INPUT (peer);
545 size_t end = stream_get_getp (s) + hdr->length;
546
547 /* Verify length is a multiple of 4 */
548 if (hdr->length % 6)
549 {
550 zlog_warn("Extended NH: Received invalid length %d, non-multiple of 6",
551 hdr->length);
552 return -1;
553 }
554
555 while (stream_get_getp (s) + 6 <= end)
556 {
557 afi_t afi = stream_getw (s);
558 safi_t safi = stream_getw (s);
559 afi_t nh_afi = stream_getw (s);
560
561 if (bgp_debug_neighbor_events(peer))
562 zlog_debug ("%s Received with afi/safi/next-hop afi: %u/%u/%u",
563 peer->host, afi, safi, nh_afi);
564
565 if (!bgp_afi_safi_valid_indices (afi, &safi))
566 {
567 if (bgp_debug_neighbor_events(peer))
568 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported."
569 " Ignore the ENHE Attribute for this AFI/SAFI",
570 peer->host, afi, safi);
571 continue;
572 }
573
574 /* RFC 5549 specifies use of this capability only for IPv4 AFI, with
575 * the Nexthop AFI being IPv6. A future spec may introduce other
576 * possibilities, so we ignore other values with a log. Also, only
577 * Unicast SAFI is currently supported (and expected).
578 */
579 if (afi != AFI_IP || safi != SAFI_UNICAST || nh_afi != AFI_IP6)
580 {
581 zlog_warn ("%s Unexpected afi/safi/next-hop afi: %u/%u/%u "
582 "in Extended Next-hop capability, ignoring",
583 peer->host, afi, safi, nh_afi);
584 continue;
585 }
586
587 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ENHE_AF_RCV);
588
589 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ENHE_AF_ADV))
590 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ENHE_AF_NEGO);
591 }
592
593 SET_FLAG (peer->cap, PEER_CAP_ENHE_RCV);
594
595 return 0;
596 }
597
598 static int
599 bgp_capability_hostname (struct peer *peer, struct capability_header *hdr)
600 {
601 struct stream *s = BGP_INPUT (peer);
602 char str[BGP_MAX_HOSTNAME+1];
603 size_t end = stream_get_getp (s) + hdr->length;
604 u_char len;
605
606 SET_FLAG(peer->cap, PEER_CAP_HOSTNAME_RCV);
607
608 len = stream_getc(s);
609 if (stream_get_getp(s) + len > end)
610 {
611 zlog_warn("%s: Received malformed hostname capability from peer %s",
612 __FUNCTION__, peer->host);
613 return -1;
614 }
615
616 if (len > BGP_MAX_HOSTNAME)
617 {
618 stream_get(str, s, BGP_MAX_HOSTNAME);
619 stream_forward_getp(s, len-BGP_MAX_HOSTNAME);
620 len = BGP_MAX_HOSTNAME; /* to set the '\0' below */
621 }
622 else if (len)
623 stream_get(str, s, len);
624
625 if (len)
626 {
627 str[len] = '\0';
628
629 if (peer->hostname != NULL)
630 {
631 XFREE(MTYPE_HOST, peer->hostname);
632 peer->hostname = NULL;
633 }
634
635 if (peer->domainname != NULL)
636 {
637 XFREE(MTYPE_HOST, peer->domainname);
638 peer->domainname = NULL;
639 }
640
641 peer->hostname = XSTRDUP(MTYPE_HOST, str);
642 }
643
644 if (stream_get_getp(s) +1 > end)
645 {
646 zlog_warn("%s: Received invalid domain name len (hostname capability) from peer %s",
647 __FUNCTION__, peer->host);
648 return -1;
649 }
650
651 len = stream_getc(s);
652 if (stream_get_getp(s) + len > end)
653 {
654 zlog_warn("%s: Received runt domain name (hostname capability) from peer %s",
655 __FUNCTION__, peer->host);
656 return -1;
657 }
658
659 if (len > BGP_MAX_HOSTNAME)
660 {
661 stream_get(str, s, BGP_MAX_HOSTNAME);
662 stream_forward_getp(s, len-BGP_MAX_HOSTNAME);
663 len = BGP_MAX_HOSTNAME; /* to set the '\0' below */
664 }
665 else if (len)
666 stream_get(str, s, len);
667
668 if (len)
669 {
670 str[len] = '\0';
671 peer->domainname = XSTRDUP(MTYPE_HOST, str);
672 }
673
674 if (bgp_debug_neighbor_events(peer))
675 {
676 zlog_debug("%s received hostname %s, domainname %s",
677 peer->host, peer->hostname, peer->domainname);
678 }
679
680 return 0;
681 }
682
683 static const struct message capcode_str[] =
684 {
685 { CAPABILITY_CODE_MP, "MultiProtocol Extensions" },
686 { CAPABILITY_CODE_REFRESH, "Route Refresh" },
687 { CAPABILITY_CODE_ORF, "Cooperative Route Filtering" },
688 { CAPABILITY_CODE_RESTART, "Graceful Restart" },
689 { CAPABILITY_CODE_AS4, "4-octet AS number" },
690 { CAPABILITY_CODE_ADDPATH, "AddPath" },
691 { CAPABILITY_CODE_DYNAMIC, "Dynamic" },
692 { CAPABILITY_CODE_ENHE, "Extended Next Hop Encoding" },
693 { CAPABILITY_CODE_DYNAMIC_OLD, "Dynamic (Old)" },
694 { CAPABILITY_CODE_REFRESH_OLD, "Route Refresh (Old)" },
695 { CAPABILITY_CODE_ORF_OLD, "ORF (Old)" },
696 { CAPABILITY_CODE_FQDN, "FQDN" },
697 };
698 static const int capcode_str_max = array_size(capcode_str);
699
700 /* Minimum sizes for length field of each cap (so not inc. the header) */
701 static const size_t cap_minsizes[] =
702 {
703 [CAPABILITY_CODE_MP] = sizeof (struct capability_mp_data),
704 [CAPABILITY_CODE_REFRESH] = CAPABILITY_CODE_REFRESH_LEN,
705 [CAPABILITY_CODE_ORF] = sizeof (struct capability_orf_entry),
706 [CAPABILITY_CODE_RESTART] = sizeof (struct capability_gr),
707 [CAPABILITY_CODE_AS4] = CAPABILITY_CODE_AS4_LEN,
708 [CAPABILITY_CODE_ADDPATH] = CAPABILITY_CODE_ADDPATH_LEN,
709 [CAPABILITY_CODE_DYNAMIC] = CAPABILITY_CODE_DYNAMIC_LEN,
710 [CAPABILITY_CODE_DYNAMIC_OLD] = CAPABILITY_CODE_DYNAMIC_LEN,
711 [CAPABILITY_CODE_ENHE] = CAPABILITY_CODE_ENHE_LEN,
712 [CAPABILITY_CODE_REFRESH_OLD] = CAPABILITY_CODE_REFRESH_LEN,
713 [CAPABILITY_CODE_ORF_OLD] = sizeof (struct capability_orf_entry),
714 [CAPABILITY_CODE_FQDN] = CAPABILITY_CODE_MIN_FQDN_LEN,
715 };
716
717 /**
718 * Parse given capability.
719 * XXX: This is reading into a stream, but not using stream API
720 *
721 * @param[out] mp_capability Set to 1 on return iff one or more Multiprotocol
722 * capabilities were encountered.
723 */
724 static int
725 bgp_capability_parse (struct peer *peer, size_t length, int *mp_capability,
726 u_char **error)
727 {
728 int ret;
729 struct stream *s = BGP_INPUT (peer);
730 size_t end = stream_get_getp (s) + length;
731
732 assert (STREAM_READABLE (s) >= length);
733
734 while (stream_get_getp (s) < end)
735 {
736 size_t start;
737 u_char *sp = stream_pnt (s);
738 struct capability_header caphdr;
739
740 ret = 0;
741 /* We need at least capability code and capability length. */
742 if (stream_get_getp(s) + 2 > end)
743 {
744 zlog_info ("%s Capability length error (< header)", peer->host);
745 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
746 return -1;
747 }
748
749 caphdr.code = stream_getc (s);
750 caphdr.length = stream_getc (s);
751 start = stream_get_getp (s);
752
753 /* Capability length check sanity check. */
754 if (start + caphdr.length > end)
755 {
756 zlog_info ("%s Capability length error (< length)", peer->host);
757 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
758 return -1;
759 }
760
761 if (bgp_debug_neighbor_events(peer))
762 zlog_debug ("%s OPEN has %s capability (%u), length %u",
763 peer->host,
764 LOOKUP (capcode_str, caphdr.code),
765 caphdr.code, caphdr.length);
766
767 /* Length sanity check, type-specific, for known capabilities */
768 switch (caphdr.code)
769 {
770 case CAPABILITY_CODE_MP:
771 case CAPABILITY_CODE_REFRESH:
772 case CAPABILITY_CODE_REFRESH_OLD:
773 case CAPABILITY_CODE_ORF:
774 case CAPABILITY_CODE_ORF_OLD:
775 case CAPABILITY_CODE_RESTART:
776 case CAPABILITY_CODE_AS4:
777 case CAPABILITY_CODE_ADDPATH:
778 case CAPABILITY_CODE_DYNAMIC:
779 case CAPABILITY_CODE_DYNAMIC_OLD:
780 case CAPABILITY_CODE_ENHE:
781 case CAPABILITY_CODE_FQDN:
782 /* Check length. */
783 if (caphdr.length < cap_minsizes[caphdr.code])
784 {
785 zlog_info ("%s %s Capability length error: got %u,"
786 " expected at least %u",
787 peer->host,
788 LOOKUP (capcode_str, caphdr.code),
789 caphdr.length,
790 (unsigned) cap_minsizes[caphdr.code]);
791 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
792 return -1;
793 }
794 /* we deliberately ignore unknown codes, see below */
795 default:
796 break;
797 }
798
799 switch (caphdr.code)
800 {
801 case CAPABILITY_CODE_MP:
802 {
803 *mp_capability = 1;
804
805 /* Ignore capability when override-capability is set. */
806 if (! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
807 {
808 /* Set negotiated value. */
809 ret = bgp_capability_mp (peer, &caphdr);
810
811 /* Unsupported Capability. */
812 if (ret < 0)
813 {
814 /* Store return data. */
815 memcpy (*error, sp, caphdr.length + 2);
816 *error += caphdr.length + 2;
817 }
818 ret = 0; /* Don't return error for this */
819 }
820 }
821 break;
822 case CAPABILITY_CODE_REFRESH:
823 case CAPABILITY_CODE_REFRESH_OLD:
824 {
825 /* BGP refresh capability */
826 if (caphdr.code == CAPABILITY_CODE_REFRESH_OLD)
827 SET_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV);
828 else
829 SET_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV);
830 }
831 break;
832 case CAPABILITY_CODE_ORF:
833 case CAPABILITY_CODE_ORF_OLD:
834 ret = bgp_capability_orf_entry (peer, &caphdr);
835 break;
836 case CAPABILITY_CODE_RESTART:
837 ret = bgp_capability_restart (peer, &caphdr);
838 break;
839 case CAPABILITY_CODE_DYNAMIC:
840 case CAPABILITY_CODE_DYNAMIC_OLD:
841 SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV);
842 break;
843 case CAPABILITY_CODE_AS4:
844 /* Already handled as a special-case parsing of the capabilities
845 * at the beginning of OPEN processing. So we care not a jot
846 * for the value really, only error case.
847 */
848 if (!bgp_capability_as4 (peer, &caphdr))
849 ret = -1;
850 break;
851 case CAPABILITY_CODE_ADDPATH:
852 ret = bgp_capability_addpath (peer, &caphdr);
853 break;
854 case CAPABILITY_CODE_ENHE:
855 ret = bgp_capability_enhe (peer, &caphdr);
856 break;
857 case CAPABILITY_CODE_FQDN:
858 ret = bgp_capability_hostname (peer, &caphdr);
859 break;
860 default:
861 if (caphdr.code > 128)
862 {
863 /* We don't send Notification for unknown vendor specific
864 capabilities. It seems reasonable for now... */
865 zlog_warn ("%s Vendor specific capability %d",
866 peer->host, caphdr.code);
867 }
868 else
869 {
870 zlog_warn ("%s unrecognized capability code: %d - ignored",
871 peer->host, caphdr.code);
872 memcpy (*error, sp, caphdr.length + 2);
873 *error += caphdr.length + 2;
874 }
875 }
876
877 if (ret < 0)
878 {
879 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
880 return -1;
881 }
882 if (stream_get_getp(s) != (start + caphdr.length))
883 {
884 if (stream_get_getp(s) > (start + caphdr.length))
885 zlog_warn ("%s Cap-parser for %s read past cap-length, %u!",
886 peer->host, LOOKUP (capcode_str, caphdr.code),
887 caphdr.length);
888 stream_set_getp (s, start + caphdr.length);
889 }
890 }
891 return 0;
892 }
893
894 static int
895 bgp_auth_parse (struct peer *peer, size_t length)
896 {
897 bgp_notify_send (peer,
898 BGP_NOTIFY_OPEN_ERR,
899 BGP_NOTIFY_OPEN_AUTH_FAILURE);
900 return -1;
901 }
902
903 static int
904 strict_capability_same (struct peer *peer)
905 {
906 int i, j;
907
908 for (i = AFI_IP; i < AFI_MAX; i++)
909 for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
910 if (peer->afc[i][j] != peer->afc_nego[i][j])
911 return 0;
912 return 1;
913 }
914
915 /* peek into option, stores ASN to *as4 if the AS4 capability was found.
916 * Returns 0 if no as4 found, as4cap value otherwise.
917 */
918 as_t
919 peek_for_as4_capability (struct peer *peer, u_char length)
920 {
921 struct stream *s = BGP_INPUT (peer);
922 size_t orig_getp = stream_get_getp (s);
923 size_t end = orig_getp + length;
924 as_t as4 = 0;
925
926 if (BGP_DEBUG (as4, AS4))
927 zlog_info ("%s [AS4] rcv OPEN w/ OPTION parameter len: %u,"
928 " peeking for as4",
929 peer->host, length);
930 /* the error cases we DONT handle, we ONLY try to read as4 out of
931 * correctly formatted options.
932 */
933 while (stream_get_getp(s) < end)
934 {
935 u_char opt_type;
936 u_char opt_length;
937
938 /* Check the length. */
939 if (stream_get_getp (s) + 2 > end)
940 goto end;
941
942 /* Fetch option type and length. */
943 opt_type = stream_getc (s);
944 opt_length = stream_getc (s);
945
946 /* Option length check. */
947 if (stream_get_getp (s) + opt_length > end)
948 goto end;
949
950 if (opt_type == BGP_OPEN_OPT_CAP)
951 {
952 unsigned long capd_start = stream_get_getp (s);
953 unsigned long capd_end = capd_start + opt_length;
954
955 assert (capd_end <= end);
956
957 while (stream_get_getp (s) < capd_end)
958 {
959 struct capability_header hdr;
960
961 if (stream_get_getp (s) + 2 > capd_end)
962 goto end;
963
964 hdr.code = stream_getc (s);
965 hdr.length = stream_getc (s);
966
967 if ((stream_get_getp(s) + hdr.length) > capd_end)
968 goto end;
969
970 if (hdr.code == CAPABILITY_CODE_AS4)
971 {
972 if (BGP_DEBUG (as4, AS4))
973 zlog_info ("[AS4] found AS4 capability, about to parse");
974 as4 = bgp_capability_as4 (peer, &hdr);
975
976 goto end;
977 }
978 stream_forward_getp (s, hdr.length);
979 }
980 }
981 }
982
983 end:
984 stream_set_getp (s, orig_getp);
985 return as4;
986 }
987
988 /**
989 * Parse open option.
990 *
991 * @param[out] mp_capability @see bgp_capability_parse() for semantics.
992 */
993 int
994 bgp_open_option_parse (struct peer *peer, u_char length, int *mp_capability)
995 {
996 int ret = 0;
997 u_char *error;
998 u_char error_data[BGP_MAX_PACKET_SIZE];
999 struct stream *s = BGP_INPUT(peer);
1000 size_t end = stream_get_getp (s) + length;
1001
1002 error = error_data;
1003
1004 if (bgp_debug_neighbor_events(peer))
1005 zlog_debug ("%s rcv OPEN w/ OPTION parameter len: %u",
1006 peer->host, length);
1007
1008 while (stream_get_getp(s) < end)
1009 {
1010 u_char opt_type;
1011 u_char opt_length;
1012
1013 /* Must have at least an OPEN option header */
1014 if (STREAM_READABLE(s) < 2)
1015 {
1016 zlog_info ("%s Option length error", peer->host);
1017 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
1018 return -1;
1019 }
1020
1021 /* Fetch option type and length. */
1022 opt_type = stream_getc (s);
1023 opt_length = stream_getc (s);
1024
1025 /* Option length check. */
1026 if (STREAM_READABLE (s) < opt_length)
1027 {
1028 zlog_info ("%s Option length error", peer->host);
1029 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
1030 return -1;
1031 }
1032
1033 if (bgp_debug_neighbor_events(peer))
1034 zlog_debug ("%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
1035 peer->host, opt_type,
1036 opt_type == BGP_OPEN_OPT_AUTH ? "Authentication" :
1037 opt_type == BGP_OPEN_OPT_CAP ? "Capability" : "Unknown",
1038 opt_length);
1039
1040 switch (opt_type)
1041 {
1042 case BGP_OPEN_OPT_AUTH:
1043 ret = bgp_auth_parse (peer, opt_length);
1044 break;
1045 case BGP_OPEN_OPT_CAP:
1046 ret = bgp_capability_parse (peer, opt_length, mp_capability, &error);
1047 break;
1048 default:
1049 bgp_notify_send (peer,
1050 BGP_NOTIFY_OPEN_ERR,
1051 BGP_NOTIFY_OPEN_UNSUP_PARAM);
1052 ret = -1;
1053 break;
1054 }
1055
1056 /* Parse error. To accumulate all unsupported capability codes,
1057 bgp_capability_parse does not return -1 when encounter
1058 unsupported capability code. To detect that, please check
1059 error and erro_data pointer, like below. */
1060 if (ret < 0)
1061 return -1;
1062 }
1063
1064 /* All OPEN option is parsed. Check capability when strict compare
1065 flag is enabled.*/
1066 if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
1067 {
1068 /* If Unsupported Capability exists. */
1069 if (error != error_data)
1070 {
1071 bgp_notify_send_with_data (peer,
1072 BGP_NOTIFY_OPEN_ERR,
1073 BGP_NOTIFY_OPEN_UNSUP_CAPBL,
1074 error_data, error - error_data);
1075 return -1;
1076 }
1077
1078 /* Check local capability does not negotiated with remote
1079 peer. */
1080 if (! strict_capability_same (peer))
1081 {
1082 bgp_notify_send (peer,
1083 BGP_NOTIFY_OPEN_ERR,
1084 BGP_NOTIFY_OPEN_UNSUP_CAPBL);
1085 return -1;
1086 }
1087 }
1088
1089 /* Check there are no common AFI/SAFIs and send Unsupported Capability
1090 error. */
1091 if (*mp_capability &&
1092 ! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
1093 {
1094 if (! peer->afc_nego[AFI_IP][SAFI_UNICAST]
1095 && ! peer->afc_nego[AFI_IP][SAFI_MULTICAST]
1096 && ! peer->afc_nego[AFI_IP][SAFI_MPLS_VPN]
1097 && ! peer->afc_nego[AFI_IP6][SAFI_UNICAST]
1098 && ! peer->afc_nego[AFI_IP6][SAFI_MULTICAST])
1099 {
1100 zlog_err ("%s [Error] Configured AFI/SAFIs do not "
1101 "overlap with received MP capabilities",
1102 peer->host);
1103
1104 if (error != error_data)
1105 bgp_notify_send_with_data (peer,
1106 BGP_NOTIFY_OPEN_ERR,
1107 BGP_NOTIFY_OPEN_UNSUP_CAPBL,
1108 error_data, error - error_data);
1109 else
1110 bgp_notify_send (peer,
1111 BGP_NOTIFY_OPEN_ERR,
1112 BGP_NOTIFY_OPEN_UNSUP_CAPBL);
1113 return -1;
1114 }
1115 }
1116 return 0;
1117 }
1118
1119 static void
1120 bgp_open_capability_orf (struct stream *s, struct peer *peer,
1121 afi_t afi, safi_t safi, u_char code)
1122 {
1123 u_char cap_len;
1124 u_char orf_len;
1125 unsigned long capp;
1126 unsigned long orfp;
1127 unsigned long numberp;
1128 int number_of_orfs = 0;
1129
1130 if (safi == SAFI_MPLS_VPN)
1131 safi = SAFI_MPLS_LABELED_VPN;
1132
1133 stream_putc (s, BGP_OPEN_OPT_CAP);
1134 capp = stream_get_endp (s); /* Set Capability Len Pointer */
1135 stream_putc (s, 0); /* Capability Length */
1136 stream_putc (s, code); /* Capability Code */
1137 orfp = stream_get_endp (s); /* Set ORF Len Pointer */
1138 stream_putc (s, 0); /* ORF Length */
1139 stream_putw (s, afi);
1140 stream_putc (s, 0);
1141 stream_putc (s, safi);
1142 numberp = stream_get_endp (s); /* Set Number Pointer */
1143 stream_putc (s, 0); /* Number of ORFs */
1144
1145 /* Address Prefix ORF */
1146 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
1147 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
1148 {
1149 stream_putc (s, (code == CAPABILITY_CODE_ORF ?
1150 ORF_TYPE_PREFIX : ORF_TYPE_PREFIX_OLD));
1151
1152 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
1153 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
1154 {
1155 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
1156 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
1157 stream_putc (s, ORF_MODE_BOTH);
1158 }
1159 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM))
1160 {
1161 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
1162 stream_putc (s, ORF_MODE_SEND);
1163 }
1164 else
1165 {
1166 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
1167 stream_putc (s, ORF_MODE_RECEIVE);
1168 }
1169 number_of_orfs++;
1170 }
1171
1172 /* Total Number of ORFs. */
1173 stream_putc_at (s, numberp, number_of_orfs);
1174
1175 /* Total ORF Len. */
1176 orf_len = stream_get_endp (s) - orfp - 1;
1177 stream_putc_at (s, orfp, orf_len);
1178
1179 /* Total Capability Len. */
1180 cap_len = stream_get_endp (s) - capp - 1;
1181 stream_putc_at (s, capp, cap_len);
1182 }
1183
1184 /* Fill in capability open option to the packet. */
1185 void
1186 bgp_open_capability (struct stream *s, struct peer *peer)
1187 {
1188 u_char len;
1189 unsigned long cp, capp, rcapp;
1190 afi_t afi;
1191 safi_t safi;
1192 as_t local_as;
1193 u_int32_t restart_time;
1194 u_char afi_safi_count = 0;
1195 struct utsname names;
1196 int adv_addpath_tx = 0;
1197
1198 /* Remember current pointer for Opt Parm Len. */
1199 cp = stream_get_endp (s);
1200
1201 /* Opt Parm Len. */
1202 stream_putc (s, 0);
1203
1204 /* Do not send capability. */
1205 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN)
1206 || CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
1207 return;
1208
1209 /* IPv4 unicast. */
1210 if (peer->afc[AFI_IP][SAFI_UNICAST])
1211 {
1212 peer->afc_adv[AFI_IP][SAFI_UNICAST] = 1;
1213 stream_putc (s, BGP_OPEN_OPT_CAP);
1214 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1215 stream_putc (s, CAPABILITY_CODE_MP);
1216 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1217 stream_putw (s, AFI_IP);
1218 stream_putc (s, 0);
1219 stream_putc (s, SAFI_UNICAST);
1220 }
1221 /* IPv4 multicast. */
1222 if (peer->afc[AFI_IP][SAFI_MULTICAST])
1223 {
1224 peer->afc_adv[AFI_IP][SAFI_MULTICAST] = 1;
1225 stream_putc (s, BGP_OPEN_OPT_CAP);
1226 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1227 stream_putc (s, CAPABILITY_CODE_MP);
1228 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1229 stream_putw (s, AFI_IP);
1230 stream_putc (s, 0);
1231 stream_putc (s, SAFI_MULTICAST);
1232 }
1233 /* IPv4 VPN */
1234 if (peer->afc[AFI_IP][SAFI_MPLS_VPN])
1235 {
1236 peer->afc_adv[AFI_IP][SAFI_MPLS_VPN] = 1;
1237 stream_putc (s, BGP_OPEN_OPT_CAP);
1238 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1239 stream_putc (s, CAPABILITY_CODE_MP);
1240 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1241 stream_putw (s, AFI_IP);
1242 stream_putc (s, 0);
1243 stream_putc (s, SAFI_MPLS_LABELED_VPN);
1244 }
1245 #ifdef HAVE_IPV6
1246 /* Currently supporting RFC-5549 for Link-Local peering only */
1247 if (CHECK_FLAG (peer->flags, PEER_FLAG_CAPABILITY_ENHE) &&
1248 peer->su.sa.sa_family == AF_INET6 &&
1249 IN6_IS_ADDR_LINKLOCAL(&peer->su.sin6.sin6_addr))
1250 {
1251 /* RFC 5549 Extended Next Hop Encoding */
1252 SET_FLAG (peer->cap, PEER_CAP_ENHE_ADV);
1253 stream_putc (s, BGP_OPEN_OPT_CAP);
1254 stream_putc (s, CAPABILITY_CODE_ENHE_LEN + 2);
1255 stream_putc (s, CAPABILITY_CODE_ENHE);
1256 stream_putc (s, CAPABILITY_CODE_ENHE_LEN);
1257 /* Currently supporting for SAFI_UNICAST only */
1258 SET_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_ADV);
1259 stream_putw (s, AFI_IP);
1260 stream_putw (s, SAFI_UNICAST);
1261 stream_putw (s, AFI_IP6);
1262
1263 if (CHECK_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_RCV))
1264 SET_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_NEGO);
1265 }
1266 /* IPv6 unicast. */
1267 if (peer->afc[AFI_IP6][SAFI_UNICAST])
1268 {
1269 peer->afc_adv[AFI_IP6][SAFI_UNICAST] = 1;
1270 stream_putc (s, BGP_OPEN_OPT_CAP);
1271 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1272 stream_putc (s, CAPABILITY_CODE_MP);
1273 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1274 stream_putw (s, AFI_IP6);
1275 stream_putc (s, 0);
1276 stream_putc (s, SAFI_UNICAST);
1277 }
1278 /* IPv6 multicast. */
1279 if (peer->afc[AFI_IP6][SAFI_MULTICAST])
1280 {
1281 peer->afc_adv[AFI_IP6][SAFI_MULTICAST] = 1;
1282 stream_putc (s, BGP_OPEN_OPT_CAP);
1283 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1284 stream_putc (s, CAPABILITY_CODE_MP);
1285 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1286 stream_putw (s, AFI_IP6);
1287 stream_putc (s, 0);
1288 stream_putc (s, SAFI_MULTICAST);
1289 }
1290 #endif /* HAVE_IPV6 */
1291
1292 /* Route refresh. */
1293 SET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV);
1294 stream_putc (s, BGP_OPEN_OPT_CAP);
1295 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
1296 stream_putc (s, CAPABILITY_CODE_REFRESH_OLD);
1297 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
1298 stream_putc (s, BGP_OPEN_OPT_CAP);
1299 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
1300 stream_putc (s, CAPABILITY_CODE_REFRESH);
1301 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
1302
1303 /* AS4 */
1304 SET_FLAG (peer->cap, PEER_CAP_AS4_ADV);
1305 stream_putc (s, BGP_OPEN_OPT_CAP);
1306 stream_putc (s, CAPABILITY_CODE_AS4_LEN + 2);
1307 stream_putc (s, CAPABILITY_CODE_AS4);
1308 stream_putc (s, CAPABILITY_CODE_AS4_LEN);
1309 if ( peer->change_local_as )
1310 local_as = peer->change_local_as;
1311 else
1312 local_as = peer->local_as;
1313 stream_putl (s, local_as );
1314
1315 /* AddPath */
1316 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1317 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1318 if (peer->afc[afi][safi])
1319 {
1320 afi_safi_count++;
1321
1322 /* Only advertise addpath TX if a feature that will use it is
1323 * configured */
1324 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_ALL_PATHS) ||
1325 CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS))
1326 adv_addpath_tx = 1;
1327 }
1328
1329 SET_FLAG (peer->cap, PEER_CAP_ADDPATH_ADV);
1330 stream_putc (s, BGP_OPEN_OPT_CAP);
1331 stream_putc (s, (CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count) + 2);
1332 stream_putc (s, CAPABILITY_CODE_ADDPATH);
1333 stream_putc (s, CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count);
1334
1335 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1336 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1337 if (peer->afc[afi][safi])
1338 {
1339 stream_putw (s, afi);
1340 stream_putc (s, safi);
1341
1342 if (adv_addpath_tx)
1343 {
1344 stream_putc (s, BGP_ADDPATH_RX|BGP_ADDPATH_TX);
1345 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV);
1346 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV);
1347 }
1348 else
1349 {
1350 stream_putc (s, BGP_ADDPATH_RX);
1351 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV);
1352 UNSET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV);
1353 }
1354 }
1355
1356 /* ORF capability. */
1357 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1358 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1359 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
1360 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
1361 {
1362 bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF_OLD);
1363 bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF);
1364 }
1365
1366 /* Dynamic capability. */
1367 if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
1368 {
1369 SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV);
1370 stream_putc (s, BGP_OPEN_OPT_CAP);
1371 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN + 2);
1372 stream_putc (s, CAPABILITY_CODE_DYNAMIC_OLD);
1373 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN);
1374 stream_putc (s, BGP_OPEN_OPT_CAP);
1375 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN + 2);
1376 stream_putc (s, CAPABILITY_CODE_DYNAMIC);
1377 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN);
1378 }
1379
1380 /* Hostname capability */
1381 uname(&names);
1382 if (names.nodename[0] != '\0')
1383 {
1384 SET_FLAG(peer->cap, PEER_CAP_HOSTNAME_ADV);
1385 stream_putc (s, BGP_OPEN_OPT_CAP);
1386 rcapp = stream_get_endp(s); /* Ptr to length placeholder */
1387 stream_putc(s, 0); /* dummy len for now */
1388 stream_putc (s, CAPABILITY_CODE_FQDN);
1389 capp = stream_get_endp(s);
1390 stream_putc(s, 0); /* dummy len for now */
1391 len = strlen(names.nodename);
1392 if (len > BGP_MAX_HOSTNAME)
1393 len = BGP_MAX_HOSTNAME;
1394
1395 stream_putc(s, len);
1396 stream_put(s, names.nodename, len);
1397 #ifdef _GNU_SOURCE
1398 if ((names.domainname[0] != '\0') &&
1399 (strcmp(names.domainname, "(none)") != 0))
1400 {
1401 len = strlen(names.domainname);
1402 if (len > BGP_MAX_HOSTNAME)
1403 len = BGP_MAX_HOSTNAME;
1404
1405 stream_putc(s, len);
1406 stream_put(s, names.domainname, len);
1407 }
1408 else
1409 #endif
1410 {
1411 stream_putc(s, 0); /* 0 length */
1412 }
1413
1414 /* Set the lengths straight */
1415 len = stream_get_endp(s) - rcapp - 1;
1416 stream_putc_at(s, rcapp, len);
1417 len = stream_get_endp(s) - capp - 1;
1418 stream_putc_at(s, capp, len);
1419
1420 if (bgp_debug_neighbor_events(peer))
1421 zlog_debug("%s Sending hostname cap with hn = %s, dn = %s",
1422 peer->host, names.nodename, names.domainname);
1423 }
1424
1425 /* Sending base graceful-restart capability irrespective of the config */
1426 SET_FLAG (peer->cap, PEER_CAP_RESTART_ADV);
1427 stream_putc (s, BGP_OPEN_OPT_CAP);
1428 capp = stream_get_endp (s); /* Set Capability Len Pointer */
1429 stream_putc (s, 0); /* Capability Length */
1430 stream_putc (s, CAPABILITY_CODE_RESTART);
1431 rcapp = stream_get_endp (s); /* Set Restart Capability Len Pointer */
1432 stream_putc (s, 0);
1433 restart_time = peer->bgp->restart_time;
1434 if (peer->bgp->t_startup)
1435 {
1436 SET_FLAG (restart_time, RESTART_R_BIT);
1437 SET_FLAG (peer->cap, PEER_CAP_RESTART_BIT_ADV);
1438 }
1439 stream_putw (s, restart_time);
1440
1441 /* Send address-family specific graceful-restart capability only when GR config
1442 is present */
1443 if (bgp_flag_check (peer->bgp, BGP_FLAG_GRACEFUL_RESTART))
1444 {
1445 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1446 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1447 if (peer->afc[afi][safi])
1448 {
1449 stream_putw (s, afi);
1450 stream_putc (s, safi);
1451 stream_putc (s, 0); //Forwarding is not retained as of now.
1452 }
1453 }
1454
1455 /* Total Graceful restart capability Len. */
1456 len = stream_get_endp (s) - rcapp - 1;
1457 stream_putc_at (s, rcapp, len);
1458
1459 /* Total Capability Len. */
1460 len = stream_get_endp (s) - capp - 1;
1461 stream_putc_at (s, capp, len);
1462
1463 /* Total Opt Parm Len. */
1464 len = stream_get_endp (s) - cp - 1;
1465 stream_putc_at (s, cp, len);
1466 }