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
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
,
1324 PEER_FLAG_GRACEFUL_RESTART
)) ||
1325 (CHECK_FLAG(peer
->flags
,
1326 PEER_FLAG_GRACEFUL_RESTART_HELPER
))) {
1328 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1330 "BGP_GR:: Sending helper Capability for Peer :%s :",
1333 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
);
1334 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1335 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1336 stream_putc(s
, 0); /* Capability Length */
1337 stream_putc(s
, CAPABILITY_CODE_RESTART
);
1338 /* Set Restart Capability Len Pointer */
1339 rcapp
= stream_get_endp(s
);
1341 restart_time
= peer
->bgp
->restart_time
;
1342 if (peer
->bgp
->t_startup
) {
1343 SET_FLAG(restart_time
, RESTART_R_BIT
);
1344 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_ADV
);
1346 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1348 "BGP_GR:: Sending R-Bit for Peer :%s :",
1352 stream_putw(s
, restart_time
);
1354 /* Send address-family specific graceful-restart capability
1355 * only when GR config is present
1357 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
)) {
1358 FOREACH_AFI_SAFI (afi
, safi
) {
1359 if (peer
->afc
[afi
][safi
]) {
1360 if (BGP_DEBUG(graceful_restart
,
1363 "BGP_GR:: Sending GR Capability for AFI :%d :, SAFI :%d:",
1366 /* Convert AFI, SAFI to values for
1369 bgp_map_afi_safi_int2iana(afi
,
1372 stream_putw(s
, pkt_afi
);
1373 stream_putc(s
, pkt_safi
);
1374 if (bgp_flag_check(peer
->bgp
,
1375 BGP_FLAG_GR_PRESERVE_FWD
)) {
1376 stream_putc(s
, RESTART_F_BIT
);
1384 /* Total Graceful restart capability Len. */
1385 len
= stream_get_endp(s
) - rcapp
- 1;
1386 stream_putc_at(s
, rcapp
, len
);
1388 /* Total Capability Len. */
1389 len
= stream_get_endp(s
) - capp
- 1;
1390 stream_putc_at(s
, capp
, len
);
1394 /* Fill in capability open option to the packet. */
1395 void bgp_open_capability(struct stream
*s
, struct peer
*peer
)
1398 unsigned long cp
, capp
, rcapp
;
1402 iana_safi_t pkt_safi
;
1404 uint8_t afi_safi_count
= 0;
1405 int adv_addpath_tx
= 0;
1407 /* Remember current pointer for Opt Parm Len. */
1408 cp
= stream_get_endp(s
);
1413 /* Do not send capability. */
1414 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
)
1415 || CHECK_FLAG(peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
1418 /* MP capability for configured AFI, SAFI */
1419 FOREACH_AFI_SAFI (afi
, safi
) {
1420 if (peer
->afc
[afi
][safi
]) {
1421 /* Convert AFI, SAFI to values for packet. */
1422 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1425 peer
->afc_adv
[afi
][safi
] = 1;
1426 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1427 stream_putc(s
, CAPABILITY_CODE_MP_LEN
+ 2);
1428 stream_putc(s
, CAPABILITY_CODE_MP
);
1429 stream_putc(s
, CAPABILITY_CODE_MP_LEN
);
1430 stream_putw(s
, pkt_afi
);
1432 stream_putc(s
, pkt_safi
);
1434 /* Extended nexthop capability - currently
1435 * supporting RFC-5549 for
1436 * Link-Local peering only
1438 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
)
1439 && peer
->su
.sa
.sa_family
== AF_INET6
1441 && (safi
== SAFI_UNICAST
1442 || safi
== SAFI_LABELED_UNICAST
)) {
1443 /* RFC 5549 Extended Next Hop Encoding
1445 SET_FLAG(peer
->cap
, PEER_CAP_ENHE_ADV
);
1446 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1447 stream_putc(s
, CAPABILITY_CODE_ENHE_LEN
+ 2);
1448 stream_putc(s
, CAPABILITY_CODE_ENHE
);
1449 stream_putc(s
, CAPABILITY_CODE_ENHE_LEN
);
1451 SET_FLAG(peer
->af_cap
[AFI_IP
][safi
],
1452 PEER_CAP_ENHE_AF_ADV
);
1453 stream_putw(s
, pkt_afi
);
1454 stream_putw(s
, pkt_safi
);
1455 stream_putw(s
, afi_int2iana(AFI_IP6
));
1457 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
1458 PEER_CAP_ENHE_AF_RCV
))
1459 SET_FLAG(peer
->af_cap
[afi
][safi
],
1460 PEER_CAP_ENHE_AF_NEGO
);
1465 /* Route refresh. */
1466 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_ADV
);
1467 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1468 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1469 stream_putc(s
, CAPABILITY_CODE_REFRESH_OLD
);
1470 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1471 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1472 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1473 stream_putc(s
, CAPABILITY_CODE_REFRESH
);
1474 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1477 SET_FLAG(peer
->cap
, PEER_CAP_AS4_ADV
);
1478 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1479 stream_putc(s
, CAPABILITY_CODE_AS4_LEN
+ 2);
1480 stream_putc(s
, CAPABILITY_CODE_AS4
);
1481 stream_putc(s
, CAPABILITY_CODE_AS4_LEN
);
1482 if (peer
->change_local_as
)
1483 local_as
= peer
->change_local_as
;
1485 local_as
= peer
->local_as
;
1486 stream_putl(s
, local_as
);
1489 FOREACH_AFI_SAFI (afi
, safi
) {
1490 if (peer
->afc
[afi
][safi
]) {
1493 /* Only advertise addpath TX if a feature that
1496 if (peer
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
1501 SET_FLAG(peer
->cap
, PEER_CAP_ADDPATH_ADV
);
1502 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1503 stream_putc(s
, (CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
) + 2);
1504 stream_putc(s
, CAPABILITY_CODE_ADDPATH
);
1505 stream_putc(s
, CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
);
1507 FOREACH_AFI_SAFI (afi
, safi
) {
1508 if (peer
->afc
[afi
][safi
]) {
1509 /* Convert AFI, SAFI to values for packet. */
1510 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1513 stream_putw(s
, pkt_afi
);
1514 stream_putc(s
, pkt_safi
);
1516 if (adv_addpath_tx
) {
1517 stream_putc(s
, BGP_ADDPATH_RX
| BGP_ADDPATH_TX
);
1518 SET_FLAG(peer
->af_cap
[afi
][safi
],
1519 PEER_CAP_ADDPATH_AF_RX_ADV
);
1520 SET_FLAG(peer
->af_cap
[afi
][safi
],
1521 PEER_CAP_ADDPATH_AF_TX_ADV
);
1523 stream_putc(s
, BGP_ADDPATH_RX
);
1524 SET_FLAG(peer
->af_cap
[afi
][safi
],
1525 PEER_CAP_ADDPATH_AF_RX_ADV
);
1526 UNSET_FLAG(peer
->af_cap
[afi
][safi
],
1527 PEER_CAP_ADDPATH_AF_TX_ADV
);
1532 /* ORF capability. */
1533 FOREACH_AFI_SAFI (afi
, safi
) {
1534 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1535 PEER_FLAG_ORF_PREFIX_SM
)
1536 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1537 PEER_FLAG_ORF_PREFIX_RM
)) {
1538 bgp_open_capability_orf(s
, peer
, afi
, safi
,
1539 CAPABILITY_CODE_ORF_OLD
);
1540 bgp_open_capability_orf(s
, peer
, afi
, safi
,
1541 CAPABILITY_CODE_ORF
);
1545 /* Dynamic capability. */
1546 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
)) {
1547 SET_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_ADV
);
1548 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1549 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1550 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_OLD
);
1551 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1552 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1553 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1554 stream_putc(s
, CAPABILITY_CODE_DYNAMIC
);
1555 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1558 /* Hostname capability */
1559 if (cmd_hostname_get()) {
1560 SET_FLAG(peer
->cap
, PEER_CAP_HOSTNAME_ADV
);
1561 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1562 rcapp
= stream_get_endp(s
); /* Ptr to length placeholder */
1563 stream_putc(s
, 0); /* dummy len for now */
1564 stream_putc(s
, CAPABILITY_CODE_FQDN
);
1565 capp
= stream_get_endp(s
);
1566 stream_putc(s
, 0); /* dummy len for now */
1567 len
= strlen(cmd_hostname_get());
1568 if (len
> BGP_MAX_HOSTNAME
)
1569 len
= BGP_MAX_HOSTNAME
;
1571 stream_putc(s
, len
);
1572 stream_put(s
, cmd_hostname_get(), len
);
1573 if (cmd_domainname_get()) {
1574 len
= strlen(cmd_domainname_get());
1575 if (len
> BGP_MAX_HOSTNAME
)
1576 len
= BGP_MAX_HOSTNAME
;
1578 stream_putc(s
, len
);
1579 stream_put(s
, cmd_domainname_get(), len
);
1581 stream_putc(s
, 0); /* 0 length */
1583 /* Set the lengths straight */
1584 len
= stream_get_endp(s
) - rcapp
- 1;
1585 stream_putc_at(s
, rcapp
, len
);
1586 len
= stream_get_endp(s
) - capp
- 1;
1587 stream_putc_at(s
, capp
, len
);
1589 if (bgp_debug_neighbor_events(peer
))
1591 "%s Sending hostname cap with hn = %s, dn = %s",
1592 peer
->host
, cmd_hostname_get(),
1593 cmd_domainname_get());
1596 bgp_peer_send_gr_capability(s
, peer
, cp
);
1598 /* Total Opt Parm Len. */
1599 len
= stream_get_endp(s
) - cp
- 1;
1600 stream_putc_at(s
, cp
, len
);