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 static const struct message capcode_str
[] = {
46 {CAPABILITY_CODE_MP
, "MultiProtocol Extensions"},
47 {CAPABILITY_CODE_REFRESH
, "Route Refresh"},
48 {CAPABILITY_CODE_ORF
, "Cooperative Route Filtering"},
49 {CAPABILITY_CODE_RESTART
, "Graceful Restart"},
50 {CAPABILITY_CODE_AS4
, "4-octet AS number"},
51 {CAPABILITY_CODE_ADDPATH
, "AddPath"},
52 {CAPABILITY_CODE_DYNAMIC
, "Dynamic"},
53 {CAPABILITY_CODE_ENHE
, "Extended Next Hop Encoding"},
54 {CAPABILITY_CODE_DYNAMIC_OLD
, "Dynamic (Old)"},
55 {CAPABILITY_CODE_REFRESH_OLD
, "Route Refresh (Old)"},
56 {CAPABILITY_CODE_ORF_OLD
, "ORF (Old)"},
57 {CAPABILITY_CODE_FQDN
, "FQDN"},
58 {CAPABILITY_CODE_ENHANCED_RR
, "Enhanced Route Refresh"},
59 {CAPABILITY_CODE_EXT_MESSAGE
, "BGP Extended Message"},
60 {CAPABILITY_CODE_LLGR
, "Long-lived BGP Graceful Restart"},
61 {CAPABILITY_CODE_ROLE
, "Role"},
64 /* Minimum sizes for length field of each cap (so not inc. the header) */
65 static const size_t cap_minsizes
[] = {
66 [CAPABILITY_CODE_MP
] = CAPABILITY_CODE_MP_LEN
,
67 [CAPABILITY_CODE_REFRESH
] = CAPABILITY_CODE_REFRESH_LEN
,
68 [CAPABILITY_CODE_ORF
] = CAPABILITY_CODE_ORF_LEN
,
69 [CAPABILITY_CODE_RESTART
] = CAPABILITY_CODE_RESTART_LEN
,
70 [CAPABILITY_CODE_AS4
] = CAPABILITY_CODE_AS4_LEN
,
71 [CAPABILITY_CODE_ADDPATH
] = CAPABILITY_CODE_ADDPATH_LEN
,
72 [CAPABILITY_CODE_DYNAMIC
] = CAPABILITY_CODE_DYNAMIC_LEN
,
73 [CAPABILITY_CODE_DYNAMIC_OLD
] = CAPABILITY_CODE_DYNAMIC_LEN
,
74 [CAPABILITY_CODE_ENHE
] = CAPABILITY_CODE_ENHE_LEN
,
75 [CAPABILITY_CODE_REFRESH_OLD
] = CAPABILITY_CODE_REFRESH_LEN
,
76 [CAPABILITY_CODE_ORF_OLD
] = CAPABILITY_CODE_ORF_LEN
,
77 [CAPABILITY_CODE_FQDN
] = CAPABILITY_CODE_MIN_FQDN_LEN
,
78 [CAPABILITY_CODE_ENHANCED_RR
] = CAPABILITY_CODE_ENHANCED_LEN
,
79 [CAPABILITY_CODE_EXT_MESSAGE
] = CAPABILITY_CODE_EXT_MESSAGE_LEN
,
80 [CAPABILITY_CODE_LLGR
] = CAPABILITY_CODE_LLGR_LEN
,
81 [CAPABILITY_CODE_ROLE
] = CAPABILITY_CODE_ROLE_LEN
,
84 /* value the capability must be a multiple of.
85 * 0-data capabilities won't be checked against this.
86 * Other capabilities whose data doesn't fall on convenient boundaries for this
87 * table should be set to 1.
89 static const size_t cap_modsizes
[] = {
90 [CAPABILITY_CODE_MP
] = 4,
91 [CAPABILITY_CODE_REFRESH
] = 1,
92 [CAPABILITY_CODE_ORF
] = 1,
93 [CAPABILITY_CODE_RESTART
] = 1,
94 [CAPABILITY_CODE_AS4
] = 4,
95 [CAPABILITY_CODE_ADDPATH
] = 4,
96 [CAPABILITY_CODE_DYNAMIC
] = 1,
97 [CAPABILITY_CODE_DYNAMIC_OLD
] = 1,
98 [CAPABILITY_CODE_ENHE
] = 6,
99 [CAPABILITY_CODE_REFRESH_OLD
] = 1,
100 [CAPABILITY_CODE_ORF_OLD
] = 1,
101 [CAPABILITY_CODE_FQDN
] = 1,
102 [CAPABILITY_CODE_ENHANCED_RR
] = 1,
103 [CAPABILITY_CODE_EXT_MESSAGE
] = 1,
104 [CAPABILITY_CODE_LLGR
] = 1,
105 [CAPABILITY_CODE_ROLE
] = 1,
108 /* BGP-4 Multiprotocol Extentions lead us to the complex world. We can
109 negotiate remote peer supports extentions or not. But if
110 remote-peer doesn't supports negotiation process itself. We would
111 like to do manual configuration.
113 So there is many configurable point. First of all we want set each
114 peer whether we send capability negotiation to the peer or not.
115 Next, if we send capability to the peer we want to set my capability
116 inforation at each peer. */
118 void bgp_capability_vty_out(struct vty
*vty
, struct peer
*peer
, bool use_json
,
119 json_object
*json_neigh
)
123 struct capability_mp_data mpc
;
124 struct capability_header
*hdr
;
125 json_object
*json_cap
= NULL
;
128 json_cap
= json_object_new_object();
130 pnt
= peer
->notify
.data
;
131 end
= pnt
+ peer
->notify
.length
;
134 if (pnt
+ sizeof(struct capability_mp_data
) + 2 > end
)
137 hdr
= (struct capability_header
*)pnt
;
138 if (pnt
+ hdr
->length
+ 2 > end
)
141 memcpy(&mpc
, pnt
+ 2, sizeof(struct capability_mp_data
));
143 if (hdr
->code
== CAPABILITY_CODE_MP
) {
147 (void)bgp_map_afi_safi_iana2int(ntohs(mpc
.afi
),
148 mpc
.safi
, &afi
, &safi
);
153 json_object_string_add(
155 "capabilityErrorMultiProtocolAfi",
159 json_object_string_add(
161 "capabilityErrorMultiProtocolAfi",
165 json_object_string_add(
167 "capabilityErrorMultiProtocolAfi",
174 "capabilityErrorMultiProtocolAfiUnknown",
180 json_object_string_add(
182 "capabilityErrorMultiProtocolSafi",
186 json_object_string_add(
188 "capabilityErrorMultiProtocolSafi",
191 case SAFI_LABELED_UNICAST
:
192 json_object_string_add(
194 "capabilityErrorMultiProtocolSafi",
198 json_object_string_add(
200 "capabilityErrorMultiProtocolSafi",
204 json_object_string_add(
206 "capabilityErrorMultiProtocolSafi",
210 json_object_string_add(
212 "capabilityErrorMultiProtocolSafi",
216 json_object_string_add(
218 "capabilityErrorMultiProtocolSafi",
225 "capabilityErrorMultiProtocolSafiUnknown",
231 " Capability error for: Multi protocol ");
234 vty_out(vty
, "AFI IPv4, ");
237 vty_out(vty
, "AFI IPv6, ");
240 vty_out(vty
, "AFI L2VPN, ");
244 vty_out(vty
, "AFI Unknown %d, ",
250 vty_out(vty
, "SAFI Unicast");
253 vty_out(vty
, "SAFI Multicast");
255 case SAFI_LABELED_UNICAST
:
256 vty_out(vty
, "SAFI Labeled-unicast");
259 vty_out(vty
, "SAFI MPLS-labeled VPN");
262 vty_out(vty
, "SAFI ENCAP");
265 vty_out(vty
, "SAFI FLOWSPEC");
268 vty_out(vty
, "SAFI EVPN");
272 vty_out(vty
, "SAFI Unknown %d ",
278 } else if (hdr
->code
>= 128) {
282 "capabilityErrorVendorSpecificCapabilityCode",
286 " Capability error: vendor specific capability code %d",
292 "capabilityErrorUnknownCapabilityCode",
296 " Capability error: unknown capability code %d",
299 pnt
+= hdr
->length
+ 2;
302 json_object_object_add(json_neigh
, "capabilityErrors",
306 static void bgp_capability_mp_data(struct stream
*s
,
307 struct capability_mp_data
*mpc
)
309 mpc
->afi
= stream_getw(s
);
310 mpc
->reserved
= stream_getc(s
);
311 mpc
->safi
= stream_getc(s
);
314 /* Set negotiated capability value. */
315 static int bgp_capability_mp(struct peer
*peer
, struct capability_header
*hdr
)
317 struct capability_mp_data mpc
;
318 struct stream
*s
= BGP_INPUT(peer
);
322 /* Verify length is 4 */
323 if (hdr
->length
!= 4) {
325 EC_BGP_CAPABILITY_INVALID_LENGTH
,
326 "MP Cap: Received invalid length %d, non-multiple of 4",
331 bgp_capability_mp_data(s
, &mpc
);
333 if (bgp_debug_neighbor_events(peer
))
334 zlog_debug("%s OPEN has %s capability for afi/safi: %s/%s",
335 peer
->host
, lookup_msg(capcode_str
, hdr
->code
, NULL
),
336 iana_afi2str(mpc
.afi
), iana_safi2str(mpc
.safi
));
338 /* Convert AFI, SAFI to internal values, check. */
339 if (bgp_map_afi_safi_iana2int(mpc
.afi
, mpc
.safi
, &afi
, &safi
))
342 /* Now safi remapped, and afi/safi are valid array indices */
343 peer
->afc_recv
[afi
][safi
] = 1;
345 if (peer
->afc
[afi
][safi
])
346 peer
->afc_nego
[afi
][safi
] = 1;
353 static void bgp_capability_orf_not_support(struct peer
*peer
, iana_afi_t afi
,
354 iana_safi_t safi
, uint8_t type
,
357 if (bgp_debug_neighbor_events(peer
))
359 "%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
360 peer
->host
, afi
, safi
, type
, mode
);
363 static const struct message orf_type_str
[] = {
364 {ORF_TYPE_RESERVED
, "Reserved"},
365 {ORF_TYPE_PREFIX
, "Prefixlist"},
366 {ORF_TYPE_PREFIX_OLD
, "Prefixlist (old)"},
369 static const struct message orf_mode_str
[] = {{ORF_MODE_RECEIVE
, "Receive"},
370 {ORF_MODE_SEND
, "Send"},
371 {ORF_MODE_BOTH
, "Both"},
374 static int bgp_capability_orf_entry(struct peer
*peer
,
375 struct capability_header
*hdr
)
377 struct stream
*s
= BGP_INPUT(peer
);
378 struct capability_mp_data mpc
;
382 iana_safi_t pkt_safi
;
386 uint16_t sm_cap
= 0; /* capability send-mode receive */
387 uint16_t rm_cap
= 0; /* capability receive-mode receive */
390 /* ORF Entry header */
391 bgp_capability_mp_data(s
, &mpc
);
392 num
= stream_getc(s
);
396 if (bgp_debug_neighbor_events(peer
))
397 zlog_debug("%s ORF Cap entry for afi/safi: %s/%s", peer
->host
,
398 iana_afi2str(mpc
.afi
), iana_safi2str(mpc
.safi
));
400 /* Convert AFI, SAFI to internal values, check. */
401 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
403 "%s Addr-family %d/%d not supported. Ignoring the ORF capability",
404 peer
->host
, pkt_afi
, pkt_safi
);
411 /* validate number field */
412 if (CAPABILITY_CODE_ORF_LEN
+ (num
* 2) > hdr
->length
) {
414 "%s ORF Capability entry length error, Cap length %u, num %u",
415 peer
->host
, hdr
->length
, num
);
416 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
417 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
421 for (i
= 0; i
< num
; i
++) {
422 type
= stream_getc(s
);
423 mode
= stream_getc(s
);
425 /* ORF Mode error check */
429 case ORF_MODE_RECEIVE
:
432 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
436 /* ORF Type and afi/safi error checks */
437 /* capcode versus type */
439 case CAPABILITY_CODE_ORF
:
441 case ORF_TYPE_RESERVED
:
442 if (bgp_debug_neighbor_events(peer
))
444 "%s Addr-family %d/%d has reserved ORF type, ignoring",
445 peer
->host
, afi
, safi
);
447 case ORF_TYPE_PREFIX
:
450 bgp_capability_orf_not_support(
451 peer
, pkt_afi
, pkt_safi
, type
, mode
);
455 case CAPABILITY_CODE_ORF_OLD
:
457 case ORF_TYPE_RESERVED
:
458 if (bgp_debug_neighbor_events(peer
))
460 "%s Addr-family %d/%d has reserved ORF type, ignoring",
461 peer
->host
, afi
, safi
);
463 case ORF_TYPE_PREFIX_OLD
:
466 bgp_capability_orf_not_support(
467 peer
, pkt_afi
, pkt_safi
, type
, mode
);
472 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
478 if (!((afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
479 || (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
480 || (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
))) {
481 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
486 if (bgp_debug_neighbor_events(peer
))
488 "%s OPEN has %s ORF capability as %s for afi/safi: %s/%s",
490 lookup_msg(orf_type_str
, type
, NULL
),
491 lookup_msg(orf_mode_str
, mode
, NULL
),
492 iana_afi2str(pkt_afi
), iana_safi2str(pkt_safi
));
494 if (hdr
->code
== CAPABILITY_CODE_ORF
) {
495 sm_cap
= PEER_CAP_ORF_PREFIX_SM_RCV
;
496 rm_cap
= PEER_CAP_ORF_PREFIX_RM_RCV
;
497 } else if (hdr
->code
== CAPABILITY_CODE_ORF_OLD
) {
498 sm_cap
= PEER_CAP_ORF_PREFIX_SM_OLD_RCV
;
499 rm_cap
= PEER_CAP_ORF_PREFIX_RM_OLD_RCV
;
501 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
508 SET_FLAG(peer
->af_cap
[afi
][safi
], sm_cap
);
509 SET_FLAG(peer
->af_cap
[afi
][safi
], rm_cap
);
512 SET_FLAG(peer
->af_cap
[afi
][safi
], sm_cap
);
514 case ORF_MODE_RECEIVE
:
515 SET_FLAG(peer
->af_cap
[afi
][safi
], rm_cap
);
522 static int bgp_capability_restart(struct peer
*peer
,
523 struct capability_header
*caphdr
)
525 struct stream
*s
= BGP_INPUT(peer
);
526 uint16_t restart_flag_time
;
527 size_t end
= stream_get_getp(s
) + caphdr
->length
;
529 /* Verify length is a multiple of 4 */
530 if ((caphdr
->length
- 2) % 4) {
532 EC_BGP_CAPABILITY_INVALID_LENGTH
,
533 "Restart Cap: Received invalid length %d, non-multiple of 4",
538 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
);
539 restart_flag_time
= stream_getw(s
);
541 /* The most significant bit is defined in [RFC4724] as
542 * the Restart State ("R") bit.
544 if (CHECK_FLAG(restart_flag_time
, GRACEFUL_RESTART_R_BIT
))
545 SET_FLAG(peer
->cap
, PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV
);
547 UNSET_FLAG(peer
->cap
, PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV
);
549 /* The second most significant bit is defined in this
550 * document as the Graceful Notification ("N") bit.
552 if (CHECK_FLAG(restart_flag_time
, GRACEFUL_RESTART_N_BIT
))
553 SET_FLAG(peer
->cap
, PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV
);
555 UNSET_FLAG(peer
->cap
, PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV
);
557 UNSET_FLAG(restart_flag_time
, 0xF000);
558 peer
->v_gr_restart
= restart_flag_time
;
560 if (bgp_debug_neighbor_events(peer
)) {
562 "%s Peer has%srestarted. Restart Time: %d, N-bit set: %s",
564 CHECK_FLAG(peer
->cap
,
565 PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV
)
569 CHECK_FLAG(peer
->cap
,
570 PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV
)
575 while (stream_get_getp(s
) + 4 <= end
) {
578 iana_afi_t pkt_afi
= stream_getw(s
);
579 iana_safi_t pkt_safi
= stream_getc(s
);
580 uint8_t flag
= stream_getc(s
);
582 /* Convert AFI, SAFI to internal values, check. */
583 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
584 if (bgp_debug_neighbor_events(peer
))
586 "%s Addr-family %s/%s(afi/safi) not supported. Ignore the Graceful Restart capability for this AFI/SAFI",
587 peer
->host
, iana_afi2str(pkt_afi
),
588 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. Ignore the Graceful Restart capability",
593 peer
->host
, iana_afi2str(pkt_afi
),
594 iana_safi2str(pkt_safi
));
596 if (bgp_debug_neighbor_events(peer
))
598 "%s Address family %s is%spreserved",
599 peer
->host
, get_afi_safi_str(afi
, safi
, false),
601 peer
->af_cap
[afi
][safi
],
602 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
606 SET_FLAG(peer
->af_cap
[afi
][safi
],
607 PEER_CAP_RESTART_AF_RCV
);
608 if (CHECK_FLAG(flag
, GRACEFUL_RESTART_F_BIT
))
609 SET_FLAG(peer
->af_cap
[afi
][safi
],
610 PEER_CAP_RESTART_AF_PRESERVE_RCV
);
616 static int bgp_capability_llgr(struct peer
*peer
,
617 struct capability_header
*caphdr
)
619 struct stream
*s
= BGP_INPUT(peer
);
620 size_t end
= stream_get_getp(s
) + caphdr
->length
;
622 SET_FLAG(peer
->cap
, PEER_CAP_LLGR_RCV
);
624 while (stream_get_getp(s
) + 4 <= end
) {
627 iana_afi_t pkt_afi
= stream_getw(s
);
628 iana_safi_t pkt_safi
= stream_getc(s
);
629 uint8_t flags
= stream_getc(s
);
630 uint32_t stale_time
= stream_get3(s
);
632 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
633 if (bgp_debug_neighbor_events(peer
))
635 "%s Addr-family %s/%s(afi/safi) not supported. Ignore the Long-lived Graceful Restart capability for this AFI/SAFI",
636 peer
->host
, iana_afi2str(pkt_afi
),
637 iana_safi2str(pkt_safi
));
638 } else if (!peer
->afc
[afi
][safi
]
639 || !CHECK_FLAG(peer
->af_cap
[afi
][safi
],
640 PEER_CAP_RESTART_AF_RCV
)) {
641 if (bgp_debug_neighbor_events(peer
))
643 "%s Addr-family %s/%s(afi/safi) not enabled. Ignore the Long-lived Graceful Restart capability",
644 peer
->host
, iana_afi2str(pkt_afi
),
645 iana_safi2str(pkt_safi
));
647 if (bgp_debug_neighbor_events(peer
))
649 "%s Addr-family %s/%s(afi/safi) Long-lived Graceful Restart capability stale time %u sec",
650 peer
->host
, iana_afi2str(pkt_afi
),
651 iana_safi2str(pkt_safi
), stale_time
);
653 peer
->llgr
[afi
][safi
].flags
= flags
;
654 peer
->llgr
[afi
][safi
].stale_time
=
655 MIN(stale_time
, peer
->bgp
->llgr_stale_time
);
656 SET_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_LLGR_AF_RCV
);
663 /* Unlike other capability parsing routines, this one returns 0 on error */
664 static as_t
bgp_capability_as4(struct peer
*peer
, struct capability_header
*hdr
)
666 SET_FLAG(peer
->cap
, PEER_CAP_AS4_RCV
);
668 if (hdr
->length
!= CAPABILITY_CODE_AS4_LEN
) {
669 flog_err(EC_BGP_PKT_OPEN
,
670 "%s AS4 capability has incorrect data length %d",
671 peer
->host
, hdr
->length
);
675 as_t as4
= stream_getl(BGP_INPUT(peer
));
677 if (BGP_DEBUG(as4
, AS4
))
679 "%s [AS4] about to set cap PEER_CAP_AS4_RCV, got as4 %u",
684 static int bgp_capability_ext_message(struct peer
*peer
,
685 struct capability_header
*hdr
)
687 if (hdr
->length
!= CAPABILITY_CODE_EXT_MESSAGE_LEN
) {
690 "%s: BGP Extended Message capability has incorrect data length %d",
691 peer
->host
, hdr
->length
);
695 SET_FLAG(peer
->cap
, PEER_CAP_EXTENDED_MESSAGE_RCV
);
700 static int bgp_capability_addpath(struct peer
*peer
,
701 struct capability_header
*hdr
)
703 struct stream
*s
= BGP_INPUT(peer
);
704 size_t end
= stream_get_getp(s
) + hdr
->length
;
706 SET_FLAG(peer
->cap
, PEER_CAP_ADDPATH_RCV
);
708 /* Verify length is a multiple of 4 */
709 if (hdr
->length
% 4) {
711 EC_BGP_CAPABILITY_INVALID_LENGTH
,
712 "Add Path: Received invalid length %d, non-multiple of 4",
717 while (stream_get_getp(s
) + 4 <= end
) {
720 iana_afi_t pkt_afi
= stream_getw(s
);
721 iana_safi_t pkt_safi
= stream_getc(s
);
722 uint8_t send_receive
= stream_getc(s
);
724 if (bgp_debug_neighbor_events(peer
))
726 "%s OPEN has %s capability for afi/safi: %s/%s%s%s",
728 lookup_msg(capcode_str
, hdr
->code
, NULL
),
729 iana_afi2str(pkt_afi
), iana_safi2str(pkt_safi
),
730 (send_receive
& BGP_ADDPATH_RX
) ? ", receive"
732 (send_receive
& BGP_ADDPATH_TX
) ? ", transmit"
735 /* Convert AFI, SAFI to internal values, check. */
736 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
737 if (bgp_debug_neighbor_events(peer
))
739 "%s Addr-family %s/%s(afi/safi) not supported. Ignore the Addpath Attribute for this AFI/SAFI",
740 peer
->host
, iana_afi2str(pkt_afi
),
741 iana_safi2str(pkt_safi
));
743 } else if (!peer
->afc
[afi
][safi
]) {
744 if (bgp_debug_neighbor_events(peer
))
746 "%s Addr-family %s/%s(afi/safi) not enabled. Ignore the AddPath capability for this AFI/SAFI",
747 peer
->host
, iana_afi2str(pkt_afi
),
748 iana_safi2str(pkt_safi
));
752 if (send_receive
& BGP_ADDPATH_RX
)
753 SET_FLAG(peer
->af_cap
[afi
][safi
],
754 PEER_CAP_ADDPATH_AF_RX_RCV
);
756 if (send_receive
& BGP_ADDPATH_TX
)
757 SET_FLAG(peer
->af_cap
[afi
][safi
],
758 PEER_CAP_ADDPATH_AF_TX_RCV
);
764 static int bgp_capability_enhe(struct peer
*peer
, struct capability_header
*hdr
)
766 struct stream
*s
= BGP_INPUT(peer
);
767 size_t end
= stream_get_getp(s
) + hdr
->length
;
769 /* Verify length is a multiple of 4 */
770 if (hdr
->length
% 6) {
772 EC_BGP_CAPABILITY_INVALID_LENGTH
,
773 "Extended NH: Received invalid length %d, non-multiple of 6",
778 while (stream_get_getp(s
) + 6 <= end
) {
779 iana_afi_t pkt_afi
= stream_getw(s
);
781 iana_safi_t pkt_safi
= stream_getw(s
);
783 iana_afi_t pkt_nh_afi
= stream_getw(s
);
786 if (bgp_debug_neighbor_events(peer
))
788 "%s Received with afi/safi/next-hop afi: %s/%s/%u",
789 peer
->host
, iana_afi2str(pkt_afi
),
790 iana_safi2str(pkt_safi
), pkt_nh_afi
);
792 /* Convert AFI, SAFI to internal values, check. */
793 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
794 if (bgp_debug_neighbor_events(peer
))
796 "%s Addr-family %s/%s(afi/safi) not supported. Ignore the ENHE Attribute for this AFI/SAFI",
797 peer
->host
, iana_afi2str(pkt_afi
),
798 iana_safi2str(pkt_safi
));
802 /* RFC 5549 specifies use of this capability only for IPv4 AFI,
804 * the Nexthop AFI being IPv6. A future spec may introduce other
805 * possibilities, so we ignore other values with a log. Also,
807 * SAFI_UNICAST and SAFI_LABELED_UNICAST are currently supported
810 nh_afi
= afi_iana2int(pkt_nh_afi
);
812 if (afi
!= AFI_IP
|| nh_afi
!= AFI_IP6
813 || !(safi
== SAFI_UNICAST
|| safi
== SAFI_MPLS_VPN
814 || safi
== SAFI_LABELED_UNICAST
)) {
816 EC_BGP_CAPABILITY_INVALID_DATA
,
817 "%s Unexpected afi/safi/next-hop afi: %s/%s/%u in Extended Next-hop capability, ignoring",
818 peer
->host
, iana_afi2str(pkt_afi
),
819 iana_safi2str(pkt_safi
), pkt_nh_afi
);
823 SET_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_ENHE_AF_RCV
);
825 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_ENHE_AF_ADV
))
826 SET_FLAG(peer
->af_cap
[afi
][safi
],
827 PEER_CAP_ENHE_AF_NEGO
);
830 SET_FLAG(peer
->cap
, PEER_CAP_ENHE_RCV
);
835 static int bgp_capability_hostname(struct peer
*peer
,
836 struct capability_header
*hdr
)
838 struct stream
*s
= BGP_INPUT(peer
);
839 char str
[BGP_MAX_HOSTNAME
+ 1];
840 size_t end
= stream_get_getp(s
) + hdr
->length
;
843 SET_FLAG(peer
->cap
, PEER_CAP_HOSTNAME_RCV
);
845 len
= stream_getc(s
);
846 if (stream_get_getp(s
) + len
> end
) {
848 EC_BGP_CAPABILITY_INVALID_DATA
,
849 "%s: Received malformed hostname capability from peer %s",
850 __func__
, peer
->host
);
854 if (len
> BGP_MAX_HOSTNAME
) {
855 stream_get(str
, s
, BGP_MAX_HOSTNAME
);
856 stream_forward_getp(s
, len
- BGP_MAX_HOSTNAME
);
857 len
= BGP_MAX_HOSTNAME
; /* to set the '\0' below */
859 stream_get(str
, s
, len
);
864 XFREE(MTYPE_BGP_PEER_HOST
, peer
->hostname
);
865 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
867 peer
->hostname
= XSTRDUP(MTYPE_BGP_PEER_HOST
, str
);
870 if (stream_get_getp(s
) + 1 > end
) {
872 EC_BGP_CAPABILITY_INVALID_DATA
,
873 "%s: Received invalid domain name len (hostname capability) from peer %s",
874 __func__
, peer
->host
);
878 len
= stream_getc(s
);
879 if (stream_get_getp(s
) + len
> end
) {
881 EC_BGP_CAPABILITY_INVALID_DATA
,
882 "%s: Received runt domain name (hostname capability) from peer %s",
883 __func__
, peer
->host
);
887 if (len
> BGP_MAX_HOSTNAME
) {
888 stream_get(str
, s
, BGP_MAX_HOSTNAME
);
889 stream_forward_getp(s
, len
- BGP_MAX_HOSTNAME
);
890 len
= BGP_MAX_HOSTNAME
; /* to set the '\0' below */
892 stream_get(str
, s
, len
);
897 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
899 peer
->domainname
= XSTRDUP(MTYPE_BGP_PEER_HOST
, str
);
902 if (bgp_debug_neighbor_events(peer
)) {
903 zlog_debug("%s received hostname %s, domainname %s", peer
->host
,
904 peer
->hostname
, peer
->domainname
);
910 static int bgp_capability_role(struct peer
*peer
, struct capability_header
*hdr
)
912 SET_FLAG(peer
->cap
, PEER_CAP_ROLE_RCV
);
913 if (hdr
->length
!= CAPABILITY_CODE_ROLE_LEN
) {
914 flog_warn(EC_BGP_CAPABILITY_INVALID_LENGTH
,
915 "Role: Received invalid length %d", hdr
->length
);
918 uint8_t role
= stream_getc(BGP_INPUT(peer
));
920 peer
->remote_role
= role
;
925 * Parse given capability.
926 * XXX: This is reading into a stream, but not using stream API
928 * @param[out] mp_capability Set to 1 on return iff one or more Multiprotocol
929 * capabilities were encountered.
931 static int bgp_capability_parse(struct peer
*peer
, size_t length
,
932 int *mp_capability
, uint8_t **error
)
935 struct stream
*s
= BGP_INPUT(peer
);
936 size_t end
= stream_get_getp(s
) + length
;
937 uint16_t restart_flag_time
= 0;
939 assert(STREAM_READABLE(s
) >= length
);
941 while (stream_get_getp(s
) < end
) {
943 uint8_t *sp
= stream_pnt(s
);
944 struct capability_header caphdr
;
947 /* We need at least capability code and capability length. */
948 if (stream_get_getp(s
) + 2 > end
) {
949 zlog_info("%s Capability length error (< header)",
951 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
952 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
956 caphdr
.code
= stream_getc(s
);
957 caphdr
.length
= stream_getc(s
);
958 start
= stream_get_getp(s
);
960 /* Capability length check sanity check. */
961 if (start
+ caphdr
.length
> end
) {
962 zlog_info("%s Capability length error (< length)",
964 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
965 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
969 if (bgp_debug_neighbor_events(peer
))
970 zlog_debug("%s OPEN has %s capability (%u), length %u",
972 lookup_msg(capcode_str
, caphdr
.code
, NULL
),
973 caphdr
.code
, caphdr
.length
);
975 /* Length sanity check, type-specific, for known capabilities */
976 switch (caphdr
.code
) {
977 case CAPABILITY_CODE_MP
:
978 case CAPABILITY_CODE_REFRESH
:
979 case CAPABILITY_CODE_REFRESH_OLD
:
980 case CAPABILITY_CODE_ORF
:
981 case CAPABILITY_CODE_ORF_OLD
:
982 case CAPABILITY_CODE_RESTART
:
983 case CAPABILITY_CODE_AS4
:
984 case CAPABILITY_CODE_ADDPATH
:
985 case CAPABILITY_CODE_DYNAMIC
:
986 case CAPABILITY_CODE_DYNAMIC_OLD
:
987 case CAPABILITY_CODE_ENHE
:
988 case CAPABILITY_CODE_FQDN
:
989 case CAPABILITY_CODE_ENHANCED_RR
:
990 case CAPABILITY_CODE_EXT_MESSAGE
:
991 case CAPABILITY_CODE_ROLE
:
993 if (caphdr
.length
< cap_minsizes
[caphdr
.code
]) {
995 "%s %s Capability length error: got %u, expected at least %u",
997 lookup_msg(capcode_str
, caphdr
.code
,
1000 (unsigned)cap_minsizes
[caphdr
.code
]);
1001 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1002 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1006 && caphdr
.length
% cap_modsizes
[caphdr
.code
] != 0) {
1008 "%s %s Capability length error: got %u, expected a multiple of %u",
1010 lookup_msg(capcode_str
, caphdr
.code
,
1013 (unsigned)cap_modsizes
[caphdr
.code
]);
1014 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1015 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1018 /* we deliberately ignore unknown codes, see below */
1023 switch (caphdr
.code
) {
1024 case CAPABILITY_CODE_MP
: {
1027 /* Ignore capability when override-capability is set. */
1028 if (!CHECK_FLAG(peer
->flags
,
1029 PEER_FLAG_OVERRIDE_CAPABILITY
)) {
1030 /* Set negotiated value. */
1031 ret
= bgp_capability_mp(peer
, &caphdr
);
1033 /* Unsupported Capability. */
1035 /* Store return data. */
1036 memcpy(*error
, sp
, caphdr
.length
+ 2);
1037 *error
+= caphdr
.length
+ 2;
1039 ret
= 0; /* Don't return error for this */
1042 case CAPABILITY_CODE_ENHANCED_RR
:
1043 case CAPABILITY_CODE_REFRESH
:
1044 case CAPABILITY_CODE_REFRESH_OLD
: {
1045 /* BGP refresh capability */
1046 if (caphdr
.code
== CAPABILITY_CODE_ENHANCED_RR
)
1047 SET_FLAG(peer
->cap
, PEER_CAP_ENHANCED_RR_RCV
);
1048 else if (caphdr
.code
== CAPABILITY_CODE_REFRESH_OLD
)
1049 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
);
1051 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
);
1053 case CAPABILITY_CODE_ORF
:
1054 case CAPABILITY_CODE_ORF_OLD
:
1055 ret
= bgp_capability_orf_entry(peer
, &caphdr
);
1057 case CAPABILITY_CODE_RESTART
:
1058 ret
= bgp_capability_restart(peer
, &caphdr
);
1060 case CAPABILITY_CODE_LLGR
:
1061 ret
= bgp_capability_llgr(peer
, &caphdr
);
1063 case CAPABILITY_CODE_DYNAMIC
:
1064 case CAPABILITY_CODE_DYNAMIC_OLD
:
1065 SET_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
);
1067 case CAPABILITY_CODE_AS4
:
1068 /* Already handled as a special-case parsing of the
1070 * at the beginning of OPEN processing. So we care not a
1072 * for the value really, only error case.
1074 if (!bgp_capability_as4(peer
, &caphdr
))
1077 case CAPABILITY_CODE_ADDPATH
:
1078 ret
= bgp_capability_addpath(peer
, &caphdr
);
1080 case CAPABILITY_CODE_ENHE
:
1081 ret
= bgp_capability_enhe(peer
, &caphdr
);
1083 case CAPABILITY_CODE_EXT_MESSAGE
:
1084 ret
= bgp_capability_ext_message(peer
, &caphdr
);
1086 case CAPABILITY_CODE_FQDN
:
1087 ret
= bgp_capability_hostname(peer
, &caphdr
);
1089 case CAPABILITY_CODE_ROLE
:
1090 ret
= bgp_capability_role(peer
, &caphdr
);
1093 if (caphdr
.code
> 128) {
1094 /* We don't send Notification for unknown vendor
1096 capabilities. It seems reasonable for now...
1098 flog_warn(EC_BGP_CAPABILITY_VENDOR
,
1099 "%s Vendor specific capability %d",
1100 peer
->host
, caphdr
.code
);
1103 EC_BGP_CAPABILITY_UNKNOWN
,
1104 "%s unrecognized capability code: %d - ignored",
1105 peer
->host
, caphdr
.code
);
1106 memcpy(*error
, sp
, caphdr
.length
+ 2);
1107 *error
+= caphdr
.length
+ 2;
1112 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1113 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1116 if (stream_get_getp(s
) != (start
+ caphdr
.length
)) {
1117 if (stream_get_getp(s
) > (start
+ caphdr
.length
))
1119 EC_BGP_CAPABILITY_INVALID_LENGTH
,
1120 "%s Cap-parser for %s read past cap-length, %u!",
1122 lookup_msg(capcode_str
, caphdr
.code
,
1125 stream_set_getp(s
, start
+ caphdr
.length
);
1128 if (!CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
1129 UNSET_FLAG(restart_flag_time
, 0xF000);
1130 peer
->v_gr_restart
= restart_flag_time
;
1136 static bool strict_capability_same(struct peer
*peer
)
1140 for (i
= AFI_IP
; i
< AFI_MAX
; i
++)
1141 for (j
= SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
1142 if (peer
->afc
[i
][j
] != peer
->afc_nego
[i
][j
])
1148 static bool bgp_role_violation(struct peer
*peer
)
1150 uint8_t local_role
= peer
->local_role
;
1151 uint8_t remote_role
= peer
->remote_role
;
1153 if (local_role
!= ROLE_UNDEFINED
&& remote_role
!= ROLE_UNDEFINED
&&
1154 !((local_role
== ROLE_PEER
&& remote_role
== ROLE_PEER
) ||
1155 (local_role
== ROLE_PROVIDER
&& remote_role
== ROLE_CUSTOMER
) ||
1156 (local_role
== ROLE_CUSTOMER
&& remote_role
== ROLE_PROVIDER
) ||
1157 (local_role
== ROLE_RS_SERVER
&& remote_role
== ROLE_RS_CLIENT
) ||
1158 (local_role
== ROLE_RS_CLIENT
&&
1159 remote_role
== ROLE_RS_SERVER
))) {
1160 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1161 BGP_NOTIFY_OPEN_ROLE_MISMATCH
);
1164 if (remote_role
== ROLE_UNDEFINED
&&
1165 CHECK_FLAG(peer
->flags
, PEER_FLAG_ROLE_STRICT_MODE
)) {
1166 const char *err_msg
=
1167 "Strict mode. Please set the role on your side.";
1168 bgp_notify_send_with_data(peer
, BGP_NOTIFY_OPEN_ERR
,
1169 BGP_NOTIFY_OPEN_ROLE_MISMATCH
,
1170 (uint8_t *)err_msg
, strlen(err_msg
));
1177 /* peek into option, stores ASN to *as4 if the AS4 capability was found.
1178 * Returns 0 if no as4 found, as4cap value otherwise.
1180 as_t
peek_for_as4_capability(struct peer
*peer
, uint16_t length
)
1182 struct stream
*s
= BGP_INPUT(peer
);
1183 size_t orig_getp
= stream_get_getp(s
);
1184 size_t end
= orig_getp
+ length
;
1187 if (BGP_DEBUG(as4
, AS4
))
1189 "%s [AS4] rcv OPEN w/ OPTION parameter len: %u, peeking for as4",
1190 peer
->host
, length
);
1191 /* the error cases we DONT handle, we ONLY try to read as4 out of
1192 * correctly formatted options.
1194 while (stream_get_getp(s
) < end
) {
1196 uint16_t opt_length
;
1198 /* Ensure we can read the option type */
1199 if (stream_get_getp(s
) + 1 > end
)
1202 /* Fetch the option type */
1203 opt_type
= stream_getc(s
);
1206 * Check the length and fetch the opt_length
1207 * If the peer is BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer)
1208 * then we do a getw which is 2 bytes. So we need to
1209 * ensure that we can read that as well
1211 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer
)) {
1212 if (stream_get_getp(s
) + 2 > end
)
1215 opt_length
= stream_getw(s
);
1217 if (stream_get_getp(s
) + 1 > end
)
1220 opt_length
= stream_getc(s
);
1223 /* Option length check. */
1224 if (stream_get_getp(s
) + opt_length
> end
)
1227 if (opt_type
== BGP_OPEN_OPT_CAP
) {
1228 unsigned long capd_start
= stream_get_getp(s
);
1229 unsigned long capd_end
= capd_start
+ opt_length
;
1231 assert(capd_end
<= end
);
1233 while (stream_get_getp(s
) < capd_end
) {
1234 struct capability_header hdr
;
1236 if (stream_get_getp(s
) + 2 > capd_end
)
1239 hdr
.code
= stream_getc(s
);
1240 hdr
.length
= stream_getc(s
);
1242 if ((stream_get_getp(s
) + hdr
.length
)
1246 if (hdr
.code
== CAPABILITY_CODE_AS4
) {
1247 if (BGP_DEBUG(as4
, AS4
))
1249 "[AS4] found AS4 capability, about to parse");
1250 as4
= bgp_capability_as4(peer
, &hdr
);
1254 stream_forward_getp(s
, hdr
.length
);
1260 stream_set_getp(s
, orig_getp
);
1265 * Parse open option.
1267 * @param[out] mp_capability @see bgp_capability_parse() for semantics.
1269 int bgp_open_option_parse(struct peer
*peer
, uint16_t length
,
1274 uint8_t error_data
[BGP_STANDARD_MESSAGE_MAX_PACKET_SIZE
];
1275 struct stream
*s
= BGP_INPUT(peer
);
1276 size_t end
= stream_get_getp(s
) + length
;
1280 if (bgp_debug_neighbor_events(peer
))
1281 zlog_debug("%s rcv OPEN w/ OPTION parameter len: %u",
1282 peer
->host
, length
);
1284 /* Unset any previously received GR capability. */
1285 UNSET_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
);
1287 while (stream_get_getp(s
) < end
) {
1289 uint16_t opt_length
;
1292 * Check that we can read the opt_type and fetch it
1294 if (STREAM_READABLE(s
) < 1) {
1295 zlog_info("%s Option length error", peer
->host
);
1296 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1297 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1300 opt_type
= stream_getc(s
);
1303 * Check the length of the stream to ensure that
1304 * FRR can properly read the opt_length. Then read it
1306 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(peer
)) {
1307 if (STREAM_READABLE(s
) < 2) {
1308 zlog_info("%s Option length error", peer
->host
);
1309 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1310 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1314 opt_length
= stream_getw(s
);
1316 if (STREAM_READABLE(s
) < 1) {
1317 zlog_info("%s Option length error", peer
->host
);
1318 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1319 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1323 opt_length
= stream_getc(s
);
1326 /* Option length check. */
1327 if (STREAM_READABLE(s
) < opt_length
) {
1328 zlog_info("%s Option length error (%d)", peer
->host
,
1330 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1331 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1335 if (bgp_debug_neighbor_events(peer
))
1337 "%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
1338 peer
->host
, opt_type
,
1339 opt_type
== BGP_OPEN_OPT_CAP
? "Capability"
1344 case BGP_OPEN_OPT_CAP
:
1345 ret
= bgp_capability_parse(peer
, opt_length
,
1346 mp_capability
, &error
);
1349 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1350 BGP_NOTIFY_OPEN_UNSUP_PARAM
);
1355 /* Parse error. To accumulate all unsupported capability codes,
1356 bgp_capability_parse does not return -1 when encounter
1357 unsupported capability code. To detect that, please check
1358 error and erro_data pointer, like below. */
1363 /* All OPEN option is parsed. Check capability when strict compare
1365 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
)) {
1366 /* If Unsupported Capability exists. */
1367 if (error
!= error_data
) {
1368 bgp_notify_send_with_data(peer
, BGP_NOTIFY_OPEN_ERR
,
1369 BGP_NOTIFY_OPEN_UNSUP_CAPBL
,
1371 error
- error_data
);
1375 /* Check local capability does not negotiated with remote
1377 if (!strict_capability_same(peer
)) {
1378 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1379 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
1384 /* Extended Message Support */
1385 peer
->max_packet_size
=
1386 (CHECK_FLAG(peer
->cap
, PEER_CAP_EXTENDED_MESSAGE_RCV
)
1387 && CHECK_FLAG(peer
->cap
, PEER_CAP_EXTENDED_MESSAGE_ADV
))
1388 ? BGP_EXTENDED_MESSAGE_MAX_PACKET_SIZE
1389 : BGP_STANDARD_MESSAGE_MAX_PACKET_SIZE
;
1391 /* Check that roles are corresponding to each other */
1392 if (bgp_role_violation(peer
))
1395 /* Check there are no common AFI/SAFIs and send Unsupported Capability
1398 && !CHECK_FLAG(peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
)) {
1399 if (!peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
1400 && !peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
1401 && !peer
->afc_nego
[AFI_IP
][SAFI_LABELED_UNICAST
]
1402 && !peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
1403 && !peer
->afc_nego
[AFI_IP
][SAFI_ENCAP
]
1404 && !peer
->afc_nego
[AFI_IP
][SAFI_FLOWSPEC
]
1405 && !peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
1406 && !peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
]
1407 && !peer
->afc_nego
[AFI_IP6
][SAFI_LABELED_UNICAST
]
1408 && !peer
->afc_nego
[AFI_IP6
][SAFI_MPLS_VPN
]
1409 && !peer
->afc_nego
[AFI_IP6
][SAFI_ENCAP
]
1410 && !peer
->afc_nego
[AFI_IP6
][SAFI_FLOWSPEC
]
1411 && !peer
->afc_nego
[AFI_L2VPN
][SAFI_EVPN
]) {
1412 flog_err(EC_BGP_PKT_OPEN
,
1413 "%s [Error] Configured AFI/SAFIs do not overlap with received MP capabilities",
1416 if (error
!= error_data
)
1417 bgp_notify_send_with_data(
1418 peer
, BGP_NOTIFY_OPEN_ERR
,
1419 BGP_NOTIFY_OPEN_UNSUP_CAPBL
, error_data
,
1420 error
- error_data
);
1422 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1423 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
1430 static void bgp_open_capability_orf(struct stream
*s
, struct peer
*peer
,
1431 afi_t afi
, safi_t safi
, uint8_t code
,
1432 bool ext_opt_params
)
1438 unsigned long numberp
;
1439 int number_of_orfs
= 0;
1440 iana_afi_t pkt_afi
= IANA_AFI_IPV4
;
1441 iana_safi_t pkt_safi
= IANA_SAFI_UNICAST
;
1443 /* Convert AFI, SAFI to values for packet. */
1444 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
, &pkt_safi
);
1446 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1447 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1448 ext_opt_params
? stream_putw(s
, 0)
1449 : stream_putc(s
, 0); /* Capability Length */
1450 stream_putc(s
, code
); /* Capability Code */
1451 orfp
= stream_get_endp(s
); /* Set ORF Len Pointer */
1452 stream_putc(s
, 0); /* ORF Length */
1453 stream_putw(s
, pkt_afi
);
1455 stream_putc(s
, pkt_safi
);
1456 numberp
= stream_get_endp(s
); /* Set Number Pointer */
1457 stream_putc(s
, 0); /* Number of ORFs */
1459 /* Address Prefix ORF */
1460 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
1461 || CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
)) {
1462 stream_putc(s
, (code
== CAPABILITY_CODE_ORF
1464 : ORF_TYPE_PREFIX_OLD
));
1466 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1467 PEER_FLAG_ORF_PREFIX_SM
)
1468 && CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1469 PEER_FLAG_ORF_PREFIX_RM
)) {
1470 SET_FLAG(peer
->af_cap
[afi
][safi
],
1471 PEER_CAP_ORF_PREFIX_SM_ADV
);
1472 SET_FLAG(peer
->af_cap
[afi
][safi
],
1473 PEER_CAP_ORF_PREFIX_RM_ADV
);
1474 stream_putc(s
, ORF_MODE_BOTH
);
1475 } else if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1476 PEER_FLAG_ORF_PREFIX_SM
)) {
1477 SET_FLAG(peer
->af_cap
[afi
][safi
],
1478 PEER_CAP_ORF_PREFIX_SM_ADV
);
1479 stream_putc(s
, ORF_MODE_SEND
);
1481 SET_FLAG(peer
->af_cap
[afi
][safi
],
1482 PEER_CAP_ORF_PREFIX_RM_ADV
);
1483 stream_putc(s
, ORF_MODE_RECEIVE
);
1488 /* Total Number of ORFs. */
1489 stream_putc_at(s
, numberp
, number_of_orfs
);
1491 /* Total ORF Len. */
1492 orf_len
= stream_get_endp(s
) - orfp
- 1;
1493 stream_putc_at(s
, orfp
, orf_len
);
1495 /* Total Capability Len. */
1496 cap_len
= stream_get_endp(s
) - capp
- 1;
1497 ext_opt_params
? stream_putw_at(s
, capp
, cap_len
)
1498 : stream_putc_at(s
, capp
, cap_len
);
1501 static void bgp_peer_send_gr_capability(struct stream
*s
, struct peer
*peer
,
1502 bool ext_opt_params
)
1505 iana_afi_t pkt_afi
= IANA_AFI_IPV4
;
1508 iana_safi_t pkt_safi
= IANA_SAFI_UNICAST
;
1509 uint32_t restart_time
;
1510 unsigned long capp
= 0;
1511 unsigned long rcapp
= 0;
1513 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
)
1514 && !CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART_HELPER
))
1517 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1518 zlog_debug("[BGP_GR] Sending helper Capability for Peer :%s :",
1521 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
);
1522 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1523 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1524 ext_opt_params
? stream_putw(s
, 0)
1525 : stream_putc(s
, 0); /* Capability Length */
1526 stream_putc(s
, CAPABILITY_CODE_RESTART
);
1527 /* Set Restart Capability Len Pointer */
1528 rcapp
= stream_get_endp(s
);
1530 restart_time
= peer
->bgp
->restart_time
;
1531 if (peer
->bgp
->t_startup
) {
1532 SET_FLAG(restart_time
, GRACEFUL_RESTART_R_BIT
);
1533 SET_FLAG(peer
->cap
, PEER_CAP_GRACEFUL_RESTART_R_BIT_ADV
);
1534 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1535 zlog_debug("[BGP_GR] Sending R-Bit for peer: %s",
1539 if (CHECK_FLAG(peer
->bgp
->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
)) {
1540 SET_FLAG(restart_time
, GRACEFUL_RESTART_N_BIT
);
1541 SET_FLAG(peer
->cap
, PEER_CAP_GRACEFUL_RESTART_N_BIT_ADV
);
1542 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1543 zlog_debug("[BGP_GR] Sending N-Bit for peer: %s",
1547 stream_putw(s
, restart_time
);
1549 /* Send address-family specific graceful-restart capability
1550 * only when GR config is present
1552 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
)) {
1553 if (CHECK_FLAG(peer
->bgp
->flags
, BGP_FLAG_GR_PRESERVE_FWD
)
1554 && BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1555 zlog_debug("[BGP_GR] F bit Set");
1557 FOREACH_AFI_SAFI (afi
, safi
) {
1558 if (!peer
->afc
[afi
][safi
])
1561 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
1563 "[BGP_GR] Sending GR Capability for AFI :%d :, SAFI :%d:",
1566 /* Convert AFI, SAFI to values for
1569 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1571 stream_putw(s
, pkt_afi
);
1572 stream_putc(s
, pkt_safi
);
1573 if (CHECK_FLAG(peer
->bgp
->flags
,
1574 BGP_FLAG_GR_PRESERVE_FWD
))
1575 stream_putc(s
, GRACEFUL_RESTART_F_BIT
);
1581 /* Total Graceful restart capability Len. */
1582 len
= stream_get_endp(s
) - rcapp
- 1;
1583 stream_putc_at(s
, rcapp
, len
);
1585 /* Total Capability Len. */
1586 len
= stream_get_endp(s
) - capp
- 1;
1587 ext_opt_params
? stream_putw_at(s
, capp
, len
- 1)
1588 : stream_putc_at(s
, capp
, len
);
1591 static void bgp_peer_send_llgr_capability(struct stream
*s
, struct peer
*peer
,
1592 bool ext_opt_params
)
1595 iana_afi_t pkt_afi
= IANA_AFI_IPV4
;
1598 iana_safi_t pkt_safi
= IANA_SAFI_UNICAST
;
1599 unsigned long capp
= 0;
1600 unsigned long rcapp
= 0;
1602 if (!CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
))
1605 SET_FLAG(peer
->cap
, PEER_CAP_LLGR_ADV
);
1607 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1608 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1609 ext_opt_params
? stream_putw(s
, 0)
1610 : stream_putc(s
, 0); /* Capability Length */
1611 stream_putc(s
, CAPABILITY_CODE_LLGR
);
1613 rcapp
= stream_get_endp(s
);
1616 FOREACH_AFI_SAFI (afi
, safi
) {
1617 if (!peer
->afc
[afi
][safi
])
1620 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
, &pkt_safi
);
1622 stream_putw(s
, pkt_afi
);
1623 stream_putc(s
, pkt_safi
);
1624 stream_putc(s
, LLGR_F_BIT
);
1625 stream_put3(s
, peer
->bgp
->llgr_stale_time
);
1627 SET_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_LLGR_AF_ADV
);
1630 /* Total Long-lived Graceful Restart capability Len. */
1631 len
= stream_get_endp(s
) - rcapp
- 1;
1632 stream_putc_at(s
, rcapp
, len
);
1634 /* Total Capability Len. */
1635 len
= stream_get_endp(s
) - capp
- 1;
1636 ext_opt_params
? stream_putw_at(s
, capp
, len
- 1)
1637 : stream_putc_at(s
, capp
, len
);
1640 /* Fill in capability open option to the packet. */
1641 uint16_t bgp_open_capability(struct stream
*s
, struct peer
*peer
,
1642 bool ext_opt_params
)
1645 unsigned long cp
, capp
, rcapp
, eopl
= 0;
1646 iana_afi_t pkt_afi
= IANA_AFI_IPV4
;
1649 iana_safi_t pkt_safi
= IANA_SAFI_UNICAST
;
1651 uint8_t afi_safi_count
= 0;
1652 bool adv_addpath_tx
= false;
1654 /* Non-Ext OP Len. */
1655 cp
= stream_get_endp(s
);
1658 if (ext_opt_params
) {
1659 /* Non-Ext OP Len. */
1660 stream_putc_at(s
, cp
, BGP_OPEN_NON_EXT_OPT_LEN
);
1662 /* Non-Ext OP Type */
1663 stream_putc(s
, BGP_OPEN_NON_EXT_OPT_TYPE_EXTENDED_LENGTH
);
1665 /* Extended Opt. Parm. Length */
1666 eopl
= stream_get_endp(s
);
1670 /* Do not send capability. */
1671 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
)
1672 || CHECK_FLAG(peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
1675 /* MP capability for configured AFI, SAFI */
1676 FOREACH_AFI_SAFI (afi
, safi
) {
1677 if (peer
->afc
[afi
][safi
]) {
1678 /* Convert AFI, SAFI to values for packet. */
1679 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1682 peer
->afc_adv
[afi
][safi
] = 1;
1683 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1685 ? stream_putw(s
, CAPABILITY_CODE_MP_LEN
+ 2)
1686 : stream_putc(s
, CAPABILITY_CODE_MP_LEN
+ 2);
1687 stream_putc(s
, CAPABILITY_CODE_MP
);
1688 stream_putc(s
, CAPABILITY_CODE_MP_LEN
);
1689 stream_putw(s
, pkt_afi
);
1691 stream_putc(s
, pkt_safi
);
1693 /* Extended nexthop capability - currently
1694 * supporting RFC-5549 for
1695 * Link-Local peering only
1697 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
)
1698 && peer
->su
.sa
.sa_family
== AF_INET6
1700 && (safi
== SAFI_UNICAST
|| safi
== SAFI_MPLS_VPN
1701 || safi
== SAFI_LABELED_UNICAST
)) {
1702 /* RFC 5549 Extended Next Hop Encoding
1704 SET_FLAG(peer
->cap
, PEER_CAP_ENHE_ADV
);
1705 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1708 CAPABILITY_CODE_ENHE_LEN
1711 CAPABILITY_CODE_ENHE_LEN
1713 stream_putc(s
, CAPABILITY_CODE_ENHE
);
1714 stream_putc(s
, CAPABILITY_CODE_ENHE_LEN
);
1716 SET_FLAG(peer
->af_cap
[AFI_IP
][safi
],
1717 PEER_CAP_ENHE_AF_ADV
);
1718 stream_putw(s
, pkt_afi
);
1719 stream_putw(s
, pkt_safi
);
1720 stream_putw(s
, afi_int2iana(AFI_IP6
));
1722 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
],
1723 PEER_CAP_ENHE_AF_RCV
))
1724 SET_FLAG(peer
->af_cap
[afi
][safi
],
1725 PEER_CAP_ENHE_AF_NEGO
);
1730 /* Route refresh. */
1731 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_ADV
);
1732 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1733 ext_opt_params
? stream_putw(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2)
1734 : stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1735 stream_putc(s
, CAPABILITY_CODE_REFRESH_OLD
);
1736 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1737 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1738 ext_opt_params
? stream_putw(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2)
1739 : stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1740 stream_putc(s
, CAPABILITY_CODE_REFRESH
);
1741 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1743 /* Enhanced Route Refresh. */
1744 SET_FLAG(peer
->cap
, PEER_CAP_ENHANCED_RR_ADV
);
1745 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1746 ext_opt_params
? stream_putw(s
, CAPABILITY_CODE_ENHANCED_LEN
+ 2)
1747 : stream_putc(s
, CAPABILITY_CODE_ENHANCED_LEN
+ 2);
1748 stream_putc(s
, CAPABILITY_CODE_ENHANCED_RR
);
1749 stream_putc(s
, CAPABILITY_CODE_ENHANCED_LEN
);
1752 SET_FLAG(peer
->cap
, PEER_CAP_AS4_ADV
);
1753 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1754 ext_opt_params
? stream_putw(s
, CAPABILITY_CODE_AS4_LEN
+ 2)
1755 : stream_putc(s
, CAPABILITY_CODE_AS4_LEN
+ 2);
1756 stream_putc(s
, CAPABILITY_CODE_AS4
);
1757 stream_putc(s
, CAPABILITY_CODE_AS4_LEN
);
1758 if (peer
->change_local_as
)
1759 local_as
= peer
->change_local_as
;
1761 local_as
= peer
->local_as
;
1762 stream_putl(s
, local_as
);
1764 /* Extended Message Support */
1765 SET_FLAG(peer
->cap
, PEER_CAP_EXTENDED_MESSAGE_ADV
);
1766 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1767 ext_opt_params
? stream_putw(s
, CAPABILITY_CODE_EXT_MESSAGE_LEN
+ 2)
1768 : stream_putc(s
, CAPABILITY_CODE_EXT_MESSAGE_LEN
+ 2);
1769 stream_putc(s
, CAPABILITY_CODE_EXT_MESSAGE
);
1770 stream_putc(s
, CAPABILITY_CODE_EXT_MESSAGE_LEN
);
1773 if (peer
->local_role
!= ROLE_UNDEFINED
) {
1774 SET_FLAG(peer
->cap
, PEER_CAP_ROLE_ADV
);
1775 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1776 stream_putc(s
, CAPABILITY_CODE_ROLE_LEN
+ 2);
1777 stream_putc(s
, CAPABILITY_CODE_ROLE
);
1778 stream_putc(s
, CAPABILITY_CODE_ROLE_LEN
);
1779 stream_putc(s
, peer
->local_role
);
1783 FOREACH_AFI_SAFI (afi
, safi
) {
1784 if (peer
->afc
[afi
][safi
]) {
1787 /* Only advertise addpath TX if a feature that
1790 if (peer
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
1791 adv_addpath_tx
= true;
1793 /* If we have enabled labeled unicast, we MUST check
1794 * against unicast SAFI because addpath IDs are
1795 * allocated under unicast SAFI, the same as the RIB
1796 * is managed in unicast SAFI.
1798 if (safi
== SAFI_LABELED_UNICAST
)
1799 if (peer
->addpath_type
[afi
][SAFI_UNICAST
] !=
1801 adv_addpath_tx
= true;
1805 SET_FLAG(peer
->cap
, PEER_CAP_ADDPATH_ADV
);
1806 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1808 ? stream_putw(s
, (CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
)
1810 : stream_putc(s
, (CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
)
1812 stream_putc(s
, CAPABILITY_CODE_ADDPATH
);
1813 stream_putc(s
, CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
);
1815 FOREACH_AFI_SAFI (afi
, safi
) {
1816 if (peer
->afc
[afi
][safi
]) {
1817 bool adv_addpath_rx
=
1818 !CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1819 PEER_FLAG_DISABLE_ADDPATH_RX
);
1822 /* Convert AFI, SAFI to values for packet. */
1823 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1826 stream_putw(s
, pkt_afi
);
1827 stream_putc(s
, pkt_safi
);
1829 if (adv_addpath_rx
) {
1830 SET_FLAG(flags
, BGP_ADDPATH_RX
);
1831 SET_FLAG(peer
->af_cap
[afi
][safi
],
1832 PEER_CAP_ADDPATH_AF_RX_ADV
);
1834 UNSET_FLAG(peer
->af_cap
[afi
][safi
],
1835 PEER_CAP_ADDPATH_AF_RX_ADV
);
1838 if (adv_addpath_tx
) {
1839 SET_FLAG(flags
, BGP_ADDPATH_TX
);
1840 SET_FLAG(peer
->af_cap
[afi
][safi
],
1841 PEER_CAP_ADDPATH_AF_TX_ADV
);
1842 if (safi
== SAFI_LABELED_UNICAST
)
1844 peer
->af_cap
[afi
][SAFI_UNICAST
],
1845 PEER_CAP_ADDPATH_AF_TX_ADV
);
1847 UNSET_FLAG(peer
->af_cap
[afi
][safi
],
1848 PEER_CAP_ADDPATH_AF_TX_ADV
);
1851 stream_putc(s
, flags
);
1855 /* ORF capability. */
1856 FOREACH_AFI_SAFI (afi
, safi
) {
1857 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1858 PEER_FLAG_ORF_PREFIX_SM
)
1859 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1860 PEER_FLAG_ORF_PREFIX_RM
)) {
1861 bgp_open_capability_orf(s
, peer
, afi
, safi
,
1862 CAPABILITY_CODE_ORF_OLD
,
1864 bgp_open_capability_orf(s
, peer
, afi
, safi
,
1865 CAPABILITY_CODE_ORF
,
1870 /* Dynamic capability. */
1871 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
)) {
1872 SET_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_ADV
);
1873 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1875 ? stream_putw(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2)
1876 : stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1877 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_OLD
);
1878 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1879 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1881 ? stream_putw(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2)
1882 : stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1883 stream_putc(s
, CAPABILITY_CODE_DYNAMIC
);
1884 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1887 /* Hostname capability */
1888 if (cmd_hostname_get()) {
1889 SET_FLAG(peer
->cap
, PEER_CAP_HOSTNAME_ADV
);
1890 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1891 rcapp
= stream_get_endp(s
); /* Ptr to length placeholder */
1892 ext_opt_params
? stream_putw(s
, 0)
1893 : stream_putc(s
, 0); /* Capability Length */
1894 stream_putc(s
, CAPABILITY_CODE_FQDN
);
1895 capp
= stream_get_endp(s
);
1896 stream_putc(s
, 0); /* dummy len for now */
1897 len
= strlen(cmd_hostname_get());
1898 if (len
> BGP_MAX_HOSTNAME
)
1899 len
= BGP_MAX_HOSTNAME
;
1901 stream_putc(s
, len
);
1902 stream_put(s
, cmd_hostname_get(), len
);
1903 if (cmd_domainname_get()) {
1904 len
= strlen(cmd_domainname_get());
1905 if (len
> BGP_MAX_HOSTNAME
)
1906 len
= BGP_MAX_HOSTNAME
;
1908 stream_putc(s
, len
);
1909 stream_put(s
, cmd_domainname_get(), len
);
1911 stream_putc(s
, 0); /* 0 length */
1913 /* Set the lengths straight */
1914 len
= stream_get_endp(s
) - rcapp
- 1;
1915 ext_opt_params
? stream_putw_at(s
, rcapp
, len
- 1)
1916 : stream_putc_at(s
, rcapp
, len
);
1918 len
= stream_get_endp(s
) - capp
- 1;
1919 stream_putc_at(s
, capp
, len
);
1921 if (bgp_debug_neighbor_events(peer
))
1923 "%s Sending hostname cap with hn = %s, dn = %s",
1924 peer
->host
, cmd_hostname_get(),
1925 cmd_domainname_get());
1928 bgp_peer_send_gr_capability(s
, peer
, ext_opt_params
);
1929 bgp_peer_send_llgr_capability(s
, peer
, ext_opt_params
);
1931 /* Total Opt Parm Len. */
1932 len
= stream_get_endp(s
) - cp
- 1;
1934 if (ext_opt_params
) {
1935 len
= stream_get_endp(s
) - eopl
- 2;
1936 stream_putw_at(s
, eopl
, len
);
1938 stream_putc_at(s
, cp
, len
);