1 /* BGP open message handling
2 * Copyright (C) 1998, 1999 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
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
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.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
34 #include "bgpd/bgpd.h"
35 #include "bgpd/bgp_attr.h"
36 #include "bgpd/bgp_debug.h"
37 #include "bgpd/bgp_errors.h"
38 #include "bgpd/bgp_fsm.h"
39 #include "bgpd/bgp_packet.h"
40 #include "bgpd/bgp_open.h"
41 #include "bgpd/bgp_aspath.h"
42 #include "bgpd/bgp_vty.h"
43 #include "bgpd/bgp_memory.h"
45 /* BGP-4 Multiprotocol Extentions lead us to the complex world. We can
46 negotiate remote peer supports extentions or not. But if
47 remote-peer doesn't supports negotiation process itself. We would
48 like to do manual configuration.
50 So there is many configurable point. First of all we want set each
51 peer whether we send capability negotiation to the peer or not.
52 Next, if we send capability to the peer we want to set my capability
53 inforation at each peer. */
55 void bgp_capability_vty_out(struct vty
*vty
, struct peer
*peer
, bool use_json
,
56 json_object
*json_neigh
)
60 struct capability_mp_data mpc
;
61 struct capability_header
*hdr
;
62 json_object
*json_cap
= NULL
;
65 json_cap
= json_object_new_object();
67 pnt
= peer
->notify
.data
;
68 end
= pnt
+ peer
->notify
.length
;
71 if (pnt
+ sizeof(struct capability_mp_data
) + 2 > end
)
74 hdr
= (struct capability_header
*)pnt
;
75 if (pnt
+ hdr
->length
+ 2 > end
)
78 memcpy(&mpc
, pnt
+ 2, sizeof(struct capability_mp_data
));
80 if (hdr
->code
== CAPABILITY_CODE_MP
) {
84 (void)bgp_map_afi_safi_iana2int(ntohs(mpc
.afi
),
85 mpc
.safi
, &afi
, &safi
);
90 json_object_string_add(
92 "capabilityErrorMultiProtocolAfi",
96 json_object_string_add(
98 "capabilityErrorMultiProtocolAfi",
102 json_object_string_add(
104 "capabilityErrorMultiProtocolAfi",
110 "capabilityErrorMultiProtocolAfiUnknown",
116 json_object_string_add(
118 "capabilityErrorMultiProtocolSafi",
122 json_object_string_add(
124 "capabilityErrorMultiProtocolSafi",
127 case SAFI_LABELED_UNICAST
:
128 json_object_string_add(
130 "capabilityErrorMultiProtocolSafi",
134 json_object_string_add(
136 "capabilityErrorMultiProtocolSafi",
140 json_object_string_add(
142 "capabilityErrorMultiProtocolSafi",
146 json_object_string_add(
148 "capabilityErrorMultiProtocolSafi",
152 json_object_string_add(
154 "capabilityErrorMultiProtocolSafi",
160 "capabilityErrorMultiProtocolSafiUnknown",
166 " Capability error for: Multi protocol ");
169 vty_out(vty
, "AFI IPv4, ");
172 vty_out(vty
, "AFI IPv6, ");
175 vty_out(vty
, "AFI L2VPN, ");
178 vty_out(vty
, "AFI Unknown %d, ",
184 vty_out(vty
, "SAFI Unicast");
187 vty_out(vty
, "SAFI Multicast");
189 case SAFI_LABELED_UNICAST
:
190 vty_out(vty
, "SAFI Labeled-unicast");
193 vty_out(vty
, "SAFI MPLS-labeled VPN");
196 vty_out(vty
, "SAFI ENCAP");
199 vty_out(vty
, "SAFI FLOWSPEC");
202 vty_out(vty
, "SAFI EVPN");
205 vty_out(vty
, "SAFI Unknown %d ",
211 } else if (hdr
->code
>= 128) {
215 "capabilityErrorVendorSpecificCapabilityCode",
219 " Capability error: vendor specific capability code %d",
225 "capabilityErrorUnknownCapabilityCode",
229 " Capability error: unknown capability code %d",
232 pnt
+= hdr
->length
+ 2;
235 json_object_object_add(json_neigh
, "capabilityErrors",
239 static void bgp_capability_mp_data(struct stream
*s
,
240 struct capability_mp_data
*mpc
)
242 mpc
->afi
= stream_getw(s
);
243 mpc
->reserved
= stream_getc(s
);
244 mpc
->safi
= stream_getc(s
);
247 /* Set negotiated capability value. */
248 static int bgp_capability_mp(struct peer
*peer
, struct capability_header
*hdr
)
250 struct capability_mp_data mpc
;
251 struct stream
*s
= BGP_INPUT(peer
);
255 /* Verify length is 4 */
256 if (hdr
->length
!= 4) {
258 EC_BGP_CAPABILITY_INVALID_LENGTH
,
259 "MP Cap: Received invalid length %d, non-multiple of 4",
264 bgp_capability_mp_data(s
, &mpc
);
266 if (bgp_debug_neighbor_events(peer
))
267 zlog_debug("%s OPEN has MP_EXT CAP for afi/safi: %s/%s",
268 peer
->host
, iana_afi2str(mpc
.afi
),
269 iana_safi2str(mpc
.safi
));
271 /* Convert AFI, SAFI to internal values, check. */
272 if (bgp_map_afi_safi_iana2int(mpc
.afi
, mpc
.safi
, &afi
, &safi
))
275 /* Now safi remapped, and afi/safi are valid array indices */
276 peer
->afc_recv
[afi
][safi
] = 1;
278 if (peer
->afc
[afi
][safi
])
279 peer
->afc_nego
[afi
][safi
] = 1;
286 static void bgp_capability_orf_not_support(struct peer
*peer
, iana_afi_t afi
,
287 iana_safi_t safi
, uint8_t type
,
290 if (bgp_debug_neighbor_events(peer
))
292 "%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
293 peer
->host
, afi
, safi
, type
, mode
);
296 static const struct message orf_type_str
[] = {
297 {ORF_TYPE_PREFIX
, "Prefixlist"},
298 {ORF_TYPE_PREFIX_OLD
, "Prefixlist (old)"},
301 static const struct message orf_mode_str
[] = {{ORF_MODE_RECEIVE
, "Receive"},
302 {ORF_MODE_SEND
, "Send"},
303 {ORF_MODE_BOTH
, "Both"},
306 static int bgp_capability_orf_entry(struct peer
*peer
,
307 struct capability_header
*hdr
)
309 struct stream
*s
= BGP_INPUT(peer
);
310 struct capability_mp_data mpc
;
314 iana_safi_t pkt_safi
;
318 uint16_t sm_cap
= 0; /* capability send-mode receive */
319 uint16_t rm_cap
= 0; /* capability receive-mode receive */
322 /* ORF Entry header */
323 bgp_capability_mp_data(s
, &mpc
);
324 num
= stream_getc(s
);
328 if (bgp_debug_neighbor_events(peer
))
329 zlog_debug("%s ORF Cap entry for afi/safi: %s/%s", peer
->host
,
330 iana_afi2str(mpc
.afi
), iana_safi2str(mpc
.safi
));
332 /* Convert AFI, SAFI to internal values, check. */
333 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
335 "%s Addr-family %d/%d not supported."
336 " Ignoring the ORF capability",
337 peer
->host
, pkt_afi
, pkt_safi
);
344 /* validate number field */
345 if (CAPABILITY_CODE_ORF_LEN
+ (num
* 2) > hdr
->length
) {
347 "%s ORF Capability entry length error,"
348 " Cap length %u, num %u",
349 peer
->host
, hdr
->length
, num
);
350 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
351 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
355 for (i
= 0; i
< num
; i
++) {
356 type
= stream_getc(s
);
357 mode
= stream_getc(s
);
359 /* ORF Mode error check */
363 case ORF_MODE_RECEIVE
:
366 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
370 /* ORF Type and afi/safi error checks */
371 /* capcode versus type */
373 case CAPABILITY_CODE_ORF
:
375 case ORF_TYPE_PREFIX
:
378 bgp_capability_orf_not_support(
379 peer
, pkt_afi
, pkt_safi
, type
, mode
);
383 case CAPABILITY_CODE_ORF_OLD
:
385 case ORF_TYPE_PREFIX_OLD
:
388 bgp_capability_orf_not_support(
389 peer
, pkt_afi
, pkt_safi
, type
, mode
);
394 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
400 if (!((afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
401 || (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
402 || (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
))) {
403 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
408 if (bgp_debug_neighbor_events(peer
))
410 "%s OPEN has %s ORF capability"
411 " as %s for afi/safi: %s/%s",
413 lookup_msg(orf_type_str
, type
, NULL
),
414 lookup_msg(orf_mode_str
, mode
, NULL
),
415 iana_afi2str(pkt_afi
), iana_safi2str(pkt_safi
));
417 if (hdr
->code
== CAPABILITY_CODE_ORF
) {
418 sm_cap
= PEER_CAP_ORF_PREFIX_SM_RCV
;
419 rm_cap
= PEER_CAP_ORF_PREFIX_RM_RCV
;
420 } else if (hdr
->code
== CAPABILITY_CODE_ORF_OLD
) {
421 sm_cap
= PEER_CAP_ORF_PREFIX_SM_OLD_RCV
;
422 rm_cap
= PEER_CAP_ORF_PREFIX_RM_OLD_RCV
;
424 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
431 SET_FLAG(peer
->af_cap
[afi
][safi
], sm_cap
);
432 SET_FLAG(peer
->af_cap
[afi
][safi
], rm_cap
);
435 SET_FLAG(peer
->af_cap
[afi
][safi
], sm_cap
);
437 case ORF_MODE_RECEIVE
:
438 SET_FLAG(peer
->af_cap
[afi
][safi
], rm_cap
);
445 static int bgp_capability_restart(struct peer
*peer
,
446 struct capability_header
*caphdr
)
448 struct stream
*s
= BGP_INPUT(peer
);
449 uint16_t restart_flag_time
;
450 size_t end
= stream_get_getp(s
) + caphdr
->length
;
452 /* Verify length is a multiple of 4 */
453 if ((caphdr
->length
- 2) % 4) {
455 EC_BGP_CAPABILITY_INVALID_LENGTH
,
456 "Restart Cap: Received invalid length %d, non-multiple of 4",
461 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
);
462 restart_flag_time
= stream_getw(s
);
463 if (CHECK_FLAG(restart_flag_time
, RESTART_R_BIT
))
464 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_RCV
);
466 UNSET_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_RCV
);
468 UNSET_FLAG(restart_flag_time
, 0xF000);
469 peer
->v_gr_restart
= restart_flag_time
;
471 if (bgp_debug_neighbor_events(peer
)) {
472 zlog_debug("%s OPEN has Graceful Restart capability",
474 zlog_debug("%s Peer has%srestarted. Restart Time : %d",
476 CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_RCV
)
482 while (stream_get_getp(s
) + 4 <= end
) {
485 iana_afi_t pkt_afi
= stream_getw(s
);
486 iana_safi_t pkt_safi
= stream_getc(s
);
487 uint8_t flag
= stream_getc(s
);
489 /* Convert AFI, SAFI to internal values, check. */
490 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
491 if (bgp_debug_neighbor_events(peer
))
493 "%s Addr-family %s/%s(afi/safi) not supported."
494 " Ignore the Graceful Restart capability for this AFI/SAFI",
495 peer
->host
, iana_afi2str(pkt_afi
),
496 iana_safi2str(pkt_safi
));
497 } else if (!peer
->afc
[afi
][safi
]) {
498 if (bgp_debug_neighbor_events(peer
))
500 "%s Addr-family %s/%s(afi/safi) not enabled."
501 " Ignore the Graceful Restart capability",
502 peer
->host
, iana_afi2str(pkt_afi
),
503 iana_safi2str(pkt_safi
));
505 if (bgp_debug_neighbor_events(peer
))
507 "%s Address family %s is%spreserved",
508 peer
->host
, get_afi_safi_str(afi
, safi
, false),
510 peer
->af_cap
[afi
][safi
],
511 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
515 SET_FLAG(peer
->af_cap
[afi
][safi
],
516 PEER_CAP_RESTART_AF_RCV
);
517 if (CHECK_FLAG(flag
, RESTART_F_BIT
))
518 SET_FLAG(peer
->af_cap
[afi
][safi
],
519 PEER_CAP_RESTART_AF_PRESERVE_RCV
);
525 /* Unlike other capability parsing routines, this one returns 0 on error */
526 static as_t
bgp_capability_as4(struct peer
*peer
, struct capability_header
*hdr
)
528 SET_FLAG(peer
->cap
, PEER_CAP_AS4_RCV
);
530 if (hdr
->length
!= CAPABILITY_CODE_AS4_LEN
) {
531 flog_err(EC_BGP_PKT_OPEN
,
532 "%s AS4 capability has incorrect data length %d",
533 peer
->host
, hdr
->length
);
537 as_t as4
= stream_getl(BGP_INPUT(peer
));
539 if (BGP_DEBUG(as4
, AS4
))
541 "%s [AS4] about to set cap PEER_CAP_AS4_RCV, got as4 %u",
546 static int bgp_capability_addpath(struct peer
*peer
,
547 struct capability_header
*hdr
)
549 struct stream
*s
= BGP_INPUT(peer
);
550 size_t end
= stream_get_getp(s
) + hdr
->length
;
552 SET_FLAG(peer
->cap
, PEER_CAP_ADDPATH_RCV
);
554 /* Verify length is a multiple of 4 */
555 if (hdr
->length
% 4) {
557 EC_BGP_CAPABILITY_INVALID_LENGTH
,
558 "Add Path: Received invalid length %d, non-multiple of 4",
563 while (stream_get_getp(s
) + 4 <= end
) {
566 iana_afi_t pkt_afi
= stream_getw(s
);
567 iana_safi_t pkt_safi
= stream_getc(s
);
568 uint8_t send_receive
= stream_getc(s
);
570 if (bgp_debug_neighbor_events(peer
))
572 "%s OPEN has AddPath CAP for afi/safi: %s/%s%s%s",
573 peer
->host
, iana_afi2str(pkt_afi
),
574 iana_safi2str(pkt_safi
),
575 (send_receive
& BGP_ADDPATH_RX
) ? ", receive"
577 (send_receive
& BGP_ADDPATH_TX
) ? ", transmit"
580 /* Convert AFI, SAFI to internal values, check. */
581 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
582 if (bgp_debug_neighbor_events(peer
))
584 "%s Addr-family %s/%s(afi/safi) not supported."
585 " Ignore the Addpath Attribute for this AFI/SAFI",
586 peer
->host
, iana_afi2str(pkt_afi
),
587 iana_safi2str(pkt_safi
));
589 } else if (!peer
->afc
[afi
][safi
]) {
590 if (bgp_debug_neighbor_events(peer
))
592 "%s Addr-family %s/%s(afi/safi) not enabled."
593 " Ignore the AddPath capability for this AFI/SAFI",
594 peer
->host
, iana_afi2str(pkt_afi
),
595 iana_safi2str(pkt_safi
));
599 if (send_receive
& BGP_ADDPATH_RX
)
600 SET_FLAG(peer
->af_cap
[afi
][safi
],
601 PEER_CAP_ADDPATH_AF_RX_RCV
);
603 if (send_receive
& BGP_ADDPATH_TX
)
604 SET_FLAG(peer
->af_cap
[afi
][safi
],
605 PEER_CAP_ADDPATH_AF_TX_RCV
);
611 static int bgp_capability_enhe(struct peer
*peer
, struct capability_header
*hdr
)
613 struct stream
*s
= BGP_INPUT(peer
);
614 size_t end
= stream_get_getp(s
) + hdr
->length
;
616 /* Verify length is a multiple of 4 */
617 if (hdr
->length
% 6) {
619 EC_BGP_CAPABILITY_INVALID_LENGTH
,
620 "Extended NH: Received invalid length %d, non-multiple of 6",
625 while (stream_get_getp(s
) + 6 <= end
) {
626 iana_afi_t pkt_afi
= stream_getw(s
);
628 iana_safi_t pkt_safi
= stream_getw(s
);
630 iana_afi_t pkt_nh_afi
= stream_getw(s
);
633 if (bgp_debug_neighbor_events(peer
))
635 "%s Received with afi/safi/next-hop afi: %s/%s/%u",
636 peer
->host
, iana_afi2str(pkt_afi
),
637 iana_safi2str(pkt_safi
), pkt_nh_afi
);
639 /* Convert AFI, SAFI to internal values, check. */
640 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
641 if (bgp_debug_neighbor_events(peer
))
643 "%s Addr-family %s/%s(afi/safi) not supported."
644 " Ignore the ENHE Attribute for this AFI/SAFI",
645 peer
->host
, iana_afi2str(pkt_afi
),
646 iana_safi2str(pkt_safi
));
650 /* RFC 5549 specifies use of this capability only for IPv4 AFI,
652 * the Nexthop AFI being IPv6. A future spec may introduce other
653 * possibilities, so we ignore other values with a log. Also,
655 * SAFI_UNICAST and SAFI_LABELED_UNICAST are currently supported
658 nh_afi
= afi_iana2int(pkt_nh_afi
);
660 if (afi
!= AFI_IP
|| nh_afi
!= AFI_IP6
661 || !(safi
== SAFI_UNICAST
|| safi
== SAFI_MPLS_VPN
662 || safi
== SAFI_LABELED_UNICAST
)) {
664 EC_BGP_CAPABILITY_INVALID_DATA
,
665 "%s Unexpected afi/safi/next-hop afi: %s/%s/%u "
666 "in Extended Next-hop capability, ignoring",
667 peer
->host
, iana_afi2str(pkt_afi
),
668 iana_safi2str(pkt_safi
), pkt_nh_afi
);
672 SET_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_ENHE_AF_RCV
);
674 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_ENHE_AF_ADV
))
675 SET_FLAG(peer
->af_cap
[afi
][safi
],
676 PEER_CAP_ENHE_AF_NEGO
);
679 SET_FLAG(peer
->cap
, PEER_CAP_ENHE_RCV
);
684 static int bgp_capability_hostname(struct peer
*peer
,
685 struct capability_header
*hdr
)
687 struct stream
*s
= BGP_INPUT(peer
);
688 char str
[BGP_MAX_HOSTNAME
+ 1];
689 size_t end
= stream_get_getp(s
) + hdr
->length
;
692 SET_FLAG(peer
->cap
, PEER_CAP_HOSTNAME_RCV
);
694 len
= stream_getc(s
);
695 if (stream_get_getp(s
) + len
> end
) {
697 EC_BGP_CAPABILITY_INVALID_DATA
,
698 "%s: Received malformed hostname capability from peer %s",
699 __FUNCTION__
, peer
->host
);
703 if (len
> BGP_MAX_HOSTNAME
) {
704 stream_get(str
, s
, BGP_MAX_HOSTNAME
);
705 stream_forward_getp(s
, len
- BGP_MAX_HOSTNAME
);
706 len
= BGP_MAX_HOSTNAME
; /* to set the '\0' below */
708 stream_get(str
, s
, len
);
713 if (peer
->hostname
!= NULL
) {
714 XFREE(MTYPE_BGP_PEER_HOST
, peer
->hostname
);
715 peer
->hostname
= NULL
;
718 if (peer
->domainname
!= NULL
) {
719 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
720 peer
->domainname
= NULL
;
723 peer
->hostname
= XSTRDUP(MTYPE_BGP_PEER_HOST
, str
);
726 if (stream_get_getp(s
) + 1 > end
) {
728 EC_BGP_CAPABILITY_INVALID_DATA
,
729 "%s: Received invalid domain name len (hostname capability) from peer %s",
730 __FUNCTION__
, peer
->host
);
734 len
= stream_getc(s
);
735 if (stream_get_getp(s
) + len
> end
) {
737 EC_BGP_CAPABILITY_INVALID_DATA
,
738 "%s: Received runt domain name (hostname capability) from peer %s",
739 __FUNCTION__
, peer
->host
);
743 if (len
> BGP_MAX_HOSTNAME
) {
744 stream_get(str
, s
, BGP_MAX_HOSTNAME
);
745 stream_forward_getp(s
, len
- BGP_MAX_HOSTNAME
);
746 len
= BGP_MAX_HOSTNAME
; /* to set the '\0' below */
748 stream_get(str
, s
, len
);
753 if (peer
->domainname
!= NULL
) {
754 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
755 peer
->domainname
= NULL
;
758 peer
->domainname
= XSTRDUP(MTYPE_BGP_PEER_HOST
, str
);
761 if (bgp_debug_neighbor_events(peer
)) {
762 zlog_debug("%s received hostname %s, domainname %s", peer
->host
,
763 peer
->hostname
, peer
->domainname
);
769 static const struct message capcode_str
[] = {
770 {CAPABILITY_CODE_MP
, "MultiProtocol Extensions"},
771 {CAPABILITY_CODE_REFRESH
, "Route Refresh"},
772 {CAPABILITY_CODE_ORF
, "Cooperative Route Filtering"},
773 {CAPABILITY_CODE_RESTART
, "Graceful Restart"},
774 {CAPABILITY_CODE_AS4
, "4-octet AS number"},
775 {CAPABILITY_CODE_ADDPATH
, "AddPath"},
776 {CAPABILITY_CODE_DYNAMIC
, "Dynamic"},
777 {CAPABILITY_CODE_ENHE
, "Extended Next Hop Encoding"},
778 {CAPABILITY_CODE_DYNAMIC_OLD
, "Dynamic (Old)"},
779 {CAPABILITY_CODE_REFRESH_OLD
, "Route Refresh (Old)"},
780 {CAPABILITY_CODE_ORF_OLD
, "ORF (Old)"},
781 {CAPABILITY_CODE_FQDN
, "FQDN"},
784 /* Minimum sizes for length field of each cap (so not inc. the header) */
785 static const size_t cap_minsizes
[] = {
786 [CAPABILITY_CODE_MP
] = CAPABILITY_CODE_MP_LEN
,
787 [CAPABILITY_CODE_REFRESH
] = CAPABILITY_CODE_REFRESH_LEN
,
788 [CAPABILITY_CODE_ORF
] = CAPABILITY_CODE_ORF_LEN
,
789 [CAPABILITY_CODE_RESTART
] = CAPABILITY_CODE_RESTART_LEN
,
790 [CAPABILITY_CODE_AS4
] = CAPABILITY_CODE_AS4_LEN
,
791 [CAPABILITY_CODE_ADDPATH
] = CAPABILITY_CODE_ADDPATH_LEN
,
792 [CAPABILITY_CODE_DYNAMIC
] = CAPABILITY_CODE_DYNAMIC_LEN
,
793 [CAPABILITY_CODE_DYNAMIC_OLD
] = CAPABILITY_CODE_DYNAMIC_LEN
,
794 [CAPABILITY_CODE_ENHE
] = CAPABILITY_CODE_ENHE_LEN
,
795 [CAPABILITY_CODE_REFRESH_OLD
] = CAPABILITY_CODE_REFRESH_LEN
,
796 [CAPABILITY_CODE_ORF_OLD
] = CAPABILITY_CODE_ORF_LEN
,
797 [CAPABILITY_CODE_FQDN
] = CAPABILITY_CODE_MIN_FQDN_LEN
,
800 /* value the capability must be a multiple of.
801 * 0-data capabilities won't be checked against this.
802 * Other capabilities whose data doesn't fall on convenient boundaries for this
803 * table should be set to 1.
805 static const size_t cap_modsizes
[] = {
806 [CAPABILITY_CODE_MP
] = 4,
807 [CAPABILITY_CODE_REFRESH
] = 1,
808 [CAPABILITY_CODE_ORF
] = 1,
809 [CAPABILITY_CODE_RESTART
] = 1,
810 [CAPABILITY_CODE_AS4
] = 4,
811 [CAPABILITY_CODE_ADDPATH
] = 4,
812 [CAPABILITY_CODE_DYNAMIC
] = 1,
813 [CAPABILITY_CODE_DYNAMIC_OLD
] = 1,
814 [CAPABILITY_CODE_ENHE
] = 6,
815 [CAPABILITY_CODE_REFRESH_OLD
] = 1,
816 [CAPABILITY_CODE_ORF_OLD
] = 1,
817 [CAPABILITY_CODE_FQDN
] = 1,
821 * Parse given capability.
822 * XXX: This is reading into a stream, but not using stream API
824 * @param[out] mp_capability Set to 1 on return iff one or more Multiprotocol
825 * capabilities were encountered.
827 static int bgp_capability_parse(struct peer
*peer
, size_t length
,
828 int *mp_capability
, uint8_t **error
)
831 struct stream
*s
= BGP_INPUT(peer
);
832 size_t end
= stream_get_getp(s
) + length
;
833 uint16_t restart_flag_time
= 0;
835 assert(STREAM_READABLE(s
) >= length
);
837 while (stream_get_getp(s
) < end
) {
839 uint8_t *sp
= stream_pnt(s
);
840 struct capability_header caphdr
;
843 /* We need at least capability code and capability length. */
844 if (stream_get_getp(s
) + 2 > end
) {
845 zlog_info("%s Capability length error (< header)",
847 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
848 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
852 caphdr
.code
= stream_getc(s
);
853 caphdr
.length
= stream_getc(s
);
854 start
= stream_get_getp(s
);
856 /* Capability length check sanity check. */
857 if (start
+ caphdr
.length
> end
) {
858 zlog_info("%s Capability length error (< length)",
860 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
861 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
865 if (bgp_debug_neighbor_events(peer
))
866 zlog_debug("%s OPEN has %s capability (%u), length %u",
868 lookup_msg(capcode_str
, caphdr
.code
, NULL
),
869 caphdr
.code
, caphdr
.length
);
871 /* Length sanity check, type-specific, for known capabilities */
872 switch (caphdr
.code
) {
873 case CAPABILITY_CODE_MP
:
874 case CAPABILITY_CODE_REFRESH
:
875 case CAPABILITY_CODE_REFRESH_OLD
:
876 case CAPABILITY_CODE_ORF
:
877 case CAPABILITY_CODE_ORF_OLD
:
878 case CAPABILITY_CODE_RESTART
:
879 case CAPABILITY_CODE_AS4
:
880 case CAPABILITY_CODE_ADDPATH
:
881 case CAPABILITY_CODE_DYNAMIC
:
882 case CAPABILITY_CODE_DYNAMIC_OLD
:
883 case CAPABILITY_CODE_ENHE
:
884 case CAPABILITY_CODE_FQDN
:
886 if (caphdr
.length
< cap_minsizes
[caphdr
.code
]) {
888 "%s %s Capability length error: got %u,"
889 " expected at least %u",
891 lookup_msg(capcode_str
, caphdr
.code
,
894 (unsigned)cap_minsizes
[caphdr
.code
]);
895 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
896 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
900 && caphdr
.length
% cap_modsizes
[caphdr
.code
] != 0) {
902 "%s %s Capability length error: got %u,"
903 " expected a multiple of %u",
905 lookup_msg(capcode_str
, caphdr
.code
,
908 (unsigned)cap_modsizes
[caphdr
.code
]);
909 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
910 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
913 /* we deliberately ignore unknown codes, see below */
918 switch (caphdr
.code
) {
919 case CAPABILITY_CODE_MP
: {
922 /* Ignore capability when override-capability is set. */
923 if (!CHECK_FLAG(peer
->flags
,
924 PEER_FLAG_OVERRIDE_CAPABILITY
)) {
925 /* Set negotiated value. */
926 ret
= bgp_capability_mp(peer
, &caphdr
);
928 /* Unsupported Capability. */
930 /* Store return data. */
931 memcpy(*error
, sp
, caphdr
.length
+ 2);
932 *error
+= caphdr
.length
+ 2;
934 ret
= 0; /* Don't return error for this */
937 case CAPABILITY_CODE_REFRESH
:
938 case CAPABILITY_CODE_REFRESH_OLD
: {
939 /* BGP refresh capability */
940 if (caphdr
.code
== CAPABILITY_CODE_REFRESH_OLD
)
941 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
);
943 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
);
945 case CAPABILITY_CODE_ORF
:
946 case CAPABILITY_CODE_ORF_OLD
:
947 ret
= bgp_capability_orf_entry(peer
, &caphdr
);
949 case CAPABILITY_CODE_RESTART
:
950 ret
= bgp_capability_restart(peer
, &caphdr
);
952 case CAPABILITY_CODE_DYNAMIC
:
953 case CAPABILITY_CODE_DYNAMIC_OLD
:
954 SET_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
);
956 case CAPABILITY_CODE_AS4
:
957 /* Already handled as a special-case parsing of the
959 * at the beginning of OPEN processing. So we care not a
961 * for the value really, only error case.
963 if (!bgp_capability_as4(peer
, &caphdr
))
966 case CAPABILITY_CODE_ADDPATH
:
967 ret
= bgp_capability_addpath(peer
, &caphdr
);
969 case CAPABILITY_CODE_ENHE
:
970 ret
= bgp_capability_enhe(peer
, &caphdr
);
972 case CAPABILITY_CODE_FQDN
:
973 ret
= bgp_capability_hostname(peer
, &caphdr
);
976 if (caphdr
.code
> 128) {
977 /* We don't send Notification for unknown vendor
979 capabilities. It seems reasonable for now...
981 flog_warn(EC_BGP_CAPABILITY_VENDOR
,
982 "%s Vendor specific capability %d",
983 peer
->host
, caphdr
.code
);
986 EC_BGP_CAPABILITY_UNKNOWN
,
987 "%s unrecognized capability code: %d - ignored",
988 peer
->host
, caphdr
.code
);
989 memcpy(*error
, sp
, caphdr
.length
+ 2);
990 *error
+= caphdr
.length
+ 2;
995 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
996 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
999 if (stream_get_getp(s
) != (start
+ caphdr
.length
)) {
1000 if (stream_get_getp(s
) > (start
+ caphdr
.length
))
1002 EC_BGP_CAPABILITY_INVALID_LENGTH
,
1003 "%s Cap-parser for %s read past cap-length, %u!",
1005 lookup_msg(capcode_str
, caphdr
.code
,
1008 stream_set_getp(s
, start
+ caphdr
.length
);
1011 if (!CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
1012 UNSET_FLAG(restart_flag_time
, 0xF000);
1013 peer
->v_gr_restart
= restart_flag_time
;
1020 static int bgp_auth_parse(struct peer
*peer
, size_t length
)
1022 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1023 BGP_NOTIFY_OPEN_AUTH_FAILURE
);
1027 static int strict_capability_same(struct peer
*peer
)
1031 for (i
= AFI_IP
; i
< AFI_MAX
; i
++)
1032 for (j
= SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
1033 if (peer
->afc
[i
][j
] != peer
->afc_nego
[i
][j
])
1038 /* peek into option, stores ASN to *as4 if the AS4 capability was found.
1039 * Returns 0 if no as4 found, as4cap value otherwise.
1041 as_t
peek_for_as4_capability(struct peer
*peer
, uint8_t length
)
1043 struct stream
*s
= BGP_INPUT(peer
);
1044 size_t orig_getp
= stream_get_getp(s
);
1045 size_t end
= orig_getp
+ length
;
1048 if (BGP_DEBUG(as4
, AS4
))
1050 "%s [AS4] rcv OPEN w/ OPTION parameter len: %u,"
1052 peer
->host
, length
);
1053 /* the error cases we DONT handle, we ONLY try to read as4 out of
1054 * correctly formatted options.
1056 while (stream_get_getp(s
) < end
) {
1060 /* Check the length. */
1061 if (stream_get_getp(s
) + 2 > end
)
1064 /* Fetch option type and length. */
1065 opt_type
= stream_getc(s
);
1066 opt_length
= stream_getc(s
);
1068 /* Option length check. */
1069 if (stream_get_getp(s
) + opt_length
> end
)
1072 if (opt_type
== BGP_OPEN_OPT_CAP
) {
1073 unsigned long capd_start
= stream_get_getp(s
);
1074 unsigned long capd_end
= capd_start
+ opt_length
;
1076 assert(capd_end
<= end
);
1078 while (stream_get_getp(s
) < capd_end
) {
1079 struct capability_header hdr
;
1081 if (stream_get_getp(s
) + 2 > capd_end
)
1084 hdr
.code
= stream_getc(s
);
1085 hdr
.length
= stream_getc(s
);
1087 if ((stream_get_getp(s
) + hdr
.length
)
1091 if (hdr
.code
== CAPABILITY_CODE_AS4
) {
1092 if (BGP_DEBUG(as4
, AS4
))
1094 "[AS4] found AS4 capability, about to parse");
1095 as4
= bgp_capability_as4(peer
, &hdr
);
1099 stream_forward_getp(s
, hdr
.length
);
1105 stream_set_getp(s
, orig_getp
);
1110 * Parse open option.
1112 * @param[out] mp_capability @see bgp_capability_parse() for semantics.
1114 int bgp_open_option_parse(struct peer
*peer
, uint8_t length
, int *mp_capability
)
1118 uint8_t error_data
[BGP_MAX_PACKET_SIZE
];
1119 struct stream
*s
= BGP_INPUT(peer
);
1120 size_t end
= stream_get_getp(s
) + length
;
1124 if (bgp_debug_neighbor_events(peer
))
1125 zlog_debug("%s rcv OPEN w/ OPTION parameter len: %u",
1126 peer
->host
, length
);
1128 while (stream_get_getp(s
) < end
) {
1132 /* Must have at least an OPEN option header */
1133 if (STREAM_READABLE(s
) < 2) {
1134 zlog_info("%s Option length error", peer
->host
);
1135 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1136 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1140 /* Fetch option type and length. */
1141 opt_type
= stream_getc(s
);
1142 opt_length
= stream_getc(s
);
1144 /* Option length check. */
1145 if (STREAM_READABLE(s
) < opt_length
) {
1146 zlog_info("%s Option length error", peer
->host
);
1147 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1148 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1152 if (bgp_debug_neighbor_events(peer
))
1154 "%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
1155 peer
->host
, opt_type
,
1156 opt_type
== BGP_OPEN_OPT_AUTH
1158 : opt_type
== BGP_OPEN_OPT_CAP
1164 case BGP_OPEN_OPT_AUTH
:
1165 ret
= bgp_auth_parse(peer
, opt_length
);
1167 case BGP_OPEN_OPT_CAP
:
1168 ret
= bgp_capability_parse(peer
, opt_length
,
1169 mp_capability
, &error
);
1172 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1173 BGP_NOTIFY_OPEN_UNSUP_PARAM
);
1178 /* Parse error. To accumulate all unsupported capability codes,
1179 bgp_capability_parse does not return -1 when encounter
1180 unsupported capability code. To detect that, please check
1181 error and erro_data pointer, like below. */
1186 /* All OPEN option is parsed. Check capability when strict compare
1188 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
)) {
1189 /* If Unsupported Capability exists. */
1190 if (error
!= error_data
) {
1191 bgp_notify_send_with_data(peer
, BGP_NOTIFY_OPEN_ERR
,
1192 BGP_NOTIFY_OPEN_UNSUP_CAPBL
,
1194 error
- error_data
);
1198 /* Check local capability does not negotiated with remote
1200 if (!strict_capability_same(peer
)) {
1201 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1202 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
1207 /* Check there are no common AFI/SAFIs and send Unsupported Capability
1210 && !CHECK_FLAG(peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
)) {
1211 if (!peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
1212 && !peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
1213 && !peer
->afc_nego
[AFI_IP
][SAFI_LABELED_UNICAST
]
1214 && !peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
1215 && !peer
->afc_nego
[AFI_IP
][SAFI_ENCAP
]
1216 && !peer
->afc_nego
[AFI_IP
][SAFI_FLOWSPEC
]
1217 && !peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
1218 && !peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
]
1219 && !peer
->afc_nego
[AFI_IP6
][SAFI_LABELED_UNICAST
]
1220 && !peer
->afc_nego
[AFI_IP6
][SAFI_MPLS_VPN
]
1221 && !peer
->afc_nego
[AFI_IP6
][SAFI_ENCAP
]
1222 && !peer
->afc_nego
[AFI_IP6
][SAFI_FLOWSPEC
]
1223 && !peer
->afc_nego
[AFI_L2VPN
][SAFI_EVPN
]) {
1224 flog_err(EC_BGP_PKT_OPEN
,
1225 "%s [Error] Configured AFI/SAFIs do not "
1226 "overlap with received MP capabilities",
1229 if (error
!= error_data
)
1230 bgp_notify_send_with_data(
1231 peer
, BGP_NOTIFY_OPEN_ERR
,
1232 BGP_NOTIFY_OPEN_UNSUP_CAPBL
, error_data
,
1233 error
- error_data
);
1235 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1236 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
1243 static void bgp_open_capability_orf(struct stream
*s
, struct peer
*peer
,
1244 afi_t afi
, safi_t safi
, uint8_t code
)
1250 unsigned long numberp
;
1251 int number_of_orfs
= 0;
1253 iana_safi_t pkt_safi
;
1255 /* Convert AFI, SAFI to values for packet. */
1256 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
, &pkt_safi
);
1258 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1259 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1260 stream_putc(s
, 0); /* Capability Length */
1261 stream_putc(s
, code
); /* Capability Code */
1262 orfp
= stream_get_endp(s
); /* Set ORF Len Pointer */
1263 stream_putc(s
, 0); /* ORF Length */
1264 stream_putw(s
, pkt_afi
);
1266 stream_putc(s
, pkt_safi
);
1267 numberp
= stream_get_endp(s
); /* Set Number Pointer */
1268 stream_putc(s
, 0); /* Number of ORFs */
1270 /* Address Prefix ORF */
1271 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
1272 || CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
)) {
1273 stream_putc(s
, (code
== CAPABILITY_CODE_ORF
1275 : ORF_TYPE_PREFIX_OLD
));
1277 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1278 PEER_FLAG_ORF_PREFIX_SM
)
1279 && CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1280 PEER_FLAG_ORF_PREFIX_RM
)) {
1281 SET_FLAG(peer
->af_cap
[afi
][safi
],
1282 PEER_CAP_ORF_PREFIX_SM_ADV
);
1283 SET_FLAG(peer
->af_cap
[afi
][safi
],
1284 PEER_CAP_ORF_PREFIX_RM_ADV
);
1285 stream_putc(s
, ORF_MODE_BOTH
);
1286 } else if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1287 PEER_FLAG_ORF_PREFIX_SM
)) {
1288 SET_FLAG(peer
->af_cap
[afi
][safi
],
1289 PEER_CAP_ORF_PREFIX_SM_ADV
);
1290 stream_putc(s
, ORF_MODE_SEND
);
1292 SET_FLAG(peer
->af_cap
[afi
][safi
],
1293 PEER_CAP_ORF_PREFIX_RM_ADV
);
1294 stream_putc(s
, ORF_MODE_RECEIVE
);
1299 /* Total Number of ORFs. */
1300 stream_putc_at(s
, numberp
, number_of_orfs
);
1302 /* Total ORF Len. */
1303 orf_len
= stream_get_endp(s
) - orfp
- 1;
1304 stream_putc_at(s
, orfp
, orf_len
);
1306 /* Total Capability Len. */
1307 cap_len
= stream_get_endp(s
) - capp
- 1;
1308 stream_putc_at(s
, capp
, cap_len
);
1311 static void bgp_peer_send_gr_capability(struct stream
*s
, struct peer
*peer
,
1318 iana_safi_t pkt_safi
;
1319 uint32_t restart_time
;
1320 unsigned long capp
= 0;
1321 unsigned long rcapp
= 0;
1323 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
)
1324 && !CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART_HELPER
))
1327 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1328 zlog_debug("[BGP_GR] Sending helper Capability for Peer :%s :",
1331 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
);
1332 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1333 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1334 stream_putc(s
, 0); /* Capability Length */
1335 stream_putc(s
, CAPABILITY_CODE_RESTART
);
1336 /* Set Restart Capability Len Pointer */
1337 rcapp
= stream_get_endp(s
);
1339 restart_time
= peer
->bgp
->restart_time
;
1340 if (peer
->bgp
->t_startup
) {
1341 SET_FLAG(restart_time
, RESTART_R_BIT
);
1342 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_ADV
);
1344 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1345 zlog_debug("[BGP_GR] Sending R-Bit for Peer :%s :",
1349 stream_putw(s
, restart_time
);
1351 /* Send address-family specific graceful-restart capability
1352 * only when GR config is present
1354 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
)) {
1355 if (bgp_flag_check(peer
->bgp
, BGP_FLAG_GR_PRESERVE_FWD
)
1356 && BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1357 zlog_debug("[BGP_GR] F bit Set");
1359 FOREACH_AFI_SAFI (afi
, safi
) {
1360 if (!peer
->afc
[afi
][safi
])
1363 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1365 "[BGP_GR] Sending GR Capability for AFI :%d :, SAFI :%d:",
1368 /* Convert AFI, SAFI to values for
1371 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1373 stream_putw(s
, pkt_afi
);
1374 stream_putc(s
, pkt_safi
);
1375 if (bgp_flag_check(peer
->bgp
, BGP_FLAG_GR_PRESERVE_FWD
))
1376 stream_putc(s
, RESTART_F_BIT
);
1382 /* Total Graceful restart capability Len. */
1383 len
= stream_get_endp(s
) - rcapp
- 1;
1384 stream_putc_at(s
, rcapp
, len
);
1386 /* Total Capability Len. */
1387 len
= stream_get_endp(s
) - capp
- 1;
1388 stream_putc_at(s
, capp
, len
);
1391 /* Fill in capability open option to the packet. */
1392 void bgp_open_capability(struct stream
*s
, struct peer
*peer
)
1395 unsigned long cp
, capp
, rcapp
;
1399 iana_safi_t pkt_safi
;
1401 uint8_t afi_safi_count
= 0;
1402 int adv_addpath_tx
= 0;
1404 /* Remember current pointer for Opt Parm Len. */
1405 cp
= stream_get_endp(s
);
1410 /* Do not send capability. */
1411 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
)
1412 || CHECK_FLAG(peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
1415 /* MP capability for configured AFI, SAFI */
1416 FOREACH_AFI_SAFI (afi
, safi
) {
1417 if (peer
->afc
[afi
][safi
]) {
1418 /* Convert AFI, SAFI to values for packet. */
1419 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1422 peer
->afc_adv
[afi
][safi
] = 1;
1423 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1424 stream_putc(s
, CAPABILITY_CODE_MP_LEN
+ 2);
1425 stream_putc(s
, CAPABILITY_CODE_MP
);
1426 stream_putc(s
, CAPABILITY_CODE_MP_LEN
);
1427 stream_putw(s
, pkt_afi
);
1429 stream_putc(s
, pkt_safi
);
1431 /* Extended nexthop capability - currently
1432 * supporting RFC-5549 for
1433 * Link-Local peering only
1435 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
)
1436 && peer
->su
.sa
.sa_family
== AF_INET6
1438 && (safi
== SAFI_UNICAST
|| safi
== SAFI_MPLS_VPN
1439 || safi
== SAFI_LABELED_UNICAST
)) {
1440 /* RFC 5549 Extended Next Hop Encoding
1442 SET_FLAG(peer
->cap
, PEER_CAP_ENHE_ADV
);
1443 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1444 stream_putc(s
, CAPABILITY_CODE_ENHE_LEN
+ 2);
1445 stream_putc(s
, CAPABILITY_CODE_ENHE
);
1446 stream_putc(s
, CAPABILITY_CODE_ENHE_LEN
);
1448 SET_FLAG(peer
->af_cap
[AFI_IP
][safi
],
1449 PEER_CAP_ENHE_AF_ADV
);
1450 stream_putw(s
, pkt_afi
);
1451 stream_putw(s
, pkt_safi
);
1452 stream_putw(s
, afi_int2iana(AFI_IP6
));
1454 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
1455 PEER_CAP_ENHE_AF_RCV
))
1456 SET_FLAG(peer
->af_cap
[afi
][safi
],
1457 PEER_CAP_ENHE_AF_NEGO
);
1462 /* Route refresh. */
1463 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_ADV
);
1464 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1465 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1466 stream_putc(s
, CAPABILITY_CODE_REFRESH_OLD
);
1467 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1468 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1469 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1470 stream_putc(s
, CAPABILITY_CODE_REFRESH
);
1471 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1474 SET_FLAG(peer
->cap
, PEER_CAP_AS4_ADV
);
1475 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1476 stream_putc(s
, CAPABILITY_CODE_AS4_LEN
+ 2);
1477 stream_putc(s
, CAPABILITY_CODE_AS4
);
1478 stream_putc(s
, CAPABILITY_CODE_AS4_LEN
);
1479 if (peer
->change_local_as
)
1480 local_as
= peer
->change_local_as
;
1482 local_as
= peer
->local_as
;
1483 stream_putl(s
, local_as
);
1486 FOREACH_AFI_SAFI (afi
, safi
) {
1487 if (peer
->afc
[afi
][safi
]) {
1490 /* Only advertise addpath TX if a feature that
1493 if (peer
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
1498 SET_FLAG(peer
->cap
, PEER_CAP_ADDPATH_ADV
);
1499 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1500 stream_putc(s
, (CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
) + 2);
1501 stream_putc(s
, CAPABILITY_CODE_ADDPATH
);
1502 stream_putc(s
, CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
);
1504 FOREACH_AFI_SAFI (afi
, safi
) {
1505 if (peer
->afc
[afi
][safi
]) {
1506 /* Convert AFI, SAFI to values for packet. */
1507 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1510 stream_putw(s
, pkt_afi
);
1511 stream_putc(s
, pkt_safi
);
1513 if (adv_addpath_tx
) {
1514 stream_putc(s
, BGP_ADDPATH_RX
| BGP_ADDPATH_TX
);
1515 SET_FLAG(peer
->af_cap
[afi
][safi
],
1516 PEER_CAP_ADDPATH_AF_RX_ADV
);
1517 SET_FLAG(peer
->af_cap
[afi
][safi
],
1518 PEER_CAP_ADDPATH_AF_TX_ADV
);
1520 stream_putc(s
, BGP_ADDPATH_RX
);
1521 SET_FLAG(peer
->af_cap
[afi
][safi
],
1522 PEER_CAP_ADDPATH_AF_RX_ADV
);
1523 UNSET_FLAG(peer
->af_cap
[afi
][safi
],
1524 PEER_CAP_ADDPATH_AF_TX_ADV
);
1529 /* ORF capability. */
1530 FOREACH_AFI_SAFI (afi
, safi
) {
1531 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1532 PEER_FLAG_ORF_PREFIX_SM
)
1533 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1534 PEER_FLAG_ORF_PREFIX_RM
)) {
1535 bgp_open_capability_orf(s
, peer
, afi
, safi
,
1536 CAPABILITY_CODE_ORF_OLD
);
1537 bgp_open_capability_orf(s
, peer
, afi
, safi
,
1538 CAPABILITY_CODE_ORF
);
1542 /* Dynamic capability. */
1543 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
)) {
1544 SET_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_ADV
);
1545 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1546 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1547 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_OLD
);
1548 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1549 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1550 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1551 stream_putc(s
, CAPABILITY_CODE_DYNAMIC
);
1552 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1555 /* Hostname capability */
1556 if (cmd_hostname_get()) {
1557 SET_FLAG(peer
->cap
, PEER_CAP_HOSTNAME_ADV
);
1558 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1559 rcapp
= stream_get_endp(s
); /* Ptr to length placeholder */
1560 stream_putc(s
, 0); /* dummy len for now */
1561 stream_putc(s
, CAPABILITY_CODE_FQDN
);
1562 capp
= stream_get_endp(s
);
1563 stream_putc(s
, 0); /* dummy len for now */
1564 len
= strlen(cmd_hostname_get());
1565 if (len
> BGP_MAX_HOSTNAME
)
1566 len
= BGP_MAX_HOSTNAME
;
1568 stream_putc(s
, len
);
1569 stream_put(s
, cmd_hostname_get(), len
);
1570 if (cmd_domainname_get()) {
1571 len
= strlen(cmd_domainname_get());
1572 if (len
> BGP_MAX_HOSTNAME
)
1573 len
= BGP_MAX_HOSTNAME
;
1575 stream_putc(s
, len
);
1576 stream_put(s
, cmd_domainname_get(), len
);
1578 stream_putc(s
, 0); /* 0 length */
1580 /* Set the lengths straight */
1581 len
= stream_get_endp(s
) - rcapp
- 1;
1582 stream_putc_at(s
, rcapp
, len
);
1583 len
= stream_get_endp(s
) - capp
- 1;
1584 stream_putc_at(s
, capp
, len
);
1586 if (bgp_debug_neighbor_events(peer
))
1588 "%s Sending hostname cap with hn = %s, dn = %s",
1589 peer
->host
, cmd_hostname_get(),
1590 cmd_domainname_get());
1593 bgp_peer_send_gr_capability(s
, peer
, cp
);
1595 /* Total Opt Parm Len. */
1596 len
= stream_get_endp(s
) - cp
- 1;
1597 stream_putc_at(s
, cp
, len
);