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
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
34 #include "bgpd/bgpd.h"
35 #include "bgpd/bgp_attr.h"
36 #include "bgpd/bgp_debug.h"
37 #include "bgpd/bgp_fsm.h"
38 #include "bgpd/bgp_packet.h"
39 #include "bgpd/bgp_open.h"
40 #include "bgpd/bgp_aspath.h"
41 #include "bgpd/bgp_vty.h"
42 #include "bgpd/bgp_memory.h"
44 /* BGP-4 Multiprotocol Extentions lead us to the complex world. We can
45 negotiate remote peer supports extentions or not. But if
46 remote-peer doesn't supports negotiation process itself. We would
47 like to do manual configuration.
49 So there is many configurable point. First of all we want set each
50 peer whether we send capability negotiation to the peer or not.
51 Next, if we send capability to the peer we want to set my capabilty
52 inforation at each peer. */
54 void bgp_capability_vty_out(struct vty
*vty
, struct peer
*peer
, u_char use_json
,
55 json_object
*json_neigh
)
59 struct capability_mp_data mpc
;
60 struct capability_header
*hdr
;
61 json_object
*json_cap
= NULL
;
64 json_cap
= json_object_new_object();
66 pnt
= peer
->notify
.data
;
67 end
= pnt
+ peer
->notify
.length
;
70 if (pnt
+ sizeof(struct capability_mp_data
) + 2 > end
)
73 hdr
= (struct capability_header
*)pnt
;
74 if (pnt
+ hdr
->length
+ 2 > end
)
77 memcpy(&mpc
, pnt
+ 2, sizeof(struct capability_mp_data
));
79 if (hdr
->code
== CAPABILITY_CODE_MP
) {
83 bgp_map_afi_safi_iana2int(ntohs(mpc
.afi
), mpc
.safi
,
88 json_object_string_add(
90 "capabilityErrorMultiProtocolAfi",
94 json_object_string_add(
96 "capabilityErrorMultiProtocolAfi",
100 json_object_string_add(
102 "capabilityErrorMultiProtocolAfi",
108 "capabilityErrorMultiProtocolAfiUnknown",
114 json_object_string_add(
116 "capabilityErrorMultiProtocolSafi",
120 json_object_string_add(
122 "capabilityErrorMultiProtocolSafi",
126 json_object_string_add(
128 "capabilityErrorMultiProtocolSafi",
132 json_object_string_add(
134 "capabilityErrorMultiProtocolSafi",
138 json_object_string_add(
140 "capabilityErrorMultiProtocolSafi",
146 "capabilityErrorMultiProtocolSafiUnknown",
152 " Capability error for: Multi protocol ");
155 vty_out(vty
, "AFI IPv4, ");
158 vty_out(vty
, "AFI IPv6, ");
161 vty_out(vty
, "AFI L2VPN, ");
164 vty_out(vty
, "AFI Unknown %d, ",
170 vty_out(vty
, "SAFI Unicast");
173 vty_out(vty
, "SAFI Multicast");
176 vty_out(vty
, "SAFI MPLS-labeled VPN");
179 vty_out(vty
, "SAFI ENCAP");
182 vty_out(vty
, "SAFI EVPN");
185 vty_out(vty
, "SAFI Unknown %d ",
189 vty_out(vty
, "%s", VTY_NEWLINE
);
191 } else if (hdr
->code
>= 128) {
195 "capabilityErrorVendorSpecificCapabilityCode",
199 " Capability error: vendor specific capability code %d",
205 "capabilityErrorUnknownCapabilityCode",
209 " Capability error: unknown capability code %d",
212 pnt
+= hdr
->length
+ 2;
215 json_object_object_add(json_neigh
, "capabilityErrors",
219 static void bgp_capability_mp_data(struct stream
*s
,
220 struct capability_mp_data
*mpc
)
222 mpc
->afi
= stream_getw(s
);
223 mpc
->reserved
= stream_getc(s
);
224 mpc
->safi
= stream_getc(s
);
227 /* Set negotiated capability value. */
228 static int bgp_capability_mp(struct peer
*peer
, struct capability_header
*hdr
)
230 struct capability_mp_data mpc
;
231 struct stream
*s
= BGP_INPUT(peer
);
235 /* Verify length is 4 */
236 if (hdr
->length
!= 4) {
238 "MP Cap: Received invalid length %d, non-multiple of 4",
243 bgp_capability_mp_data(s
, &mpc
);
245 if (bgp_debug_neighbor_events(peer
))
246 zlog_debug("%s OPEN has MP_EXT CAP for afi/safi: %u/%u",
247 peer
->host
, mpc
.afi
, mpc
.safi
);
249 /* Convert AFI, SAFI to internal values, check. */
250 if (bgp_map_afi_safi_iana2int(mpc
.afi
, mpc
.safi
, &afi
, &safi
))
253 /* Now safi remapped, and afi/safi are valid array indices */
254 peer
->afc_recv
[afi
][safi
] = 1;
256 if (peer
->afc
[afi
][safi
])
257 peer
->afc_nego
[afi
][safi
] = 1;
264 static void bgp_capability_orf_not_support(struct peer
*peer
, iana_afi_t afi
,
265 safi_t safi
, u_char type
,
268 if (bgp_debug_neighbor_events(peer
))
270 "%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
271 peer
->host
, afi
, safi
, type
, mode
);
274 static const struct message orf_type_str
[] = {
275 {ORF_TYPE_PREFIX
, "Prefixlist"},
276 {ORF_TYPE_PREFIX_OLD
, "Prefixlist (old)"},
279 static const struct message orf_mode_str
[] = {{ORF_MODE_RECEIVE
, "Receive"},
280 {ORF_MODE_SEND
, "Send"},
281 {ORF_MODE_BOTH
, "Both"},
284 static int bgp_capability_orf_entry(struct peer
*peer
,
285 struct capability_header
*hdr
)
287 struct stream
*s
= BGP_INPUT(peer
);
288 struct capability_orf_entry entry
;
291 safi_t pkt_safi
, safi
;
294 u_int16_t sm_cap
= 0; /* capability send-mode receive */
295 u_int16_t rm_cap
= 0; /* capability receive-mode receive */
298 /* ORF Entry header */
299 bgp_capability_mp_data(s
, &entry
.mpc
);
300 entry
.num
= stream_getc(s
);
301 pkt_afi
= entry
.mpc
.afi
;
302 pkt_safi
= entry
.mpc
.safi
;
304 if (bgp_debug_neighbor_events(peer
))
305 zlog_debug("%s ORF Cap entry for afi/safi: %u/%u", peer
->host
,
306 entry
.mpc
.afi
, entry
.mpc
.safi
);
308 /* Convert AFI, SAFI to internal values, check. */
309 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
311 "%s Addr-family %d/%d not supported."
312 " Ignoring the ORF capability",
313 peer
->host
, pkt_afi
, pkt_safi
);
317 entry
.mpc
.afi
= pkt_afi
;
318 entry
.mpc
.safi
= safi
;
320 /* validate number field */
321 if (CAPABILITY_CODE_ORF_LEN
+ (entry
.num
* 2) > hdr
->length
) {
323 "%s ORF Capability entry length error,"
324 " Cap length %u, num %u",
325 peer
->host
, hdr
->length
, entry
.num
);
326 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
327 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
331 for (i
= 0; i
< entry
.num
; i
++) {
332 type
= stream_getc(s
);
333 mode
= stream_getc(s
);
335 /* ORF Mode error check */
339 case ORF_MODE_RECEIVE
:
342 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
346 /* ORF Type and afi/safi error checks */
347 /* capcode versus type */
349 case CAPABILITY_CODE_ORF
:
351 case ORF_TYPE_PREFIX
:
354 bgp_capability_orf_not_support(
355 peer
, pkt_afi
, pkt_safi
, type
, mode
);
359 case CAPABILITY_CODE_ORF_OLD
:
361 case ORF_TYPE_PREFIX_OLD
:
364 bgp_capability_orf_not_support(
365 peer
, pkt_afi
, pkt_safi
, type
, mode
);
370 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
376 if (!((afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
377 || (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
378 || (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
))) {
379 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
384 if (bgp_debug_neighbor_events(peer
))
386 "%s OPEN has %s ORF capability"
387 " as %s for afi/safi: %d/%d",
389 lookup_msg(orf_type_str
, type
, NULL
),
390 lookup_msg(orf_mode_str
, mode
, NULL
), pkt_afi
,
393 if (hdr
->code
== CAPABILITY_CODE_ORF
) {
394 sm_cap
= PEER_CAP_ORF_PREFIX_SM_RCV
;
395 rm_cap
= PEER_CAP_ORF_PREFIX_RM_RCV
;
396 } else if (hdr
->code
== CAPABILITY_CODE_ORF_OLD
) {
397 sm_cap
= PEER_CAP_ORF_PREFIX_SM_OLD_RCV
;
398 rm_cap
= PEER_CAP_ORF_PREFIX_RM_OLD_RCV
;
400 bgp_capability_orf_not_support(peer
, pkt_afi
, pkt_safi
,
407 SET_FLAG(peer
->af_cap
[afi
][safi
], sm_cap
);
408 SET_FLAG(peer
->af_cap
[afi
][safi
], rm_cap
);
411 SET_FLAG(peer
->af_cap
[afi
][safi
], sm_cap
);
413 case ORF_MODE_RECEIVE
:
414 SET_FLAG(peer
->af_cap
[afi
][safi
], rm_cap
);
421 static int bgp_capability_restart(struct peer
*peer
,
422 struct capability_header
*caphdr
)
424 struct stream
*s
= BGP_INPUT(peer
);
425 u_int16_t restart_flag_time
;
426 size_t end
= stream_get_getp(s
) + caphdr
->length
;
428 /* Verify length is a multiple of 4 */
429 if ((caphdr
->length
- 2) % 4) {
431 "Restart Cap: Received invalid length %d, non-multiple of 4",
436 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
);
437 restart_flag_time
= stream_getw(s
);
438 if (CHECK_FLAG(restart_flag_time
, RESTART_R_BIT
))
439 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_RCV
);
441 UNSET_FLAG(restart_flag_time
, 0xF000);
442 peer
->v_gr_restart
= restart_flag_time
;
444 if (bgp_debug_neighbor_events(peer
)) {
445 zlog_debug("%s OPEN has Graceful Restart capability",
447 zlog_debug("%s Peer has%srestarted. Restart Time : %d",
449 CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_RCV
)
455 while (stream_get_getp(s
) + 4 <= end
) {
458 iana_afi_t pkt_afi
= stream_getw(s
);
459 safi_t pkt_safi
= stream_getc(s
);
460 u_char flag
= stream_getc(s
);
462 /* Convert AFI, SAFI to internal values, check. */
463 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
464 if (bgp_debug_neighbor_events(peer
))
466 "%s Addr-family %d/%d(afi/safi) not supported."
467 " Ignore the Graceful Restart capability for this AFI/SAFI",
468 peer
->host
, pkt_afi
, pkt_safi
);
469 } else if (!peer
->afc
[afi
][safi
]) {
470 if (bgp_debug_neighbor_events(peer
))
472 "%s Addr-family %d/%d(afi/safi) not enabled."
473 " Ignore the Graceful Restart capability",
474 peer
->host
, pkt_afi
, pkt_safi
);
476 if (bgp_debug_neighbor_events(peer
))
478 "%s Address family %s is%spreserved",
479 peer
->host
, afi_safi_print(afi
, safi
),
481 peer
->af_cap
[afi
][safi
],
482 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
486 SET_FLAG(peer
->af_cap
[afi
][safi
],
487 PEER_CAP_RESTART_AF_RCV
);
488 if (CHECK_FLAG(flag
, RESTART_F_BIT
))
489 SET_FLAG(peer
->af_cap
[afi
][safi
],
490 PEER_CAP_RESTART_AF_PRESERVE_RCV
);
496 /* Unlike other capability parsing routines, this one returns 0 on error */
497 static as_t
bgp_capability_as4(struct peer
*peer
, struct capability_header
*hdr
)
499 SET_FLAG(peer
->cap
, PEER_CAP_AS4_RCV
);
501 if (hdr
->length
!= CAPABILITY_CODE_AS4_LEN
) {
502 zlog_err("%s AS4 capability has incorrect data length %d",
503 peer
->host
, hdr
->length
);
507 as_t as4
= stream_getl(BGP_INPUT(peer
));
509 if (BGP_DEBUG(as4
, AS4
))
511 "%s [AS4] about to set cap PEER_CAP_AS4_RCV, got as4 %u",
516 static int bgp_capability_addpath(struct peer
*peer
,
517 struct capability_header
*hdr
)
519 struct stream
*s
= BGP_INPUT(peer
);
520 size_t end
= stream_get_getp(s
) + hdr
->length
;
522 SET_FLAG(peer
->cap
, PEER_CAP_ADDPATH_RCV
);
524 /* Verify length is a multiple of 4 */
525 if (hdr
->length
% 4) {
527 "Add Path: Received invalid length %d, non-multiple of 4",
532 while (stream_get_getp(s
) + 4 <= end
) {
535 iana_afi_t pkt_afi
= stream_getw(s
);
536 safi_t pkt_safi
= stream_getc(s
);
537 u_char send_receive
= stream_getc(s
);
539 if (bgp_debug_neighbor_events(peer
))
541 "%s OPEN has AddPath CAP for afi/safi: %u/%u%s%s",
542 peer
->host
, pkt_afi
, pkt_safi
,
543 (send_receive
& BGP_ADDPATH_RX
) ? ", receive"
545 (send_receive
& BGP_ADDPATH_TX
) ? ", transmit"
548 /* Convert AFI, SAFI to internal values, check. */
549 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
550 if (bgp_debug_neighbor_events(peer
))
552 "%s Addr-family %d/%d(afi/safi) not supported."
553 " Ignore the Addpath Attribute for this AFI/SAFI",
554 peer
->host
, pkt_afi
, pkt_safi
);
556 } else if (!peer
->afc
[afi
][safi
]) {
557 if (bgp_debug_neighbor_events(peer
))
559 "%s Addr-family %d/%d(afi/safi) not enabled."
560 " Ignore the AddPath capability for this AFI/SAFI",
561 peer
->host
, pkt_afi
, pkt_safi
);
565 if (send_receive
& BGP_ADDPATH_RX
)
566 SET_FLAG(peer
->af_cap
[afi
][safi
],
567 PEER_CAP_ADDPATH_AF_RX_RCV
);
569 if (send_receive
& BGP_ADDPATH_TX
)
570 SET_FLAG(peer
->af_cap
[afi
][safi
],
571 PEER_CAP_ADDPATH_AF_TX_RCV
);
577 static int bgp_capability_enhe(struct peer
*peer
, struct capability_header
*hdr
)
579 struct stream
*s
= BGP_INPUT(peer
);
580 size_t end
= stream_get_getp(s
) + hdr
->length
;
582 /* Verify length is a multiple of 4 */
583 if (hdr
->length
% 6) {
585 "Extended NH: Received invalid length %d, non-multiple of 6",
590 while (stream_get_getp(s
) + 6 <= end
) {
591 iana_afi_t pkt_afi
= stream_getw(s
);
593 safi_t safi
, pkt_safi
= stream_getw(s
);
594 iana_afi_t pkt_nh_afi
= stream_getw(s
);
597 if (bgp_debug_neighbor_events(peer
))
599 "%s Received with afi/safi/next-hop afi: %u/%u/%u",
600 peer
->host
, pkt_afi
, pkt_safi
, pkt_nh_afi
);
602 /* Convert AFI, SAFI to internal values, check. */
603 if (bgp_map_afi_safi_iana2int(pkt_afi
, pkt_safi
, &afi
, &safi
)) {
604 if (bgp_debug_neighbor_events(peer
))
606 "%s Addr-family %d/%d(afi/safi) not supported."
607 " Ignore the ENHE Attribute for this AFI/SAFI",
608 peer
->host
, pkt_afi
, pkt_safi
);
612 /* RFC 5549 specifies use of this capability only for IPv4 AFI,
614 * the Nexthop AFI being IPv6. A future spec may introduce other
615 * possibilities, so we ignore other values with a log. Also,
617 * Unicast SAFI is currently supported (and expected).
619 nh_afi
= afi_iana2int(pkt_nh_afi
);
621 if (afi
!= AFI_IP
|| safi
!= SAFI_UNICAST
622 || nh_afi
!= AFI_IP6
) {
624 "%s Unexpected afi/safi/next-hop afi: %u/%u/%u "
625 "in Extended Next-hop capability, ignoring",
626 peer
->host
, pkt_afi
, pkt_safi
, pkt_nh_afi
);
630 SET_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_ENHE_AF_RCV
);
632 if (CHECK_FLAG(peer
->af_cap
[afi
][safi
], PEER_CAP_ENHE_AF_ADV
))
633 SET_FLAG(peer
->af_cap
[afi
][safi
],
634 PEER_CAP_ENHE_AF_NEGO
);
637 SET_FLAG(peer
->cap
, PEER_CAP_ENHE_RCV
);
642 static int bgp_capability_hostname(struct peer
*peer
,
643 struct capability_header
*hdr
)
645 struct stream
*s
= BGP_INPUT(peer
);
646 char str
[BGP_MAX_HOSTNAME
+ 1];
647 size_t end
= stream_get_getp(s
) + hdr
->length
;
650 SET_FLAG(peer
->cap
, PEER_CAP_HOSTNAME_RCV
);
652 len
= stream_getc(s
);
653 if (stream_get_getp(s
) + len
> end
) {
655 "%s: Received malformed hostname capability from peer %s",
656 __FUNCTION__
, peer
->host
);
660 if (len
> BGP_MAX_HOSTNAME
) {
661 stream_get(str
, s
, BGP_MAX_HOSTNAME
);
662 stream_forward_getp(s
, len
- BGP_MAX_HOSTNAME
);
663 len
= BGP_MAX_HOSTNAME
; /* to set the '\0' below */
665 stream_get(str
, s
, len
);
670 if (peer
->hostname
!= NULL
) {
671 XFREE(MTYPE_BGP_PEER_HOST
, peer
->hostname
);
672 peer
->hostname
= NULL
;
675 if (peer
->domainname
!= NULL
) {
676 XFREE(MTYPE_BGP_PEER_HOST
, peer
->domainname
);
677 peer
->domainname
= NULL
;
680 peer
->hostname
= XSTRDUP(MTYPE_BGP_PEER_HOST
, str
);
683 if (stream_get_getp(s
) + 1 > end
) {
685 "%s: Received invalid domain name len (hostname capability) from peer %s",
686 __FUNCTION__
, peer
->host
);
690 len
= stream_getc(s
);
691 if (stream_get_getp(s
) + len
> end
) {
693 "%s: Received runt domain name (hostname capability) from peer %s",
694 __FUNCTION__
, peer
->host
);
698 if (len
> BGP_MAX_HOSTNAME
) {
699 stream_get(str
, s
, BGP_MAX_HOSTNAME
);
700 stream_forward_getp(s
, len
- BGP_MAX_HOSTNAME
);
701 len
= BGP_MAX_HOSTNAME
; /* to set the '\0' below */
703 stream_get(str
, s
, len
);
707 peer
->domainname
= XSTRDUP(MTYPE_BGP_PEER_HOST
, str
);
710 if (bgp_debug_neighbor_events(peer
)) {
711 zlog_debug("%s received hostname %s, domainname %s", peer
->host
,
712 peer
->hostname
, peer
->domainname
);
718 static const struct message capcode_str
[] = {
719 {CAPABILITY_CODE_MP
, "MultiProtocol Extensions"},
720 {CAPABILITY_CODE_REFRESH
, "Route Refresh"},
721 {CAPABILITY_CODE_ORF
, "Cooperative Route Filtering"},
722 {CAPABILITY_CODE_RESTART
, "Graceful Restart"},
723 {CAPABILITY_CODE_AS4
, "4-octet AS number"},
724 {CAPABILITY_CODE_ADDPATH
, "AddPath"},
725 {CAPABILITY_CODE_DYNAMIC
, "Dynamic"},
726 {CAPABILITY_CODE_ENHE
, "Extended Next Hop Encoding"},
727 {CAPABILITY_CODE_DYNAMIC_OLD
, "Dynamic (Old)"},
728 {CAPABILITY_CODE_REFRESH_OLD
, "Route Refresh (Old)"},
729 {CAPABILITY_CODE_ORF_OLD
, "ORF (Old)"},
730 {CAPABILITY_CODE_FQDN
, "FQDN"},
733 /* Minimum sizes for length field of each cap (so not inc. the header) */
734 static const size_t cap_minsizes
[] = {
735 [CAPABILITY_CODE_MP
] = CAPABILITY_CODE_MP_LEN
,
736 [CAPABILITY_CODE_REFRESH
] = CAPABILITY_CODE_REFRESH_LEN
,
737 [CAPABILITY_CODE_ORF
] = CAPABILITY_CODE_ORF_LEN
,
738 [CAPABILITY_CODE_RESTART
] = CAPABILITY_CODE_RESTART_LEN
,
739 [CAPABILITY_CODE_AS4
] = CAPABILITY_CODE_AS4_LEN
,
740 [CAPABILITY_CODE_ADDPATH
] = CAPABILITY_CODE_ADDPATH_LEN
,
741 [CAPABILITY_CODE_DYNAMIC
] = CAPABILITY_CODE_DYNAMIC_LEN
,
742 [CAPABILITY_CODE_DYNAMIC_OLD
] = CAPABILITY_CODE_DYNAMIC_LEN
,
743 [CAPABILITY_CODE_ENHE
] = CAPABILITY_CODE_ENHE_LEN
,
744 [CAPABILITY_CODE_REFRESH_OLD
] = CAPABILITY_CODE_REFRESH_LEN
,
745 [CAPABILITY_CODE_ORF_OLD
] = CAPABILITY_CODE_ORF_LEN
,
746 [CAPABILITY_CODE_FQDN
] = CAPABILITY_CODE_MIN_FQDN_LEN
,
749 /* value the capability must be a multiple of.
750 * 0-data capabilities won't be checked against this.
751 * Other capabilities whose data doesn't fall on convenient boundaries for this
752 * table should be set to 1.
754 static const size_t cap_modsizes
[] = {
755 [CAPABILITY_CODE_MP
] = 4,
756 [CAPABILITY_CODE_REFRESH
] = 1,
757 [CAPABILITY_CODE_ORF
] = 1,
758 [CAPABILITY_CODE_RESTART
] = 1,
759 [CAPABILITY_CODE_AS4
] = 4,
760 [CAPABILITY_CODE_ADDPATH
] = 4,
761 [CAPABILITY_CODE_DYNAMIC
] = 1,
762 [CAPABILITY_CODE_DYNAMIC_OLD
] = 1,
763 [CAPABILITY_CODE_ENHE
] = 6,
764 [CAPABILITY_CODE_REFRESH_OLD
] = 1,
765 [CAPABILITY_CODE_ORF_OLD
] = 1,
766 [CAPABILITY_CODE_FQDN
] = 1,
770 * Parse given capability.
771 * XXX: This is reading into a stream, but not using stream API
773 * @param[out] mp_capability Set to 1 on return iff one or more Multiprotocol
774 * capabilities were encountered.
776 static int bgp_capability_parse(struct peer
*peer
, size_t length
,
777 int *mp_capability
, u_char
**error
)
780 struct stream
*s
= BGP_INPUT(peer
);
781 size_t end
= stream_get_getp(s
) + length
;
783 assert(STREAM_READABLE(s
) >= length
);
785 while (stream_get_getp(s
) < end
) {
787 u_char
*sp
= stream_pnt(s
);
788 struct capability_header caphdr
;
791 /* We need at least capability code and capability length. */
792 if (stream_get_getp(s
) + 2 > end
) {
793 zlog_info("%s Capability length error (< header)",
795 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
796 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
800 caphdr
.code
= stream_getc(s
);
801 caphdr
.length
= stream_getc(s
);
802 start
= stream_get_getp(s
);
804 /* Capability length check sanity check. */
805 if (start
+ caphdr
.length
> end
) {
806 zlog_info("%s Capability length error (< length)",
808 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
809 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
813 if (bgp_debug_neighbor_events(peer
))
814 zlog_debug("%s OPEN has %s capability (%u), length %u",
816 lookup_msg(capcode_str
, caphdr
.code
, NULL
),
817 caphdr
.code
, caphdr
.length
);
819 /* Length sanity check, type-specific, for known capabilities */
820 switch (caphdr
.code
) {
821 case CAPABILITY_CODE_MP
:
822 case CAPABILITY_CODE_REFRESH
:
823 case CAPABILITY_CODE_REFRESH_OLD
:
824 case CAPABILITY_CODE_ORF
:
825 case CAPABILITY_CODE_ORF_OLD
:
826 case CAPABILITY_CODE_RESTART
:
827 case CAPABILITY_CODE_AS4
:
828 case CAPABILITY_CODE_ADDPATH
:
829 case CAPABILITY_CODE_DYNAMIC
:
830 case CAPABILITY_CODE_DYNAMIC_OLD
:
831 case CAPABILITY_CODE_ENHE
:
832 case CAPABILITY_CODE_FQDN
:
834 if (caphdr
.length
< cap_minsizes
[caphdr
.code
]) {
836 "%s %s Capability length error: got %u,"
837 " expected at least %u",
839 lookup_msg(capcode_str
, caphdr
.code
,
842 (unsigned)cap_minsizes
[caphdr
.code
]);
843 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
844 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
848 && caphdr
.length
% cap_modsizes
[caphdr
.code
] != 0) {
850 "%s %s Capability length error: got %u,"
851 " expected a multiple of %u",
853 lookup_msg(capcode_str
, caphdr
.code
,
856 (unsigned)cap_modsizes
[caphdr
.code
]);
857 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
858 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
861 /* we deliberately ignore unknown codes, see below */
866 switch (caphdr
.code
) {
867 case CAPABILITY_CODE_MP
: {
870 /* Ignore capability when override-capability is set. */
871 if (!CHECK_FLAG(peer
->flags
,
872 PEER_FLAG_OVERRIDE_CAPABILITY
)) {
873 /* Set negotiated value. */
874 ret
= bgp_capability_mp(peer
, &caphdr
);
876 /* Unsupported Capability. */
878 /* Store return data. */
879 memcpy(*error
, sp
, caphdr
.length
+ 2);
880 *error
+= caphdr
.length
+ 2;
882 ret
= 0; /* Don't return error for this */
885 case CAPABILITY_CODE_REFRESH
:
886 case CAPABILITY_CODE_REFRESH_OLD
: {
887 /* BGP refresh capability */
888 if (caphdr
.code
== CAPABILITY_CODE_REFRESH_OLD
)
889 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
);
891 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
);
893 case CAPABILITY_CODE_ORF
:
894 case CAPABILITY_CODE_ORF_OLD
:
895 ret
= bgp_capability_orf_entry(peer
, &caphdr
);
897 case CAPABILITY_CODE_RESTART
:
898 ret
= bgp_capability_restart(peer
, &caphdr
);
900 case CAPABILITY_CODE_DYNAMIC
:
901 case CAPABILITY_CODE_DYNAMIC_OLD
:
902 SET_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_RCV
);
904 case CAPABILITY_CODE_AS4
:
905 /* Already handled as a special-case parsing of the
907 * at the beginning of OPEN processing. So we care not a
909 * for the value really, only error case.
911 if (!bgp_capability_as4(peer
, &caphdr
))
914 case CAPABILITY_CODE_ADDPATH
:
915 ret
= bgp_capability_addpath(peer
, &caphdr
);
917 case CAPABILITY_CODE_ENHE
:
918 ret
= bgp_capability_enhe(peer
, &caphdr
);
920 case CAPABILITY_CODE_FQDN
:
921 ret
= bgp_capability_hostname(peer
, &caphdr
);
924 if (caphdr
.code
> 128) {
925 /* We don't send Notification for unknown vendor
927 capabilities. It seems reasonable for now...
929 zlog_warn("%s Vendor specific capability %d",
930 peer
->host
, caphdr
.code
);
933 "%s unrecognized capability code: %d - ignored",
934 peer
->host
, caphdr
.code
);
935 memcpy(*error
, sp
, caphdr
.length
+ 2);
936 *error
+= caphdr
.length
+ 2;
941 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
942 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
945 if (stream_get_getp(s
) != (start
+ caphdr
.length
)) {
946 if (stream_get_getp(s
) > (start
+ caphdr
.length
))
948 "%s Cap-parser for %s read past cap-length, %u!",
950 lookup_msg(capcode_str
, caphdr
.code
,
953 stream_set_getp(s
, start
+ caphdr
.length
);
959 static int bgp_auth_parse(struct peer
*peer
, size_t length
)
961 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
962 BGP_NOTIFY_OPEN_AUTH_FAILURE
);
966 static int strict_capability_same(struct peer
*peer
)
970 for (i
= AFI_IP
; i
< AFI_MAX
; i
++)
971 for (j
= SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
972 if (peer
->afc
[i
][j
] != peer
->afc_nego
[i
][j
])
977 /* peek into option, stores ASN to *as4 if the AS4 capability was found.
978 * Returns 0 if no as4 found, as4cap value otherwise.
980 as_t
peek_for_as4_capability(struct peer
*peer
, u_char length
)
982 struct stream
*s
= BGP_INPUT(peer
);
983 size_t orig_getp
= stream_get_getp(s
);
984 size_t end
= orig_getp
+ length
;
987 if (BGP_DEBUG(as4
, AS4
))
989 "%s [AS4] rcv OPEN w/ OPTION parameter len: %u,"
992 /* the error cases we DONT handle, we ONLY try to read as4 out of
993 * correctly formatted options.
995 while (stream_get_getp(s
) < end
) {
999 /* Check the length. */
1000 if (stream_get_getp(s
) + 2 > end
)
1003 /* Fetch option type and length. */
1004 opt_type
= stream_getc(s
);
1005 opt_length
= stream_getc(s
);
1007 /* Option length check. */
1008 if (stream_get_getp(s
) + opt_length
> end
)
1011 if (opt_type
== BGP_OPEN_OPT_CAP
) {
1012 unsigned long capd_start
= stream_get_getp(s
);
1013 unsigned long capd_end
= capd_start
+ opt_length
;
1015 assert(capd_end
<= end
);
1017 while (stream_get_getp(s
) < capd_end
) {
1018 struct capability_header hdr
;
1020 if (stream_get_getp(s
) + 2 > capd_end
)
1023 hdr
.code
= stream_getc(s
);
1024 hdr
.length
= stream_getc(s
);
1026 if ((stream_get_getp(s
) + hdr
.length
)
1030 if (hdr
.code
== CAPABILITY_CODE_AS4
) {
1031 if (BGP_DEBUG(as4
, AS4
))
1033 "[AS4] found AS4 capability, about to parse");
1034 as4
= bgp_capability_as4(peer
, &hdr
);
1038 stream_forward_getp(s
, hdr
.length
);
1044 stream_set_getp(s
, orig_getp
);
1049 * Parse open option.
1051 * @param[out] mp_capability @see bgp_capability_parse() for semantics.
1053 int bgp_open_option_parse(struct peer
*peer
, u_char length
, int *mp_capability
)
1057 u_char error_data
[BGP_MAX_PACKET_SIZE
];
1058 struct stream
*s
= BGP_INPUT(peer
);
1059 size_t end
= stream_get_getp(s
) + length
;
1063 if (bgp_debug_neighbor_events(peer
))
1064 zlog_debug("%s rcv OPEN w/ OPTION parameter len: %u",
1065 peer
->host
, length
);
1067 while (stream_get_getp(s
) < end
) {
1071 /* Must have at least an OPEN option header */
1072 if (STREAM_READABLE(s
) < 2) {
1073 zlog_info("%s Option length error", peer
->host
);
1074 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1075 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1079 /* Fetch option type and length. */
1080 opt_type
= stream_getc(s
);
1081 opt_length
= stream_getc(s
);
1083 /* Option length check. */
1084 if (STREAM_READABLE(s
) < opt_length
) {
1085 zlog_info("%s Option length error", peer
->host
);
1086 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1087 BGP_NOTIFY_OPEN_MALFORMED_ATTR
);
1091 if (bgp_debug_neighbor_events(peer
))
1093 "%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
1094 peer
->host
, opt_type
,
1095 opt_type
== BGP_OPEN_OPT_AUTH
1097 : opt_type
== BGP_OPEN_OPT_CAP
1103 case BGP_OPEN_OPT_AUTH
:
1104 ret
= bgp_auth_parse(peer
, opt_length
);
1106 case BGP_OPEN_OPT_CAP
:
1107 ret
= bgp_capability_parse(peer
, opt_length
,
1108 mp_capability
, &error
);
1111 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1112 BGP_NOTIFY_OPEN_UNSUP_PARAM
);
1117 /* Parse error. To accumulate all unsupported capability codes,
1118 bgp_capability_parse does not return -1 when encounter
1119 unsupported capability code. To detect that, please check
1120 error and erro_data pointer, like below. */
1125 /* All OPEN option is parsed. Check capability when strict compare
1127 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
)) {
1128 /* If Unsupported Capability exists. */
1129 if (error
!= error_data
) {
1130 bgp_notify_send_with_data(peer
, BGP_NOTIFY_OPEN_ERR
,
1131 BGP_NOTIFY_OPEN_UNSUP_CAPBL
,
1133 error
- error_data
);
1137 /* Check local capability does not negotiated with remote
1139 if (!strict_capability_same(peer
)) {
1140 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1141 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
1146 /* Check there are no common AFI/SAFIs and send Unsupported Capability
1149 && !CHECK_FLAG(peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
)) {
1150 if (!peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
1151 && !peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
1152 && !peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
1153 && !peer
->afc_nego
[AFI_IP
][SAFI_ENCAP
]
1154 && !peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
1155 && !peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
]
1156 && !peer
->afc_nego
[AFI_IP6
][SAFI_MPLS_VPN
]
1157 && !peer
->afc_nego
[AFI_IP6
][SAFI_ENCAP
]
1158 && !peer
->afc_nego
[AFI_L2VPN
][SAFI_EVPN
]) {
1160 "%s [Error] Configured AFI/SAFIs do not "
1161 "overlap with received MP capabilities",
1164 if (error
!= error_data
)
1165 bgp_notify_send_with_data(
1166 peer
, BGP_NOTIFY_OPEN_ERR
,
1167 BGP_NOTIFY_OPEN_UNSUP_CAPBL
, error_data
,
1168 error
- error_data
);
1170 bgp_notify_send(peer
, BGP_NOTIFY_OPEN_ERR
,
1171 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
1178 static void bgp_open_capability_orf(struct stream
*s
, struct peer
*peer
,
1179 afi_t afi
, safi_t safi
, u_char code
)
1185 unsigned long numberp
;
1186 int number_of_orfs
= 0;
1190 /* Convert AFI, SAFI to values for packet. */
1191 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
, &pkt_safi
);
1193 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1194 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1195 stream_putc(s
, 0); /* Capability Length */
1196 stream_putc(s
, code
); /* Capability Code */
1197 orfp
= stream_get_endp(s
); /* Set ORF Len Pointer */
1198 stream_putc(s
, 0); /* ORF Length */
1199 stream_putw(s
, pkt_afi
);
1201 stream_putc(s
, pkt_safi
);
1202 numberp
= stream_get_endp(s
); /* Set Number Pointer */
1203 stream_putc(s
, 0); /* Number of ORFs */
1205 /* Address Prefix ORF */
1206 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
1207 || CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
)) {
1208 stream_putc(s
, (code
== CAPABILITY_CODE_ORF
1210 : ORF_TYPE_PREFIX_OLD
));
1212 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1213 PEER_FLAG_ORF_PREFIX_SM
)
1214 && CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1215 PEER_FLAG_ORF_PREFIX_RM
)) {
1216 SET_FLAG(peer
->af_cap
[afi
][safi
],
1217 PEER_CAP_ORF_PREFIX_SM_ADV
);
1218 SET_FLAG(peer
->af_cap
[afi
][safi
],
1219 PEER_CAP_ORF_PREFIX_RM_ADV
);
1220 stream_putc(s
, ORF_MODE_BOTH
);
1221 } else if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1222 PEER_FLAG_ORF_PREFIX_SM
)) {
1223 SET_FLAG(peer
->af_cap
[afi
][safi
],
1224 PEER_CAP_ORF_PREFIX_SM_ADV
);
1225 stream_putc(s
, ORF_MODE_SEND
);
1227 SET_FLAG(peer
->af_cap
[afi
][safi
],
1228 PEER_CAP_ORF_PREFIX_RM_ADV
);
1229 stream_putc(s
, ORF_MODE_RECEIVE
);
1234 /* Total Number of ORFs. */
1235 stream_putc_at(s
, numberp
, number_of_orfs
);
1237 /* Total ORF Len. */
1238 orf_len
= stream_get_endp(s
) - orfp
- 1;
1239 stream_putc_at(s
, orfp
, orf_len
);
1241 /* Total Capability Len. */
1242 cap_len
= stream_get_endp(s
) - capp
- 1;
1243 stream_putc_at(s
, capp
, cap_len
);
1246 /* Fill in capability open option to the packet. */
1247 void bgp_open_capability(struct stream
*s
, struct peer
*peer
)
1250 unsigned long cp
, capp
, rcapp
;
1253 safi_t safi
, pkt_safi
;
1255 u_int32_t restart_time
;
1256 u_char afi_safi_count
= 0;
1257 struct utsname names
;
1258 int adv_addpath_tx
= 0;
1260 /* Remember current pointer for Opt Parm Len. */
1261 cp
= stream_get_endp(s
);
1266 /* Do not send capability. */
1267 if (!CHECK_FLAG(peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
)
1268 || CHECK_FLAG(peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
1271 /* MP capability for configured AFI, SAFI */
1272 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1273 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++) {
1274 if (peer
->afc
[afi
][safi
]) {
1275 /* Convert AFI, SAFI to values for packet. */
1276 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1279 peer
->afc_adv
[afi
][safi
] = 1;
1280 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1281 stream_putc(s
, CAPABILITY_CODE_MP_LEN
+ 2);
1282 stream_putc(s
, CAPABILITY_CODE_MP
);
1283 stream_putc(s
, CAPABILITY_CODE_MP_LEN
);
1284 stream_putw(s
, pkt_afi
);
1286 stream_putc(s
, pkt_safi
);
1290 /* Extended nexthop capability - currently supporting RFC-5549 for
1291 * Link-Local peering only
1293 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
)
1294 && peer
->su
.sa
.sa_family
== AF_INET6
1295 && IN6_IS_ADDR_LINKLOCAL(&peer
->su
.sin6
.sin6_addr
)) {
1296 /* RFC 5549 Extended Next Hop Encoding */
1297 SET_FLAG(peer
->cap
, PEER_CAP_ENHE_ADV
);
1298 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1299 stream_putc(s
, CAPABILITY_CODE_ENHE_LEN
+ 2);
1300 stream_putc(s
, CAPABILITY_CODE_ENHE
);
1301 stream_putc(s
, CAPABILITY_CODE_ENHE_LEN
);
1302 /* Currently supporting for SAFI_UNICAST only */
1303 SET_FLAG(peer
->af_cap
[AFI_IP
][SAFI_UNICAST
],
1304 PEER_CAP_ENHE_AF_ADV
);
1305 stream_putw(s
, AFI_IP
);
1306 stream_putw(s
, SAFI_UNICAST
);
1307 stream_putw(s
, AFI_IP6
);
1309 if (CHECK_FLAG(peer
->af_cap
[AFI_IP
][SAFI_UNICAST
],
1310 PEER_CAP_ENHE_AF_RCV
))
1311 SET_FLAG(peer
->af_cap
[AFI_IP
][SAFI_UNICAST
],
1312 PEER_CAP_ENHE_AF_NEGO
);
1315 /* Route refresh. */
1316 SET_FLAG(peer
->cap
, PEER_CAP_REFRESH_ADV
);
1317 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1318 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1319 stream_putc(s
, CAPABILITY_CODE_REFRESH_OLD
);
1320 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1321 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1322 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
1323 stream_putc(s
, CAPABILITY_CODE_REFRESH
);
1324 stream_putc(s
, CAPABILITY_CODE_REFRESH_LEN
);
1327 SET_FLAG(peer
->cap
, PEER_CAP_AS4_ADV
);
1328 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1329 stream_putc(s
, CAPABILITY_CODE_AS4_LEN
+ 2);
1330 stream_putc(s
, CAPABILITY_CODE_AS4
);
1331 stream_putc(s
, CAPABILITY_CODE_AS4_LEN
);
1332 if (peer
->change_local_as
)
1333 local_as
= peer
->change_local_as
;
1335 local_as
= peer
->local_as
;
1336 stream_putl(s
, local_as
);
1339 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1340 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1341 if (peer
->afc
[afi
][safi
]) {
1344 /* Only advertise addpath TX if a feature that
1347 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1348 PEER_FLAG_ADDPATH_TX_ALL_PATHS
)
1350 peer
->af_flags
[afi
][safi
],
1351 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
1355 SET_FLAG(peer
->cap
, PEER_CAP_ADDPATH_ADV
);
1356 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1357 stream_putc(s
, (CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
) + 2);
1358 stream_putc(s
, CAPABILITY_CODE_ADDPATH
);
1359 stream_putc(s
, CAPABILITY_CODE_ADDPATH_LEN
* afi_safi_count
);
1361 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1362 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1363 if (peer
->afc
[afi
][safi
]) {
1364 /* Convert AFI, SAFI to values for packet. */
1365 bgp_map_afi_safi_int2iana(afi
, safi
, &pkt_afi
,
1368 stream_putw(s
, pkt_afi
);
1369 stream_putc(s
, pkt_safi
);
1371 if (adv_addpath_tx
) {
1375 SET_FLAG(peer
->af_cap
[afi
][safi
],
1376 PEER_CAP_ADDPATH_AF_RX_ADV
);
1377 SET_FLAG(peer
->af_cap
[afi
][safi
],
1378 PEER_CAP_ADDPATH_AF_TX_ADV
);
1380 stream_putc(s
, BGP_ADDPATH_RX
);
1381 SET_FLAG(peer
->af_cap
[afi
][safi
],
1382 PEER_CAP_ADDPATH_AF_RX_ADV
);
1383 UNSET_FLAG(peer
->af_cap
[afi
][safi
],
1384 PEER_CAP_ADDPATH_AF_TX_ADV
);
1388 /* ORF capability. */
1389 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1390 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1391 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1392 PEER_FLAG_ORF_PREFIX_SM
)
1393 || CHECK_FLAG(peer
->af_flags
[afi
][safi
],
1394 PEER_FLAG_ORF_PREFIX_RM
)) {
1395 bgp_open_capability_orf(
1397 CAPABILITY_CODE_ORF_OLD
);
1398 bgp_open_capability_orf(s
, peer
, afi
, safi
,
1399 CAPABILITY_CODE_ORF
);
1402 /* Dynamic capability. */
1403 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
)) {
1404 SET_FLAG(peer
->cap
, PEER_CAP_DYNAMIC_ADV
);
1405 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1406 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1407 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_OLD
);
1408 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1409 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1410 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
1411 stream_putc(s
, CAPABILITY_CODE_DYNAMIC
);
1412 stream_putc(s
, CAPABILITY_CODE_DYNAMIC_LEN
);
1415 /* Hostname capability */
1417 if (names
.nodename
[0] != '\0') {
1418 SET_FLAG(peer
->cap
, PEER_CAP_HOSTNAME_ADV
);
1419 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1420 rcapp
= stream_get_endp(s
); /* Ptr to length placeholder */
1421 stream_putc(s
, 0); /* dummy len for now */
1422 stream_putc(s
, CAPABILITY_CODE_FQDN
);
1423 capp
= stream_get_endp(s
);
1424 stream_putc(s
, 0); /* dummy len for now */
1425 len
= strlen(names
.nodename
);
1426 if (len
> BGP_MAX_HOSTNAME
)
1427 len
= BGP_MAX_HOSTNAME
;
1429 stream_putc(s
, len
);
1430 stream_put(s
, names
.nodename
, len
);
1431 #ifdef HAVE_STRUCT_UTSNAME_DOMAINNAME
1432 if ((names
.domainname
[0] != '\0')
1433 && (strcmp(names
.domainname
, "(none)") != 0)) {
1434 len
= strlen(names
.domainname
);
1435 if (len
> BGP_MAX_HOSTNAME
)
1436 len
= BGP_MAX_HOSTNAME
;
1438 stream_putc(s
, len
);
1439 stream_put(s
, names
.domainname
, len
);
1443 stream_putc(s
, 0); /* 0 length */
1446 /* Set the lengths straight */
1447 len
= stream_get_endp(s
) - rcapp
- 1;
1448 stream_putc_at(s
, rcapp
, len
);
1449 len
= stream_get_endp(s
) - capp
- 1;
1450 stream_putc_at(s
, capp
, len
);
1452 if (bgp_debug_neighbor_events(peer
))
1453 #ifdef HAVE_STRUCT_UTSNAME_DOMAINNAME
1455 "%s Sending hostname cap with hn = %s, dn = %s",
1456 peer
->host
, names
.nodename
, names
.domainname
);
1458 zlog_debug("%s Sending hostname cap with hn = %s",
1459 peer
->host
, names
.nodename
);
1463 /* Sending base graceful-restart capability irrespective of the config
1465 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
);
1466 stream_putc(s
, BGP_OPEN_OPT_CAP
);
1467 capp
= stream_get_endp(s
); /* Set Capability Len Pointer */
1468 stream_putc(s
, 0); /* Capability Length */
1469 stream_putc(s
, CAPABILITY_CODE_RESTART
);
1470 rcapp
= stream_get_endp(s
); /* Set Restart Capability Len Pointer */
1472 restart_time
= peer
->bgp
->restart_time
;
1473 if (peer
->bgp
->t_startup
) {
1474 SET_FLAG(restart_time
, RESTART_R_BIT
);
1475 SET_FLAG(peer
->cap
, PEER_CAP_RESTART_BIT_ADV
);
1477 stream_putw(s
, restart_time
);
1479 /* Send address-family specific graceful-restart capability only when GR
1482 if (bgp_flag_check(peer
->bgp
, BGP_FLAG_GRACEFUL_RESTART
)) {
1483 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1484 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1485 if (peer
->afc
[afi
][safi
]) {
1486 /* Convert AFI, SAFI to values for
1488 bgp_map_afi_safi_int2iana(
1489 afi
, safi
, &pkt_afi
, &pkt_safi
);
1490 stream_putw(s
, pkt_afi
);
1491 stream_putc(s
, pkt_safi
);
1494 BGP_FLAG_GR_PRESERVE_FWD
))
1495 stream_putc(s
, RESTART_F_BIT
);
1501 /* Total Graceful restart capability Len. */
1502 len
= stream_get_endp(s
) - rcapp
- 1;
1503 stream_putc_at(s
, rcapp
, len
);
1505 /* Total Capability Len. */
1506 len
= stream_get_endp(s
) - capp
- 1;
1507 stream_putc_at(s
, capp
, len
);
1509 /* Total Opt Parm Len. */
1510 len
= stream_get_endp(s
) - cp
- 1;
1511 stream_putc_at(s
, cp
, len
);