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
30 #include "bgpd/bgpd.h"
31 #include "bgpd/bgp_attr.h"
32 #include "bgpd/bgp_debug.h"
33 #include "bgpd/bgp_fsm.h"
34 #include "bgpd/bgp_packet.h"
35 #include "bgpd/bgp_open.h"
36 #include "bgpd/bgp_vty.h"
38 /* BGP-4 Multiprotocol Extentions lead us to the complex world. We can
39 negotiate remote peer supports extentions or not. But if
40 remote-peer doesn't supports negotiation process itself. We would
41 like to do manual configuration.
43 So there is many configurable point. First of all we want set each
44 peer whether we send capability negotiation to the peer or not.
45 Next, if we send capability to the peer we want to set my capabilty
46 inforation at each peer. */
49 bgp_capability_vty_out (struct vty
*vty
, struct peer
*peer
)
53 struct capability cap
;
55 pnt
= peer
->notify
.data
;
56 end
= pnt
+ peer
->notify
.length
;
60 memcpy(&cap
, pnt
, sizeof(struct capability
));
64 if (pnt
+ (cap
.length
+ 2) > end
)
67 if (cap
.code
== CAPABILITY_CODE_MP
)
69 vty_out (vty
, " Capability error for: Multi protocol ");
71 switch (ntohs (cap
.mpc
.afi
))
74 vty_out (vty
, "AFI IPv4, ");
77 vty_out (vty
, "AFI IPv6, ");
80 vty_out (vty
, "AFI Unknown %d, ", ntohs (cap
.mpc
.afi
));
86 vty_out (vty
, "SAFI Unicast");
89 vty_out (vty
, "SAFI Multicast");
91 case SAFI_UNICAST_MULTICAST
:
92 vty_out (vty
, "SAFI Unicast Multicast");
95 vty_out (vty
, "SAFI MPLS-VPN");
98 vty_out (vty
, "SAFI Unknown %d ", cap
.mpc
.safi
);
101 vty_out (vty
, "%s", VTY_NEWLINE
);
103 else if (cap
.code
>= 128)
104 vty_out (vty
, " Capability error: vendor specific capability code %d",
107 vty_out (vty
, " Capability error: unknown capability code %d",
110 pnt
+= cap
.length
+ 2;
114 /* Set negotiated capability value. */
116 bgp_capability_mp (struct peer
*peer
, struct capability
*cap
)
118 if (ntohs (cap
->mpc
.afi
) == AFI_IP
)
120 if (cap
->mpc
.safi
== SAFI_UNICAST
)
122 peer
->afc_recv
[AFI_IP
][SAFI_UNICAST
] = 1;
124 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
125 peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
] = 1;
129 else if (cap
->mpc
.safi
== SAFI_MULTICAST
)
131 peer
->afc_recv
[AFI_IP
][SAFI_MULTICAST
] = 1;
133 if (peer
->afc
[AFI_IP
][SAFI_MULTICAST
])
134 peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
] = 1;
138 else if (cap
->mpc
.safi
== BGP_SAFI_VPNV4
)
140 peer
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
] = 1;
142 if (peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
])
143 peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
] = 1;
151 else if (ntohs (cap
->mpc
.afi
) == AFI_IP6
)
153 if (cap
->mpc
.safi
== SAFI_UNICAST
)
155 peer
->afc_recv
[AFI_IP6
][SAFI_UNICAST
] = 1;
157 if (peer
->afc
[AFI_IP6
][SAFI_UNICAST
])
158 peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
] = 1;
162 else if (cap
->mpc
.safi
== SAFI_MULTICAST
)
164 peer
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
] = 1;
166 if (peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
167 peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
] = 1;
174 #endif /* HAVE_IPV6 */
177 /* Unknown Address Family. */
185 bgp_capability_orf_not_support (struct peer
*peer
, afi_t afi
, safi_t safi
,
186 u_char type
, u_char mode
)
188 if (BGP_DEBUG (normal
, NORMAL
))
189 zlog_debug ("%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
190 peer
->host
, afi
, safi
, type
, mode
);
194 bgp_capability_orf (struct peer
*peer
, struct capability
*cap
,
197 afi_t afi
= ntohs(cap
->mpc
.afi
);
198 safi_t safi
= cap
->mpc
.safi
;
199 u_char number_of_orfs
;
202 u_int16_t sm_cap
= 0; /* capability send-mode receive */
203 u_int16_t rm_cap
= 0; /* capability receive-mode receive */
209 zlog_info ("%s ORF Capability length error %d",
210 peer
->host
, cap
->length
);
211 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
215 if (BGP_DEBUG (normal
, NORMAL
))
216 zlog_debug ("%s OPEN has ORF CAP(%s) for afi/safi: %u/%u",
217 peer
->host
, (cap
->code
== CAPABILITY_CODE_ORF
?
218 "new" : "old"), afi
, safi
);
220 /* Check AFI and SAFI. */
221 if ((afi
!= AFI_IP
&& afi
!= AFI_IP6
)
222 || (safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
223 && safi
!= BGP_SAFI_VPNV4
))
225 zlog_info ("%s Addr-family %d/%d not supported. Ignoring the ORF capability",
226 peer
->host
, afi
, safi
);
230 number_of_orfs
= *pnt
++;
232 for (i
= 0 ; i
< number_of_orfs
; i
++)
237 /* ORF Mode error check */
238 if (mode
!= ORF_MODE_BOTH
&& mode
!= ORF_MODE_SEND
239 && mode
!= ORF_MODE_RECEIVE
)
241 bgp_capability_orf_not_support (peer
, afi
, safi
, type
, mode
);
245 /* ORF Type and afi/safi error check */
246 if (cap
->code
== CAPABILITY_CODE_ORF
)
248 if (type
== ORF_TYPE_PREFIX
&&
249 ((afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
250 || (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
251 || (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)))
253 sm_cap
= PEER_CAP_ORF_PREFIX_SM_RCV
;
254 rm_cap
= PEER_CAP_ORF_PREFIX_RM_RCV
;
255 if (BGP_DEBUG (normal
, NORMAL
))
256 zlog_debug ("%s OPEN has Prefixlist ORF(%d) capability as %s for afi/safi: %d/%d",
257 peer
->host
, ORF_TYPE_PREFIX
, (mode
== ORF_MODE_SEND
? "SEND" :
258 mode
== ORF_MODE_RECEIVE
? "RECEIVE" : "BOTH") , afi
, safi
);
262 bgp_capability_orf_not_support (peer
, afi
, safi
, type
, mode
);
266 else if (cap
->code
== CAPABILITY_CODE_ORF_OLD
)
268 if (type
== ORF_TYPE_PREFIX_OLD
&&
269 ((afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
270 || (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
271 || (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)))
273 sm_cap
= PEER_CAP_ORF_PREFIX_SM_OLD_RCV
;
274 rm_cap
= PEER_CAP_ORF_PREFIX_RM_OLD_RCV
;
275 if (BGP_DEBUG (normal
, NORMAL
))
276 zlog_debug ("%s OPEN has Prefixlist ORF(%d) capability as %s for afi/safi: %d/%d",
277 peer
->host
, ORF_TYPE_PREFIX_OLD
, (mode
== ORF_MODE_SEND
? "SEND" :
278 mode
== ORF_MODE_RECEIVE
? "RECEIVE" : "BOTH") , afi
, safi
);
282 bgp_capability_orf_not_support (peer
, afi
, safi
, type
, mode
);
288 bgp_capability_orf_not_support (peer
, afi
, safi
, type
, mode
);
295 SET_FLAG (peer
->af_cap
[afi
][safi
], sm_cap
);
296 SET_FLAG (peer
->af_cap
[afi
][safi
], rm_cap
);
299 SET_FLAG (peer
->af_cap
[afi
][safi
], sm_cap
);
301 case ORF_MODE_RECEIVE
:
302 SET_FLAG (peer
->af_cap
[afi
][safi
], rm_cap
);
309 /* Parse given capability. */
311 bgp_capability_parse (struct peer
*peer
, u_char
*pnt
, u_char length
,
316 struct capability cap
;
325 /* Fetch structure to the byte stream. */
326 memcpy (&cap
, pnt
, sizeof (struct capability
));
328 afi
= ntohs(cap
.mpc
.afi
);
331 if (BGP_DEBUG (normal
, NORMAL
))
332 zlog_debug ("%s OPEN has CAPABILITY code: %d, length %d",
333 peer
->host
, cap
.code
, cap
.length
);
335 /* We need at least capability code and capability length. */
338 zlog_info ("%s Capability length error", peer
->host
);
339 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
343 /* Capability length check. */
344 if (pnt
+ (cap
.length
+ 2) > end
)
346 zlog_info ("%s Capability length error", peer
->host
);
347 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
351 /* We know MP Capability Code. */
352 if (cap
.code
== CAPABILITY_CODE_MP
)
354 if (BGP_DEBUG (normal
, NORMAL
))
355 zlog_debug ("%s OPEN has MP_EXT CAP for afi/safi: %u/%u",
356 peer
->host
, afi
, safi
);
358 /* Ignore capability when override-capability is set. */
359 if (! CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
361 /* Set negotiated value. */
362 ret
= bgp_capability_mp (peer
, &cap
);
364 /* Unsupported Capability. */
367 /* Store return data. */
368 memcpy (*error
, &cap
, cap
.length
+ 2);
369 *error
+= cap
.length
+ 2;
373 else if (cap
.code
== CAPABILITY_CODE_REFRESH
374 || cap
.code
== CAPABILITY_CODE_REFRESH_OLD
)
377 if (cap
.length
!= CAPABILITY_CODE_REFRESH_LEN
)
379 zlog_info ("%s Route Refresh Capability length error %d",
380 peer
->host
, cap
.length
);
381 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
385 if (BGP_DEBUG (normal
, NORMAL
))
386 zlog_debug ("%s OPEN has ROUTE-REFRESH capability(%s) for all address-families",
388 cap
.code
== CAPABILITY_CODE_REFRESH_OLD
? "old" : "new");
390 /* BGP refresh capability */
391 if (cap
.code
== CAPABILITY_CODE_REFRESH_OLD
)
392 SET_FLAG (peer
->cap
, PEER_CAP_REFRESH_OLD_RCV
);
394 SET_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
);
396 else if (cap
.code
== CAPABILITY_CODE_ORF
397 || cap
.code
== CAPABILITY_CODE_ORF_OLD
)
398 bgp_capability_orf (peer
, &cap
, pnt
+ sizeof (struct capability
));
399 else if (cap
.code
== CAPABILITY_CODE_RESTART
)
401 struct graceful_restart_af graf
;
402 u_int16_t restart_flag_time
;
408 if (cap
.length
< CAPABILITY_CODE_RESTART_LEN
)
410 zlog_info ("%s Graceful Restart Capability length error %d",
411 peer
->host
, cap
.length
);
412 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
416 SET_FLAG (peer
->cap
, PEER_CAP_RESTART_RCV
);
417 restart_flag_time
= ntohs(cap
.mpc
.afi
);
418 if (CHECK_FLAG (restart_flag_time
, RESTART_R_BIT
))
420 UNSET_FLAG (restart_flag_time
, 0xF000);
421 peer
->v_gr_restart
= restart_flag_time
;
423 if (BGP_DEBUG (normal
, NORMAL
))
425 zlog_debug ("%s OPEN has Graceful Restart capability", peer
->host
);
426 zlog_debug ("%s Peer has%srestarted. Restart Time : %d",
427 peer
->host
, restart_bit
? " " : " not ",
431 restart_pnt
= pnt
+ 4;
432 restart_end
= pnt
+ cap
.length
+ 2;
434 while (restart_pnt
< restart_end
)
436 memcpy (&graf
, restart_pnt
, sizeof (struct graceful_restart_af
));
438 afi
= ntohs(graf
.afi
);
441 if (CHECK_FLAG (graf
.flag
, RESTART_F_BIT
))
442 SET_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_RESTART_AF_PRESERVE_RCV
);
444 if (strcmp (afi_safi_print (afi
, safi
), "Unknown") == 0)
446 if (BGP_DEBUG (normal
, NORMAL
))
447 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported. I gnore the Graceful Restart capability",
448 peer
->host
, afi
, safi
);
450 else if (! peer
->afc
[afi
][safi
])
452 if (BGP_DEBUG (normal
, NORMAL
))
453 zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled. Ignore the Graceful Restart capability",
454 peer
->host
, afi
, safi
);
458 if (BGP_DEBUG (normal
, NORMAL
))
459 zlog_debug ("%s Address family %s is%spreserved", peer
->host
,
460 afi_safi_print (afi
, safi
),
461 CHECK_FLAG (peer
->af_cap
[afi
][safi
],
462 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
465 SET_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_RESTART_AF_RCV
);
470 else if (cap
.code
== CAPABILITY_CODE_DYNAMIC
)
473 if (cap
.length
!= CAPABILITY_CODE_DYNAMIC_LEN
)
475 zlog_info ("%s Dynamic Capability length error %d",
476 peer
->host
, cap
.length
);
477 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
481 if (BGP_DEBUG (normal
, NORMAL
))
482 zlog_debug ("%s OPEN has DYNAMIC capability", peer
->host
);
484 SET_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_RCV
);
487 else if (cap
.code
> 128)
489 /* We don't send Notification for unknown vendor specific
490 capabilities. It seems reasonable for now... */
491 zlog_warn ("%s Vendor specific capability %d",
492 peer
->host
, cap
.code
);
496 zlog_warn ("%s unrecognized capability code: %d - ignored",
497 peer
->host
, cap
.code
);
498 memcpy (*error
, &cap
, cap
.length
+ 2);
499 *error
+= cap
.length
+ 2;
502 pnt
+= cap
.length
+ 2;
508 bgp_auth_parse (struct peer
*peer
, u_char
*pnt
, size_t length
)
510 bgp_notify_send (peer
,
512 BGP_NOTIFY_OPEN_AUTH_FAILURE
);
517 strict_capability_same (struct peer
*peer
)
521 for (i
= AFI_IP
; i
< AFI_MAX
; i
++)
522 for (j
= SAFI_UNICAST
; j
< SAFI_MAX
; j
++)
523 if (peer
->afc
[i
][j
] != peer
->afc_nego
[i
][j
])
528 /* Parse open option */
530 bgp_open_option_parse (struct peer
*peer
, u_char length
, int *capability
)
538 u_char error_data
[BGP_MAX_PACKET_SIZE
];
541 pnt
= stream_pnt (peer
->ibuf
);
549 if (BGP_DEBUG (normal
, NORMAL
))
550 zlog_debug ("%s rcv OPEN w/ OPTION parameter len: %u",
555 /* Check the length. */
558 zlog_info ("%s Option length error", peer
->host
);
559 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
563 /* Fetch option type and length. */
567 /* Option length check. */
568 if (pnt
+ opt_length
> end
)
570 zlog_info ("%s Option length error", peer
->host
);
571 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
575 if (BGP_DEBUG (normal
, NORMAL
))
576 zlog_debug ("%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
577 peer
->host
, opt_type
,
578 opt_type
== BGP_OPEN_OPT_AUTH
? "Authentication" :
579 opt_type
== BGP_OPEN_OPT_CAP
? "Capability" : "Unknown",
584 case BGP_OPEN_OPT_AUTH
:
585 ret
= bgp_auth_parse (peer
, pnt
, opt_length
);
587 case BGP_OPEN_OPT_CAP
:
588 ret
= bgp_capability_parse (peer
, pnt
, opt_length
, &error
);
592 bgp_notify_send (peer
,
594 BGP_NOTIFY_OPEN_UNSUP_PARAM
);
599 /* Parse error. To accumulate all unsupported capability codes,
600 bgp_capability_parse does not return -1 when encounter
601 unsupported capability code. To detect that, please check
602 error and erro_data pointer, like below. */
606 /* Forward pointer. */
610 /* All OPEN option is parsed. Check capability when strict compare
612 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_STRICT_CAP_MATCH
))
614 /* If Unsupported Capability exists. */
615 if (error
!= error_data
)
617 bgp_notify_send_with_data (peer
,
619 BGP_NOTIFY_OPEN_UNSUP_CAPBL
,
620 error_data
, error
- error_data
);
624 /* Check local capability does not negotiated with remote
626 if (! strict_capability_same (peer
))
628 bgp_notify_send (peer
,
630 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
635 /* Check there is no common capability send Unsupported Capability
637 if (*capability
&& ! CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
639 if (! peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
]
640 && ! peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
]
641 && ! peer
->afc_nego
[AFI_IP
][SAFI_MPLS_VPN
]
642 && ! peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
]
643 && ! peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
])
645 plog_err (peer
->log
, "%s [Error] No common capability", peer
->host
);
647 if (error
!= error_data
)
649 bgp_notify_send_with_data (peer
,
651 BGP_NOTIFY_OPEN_UNSUP_CAPBL
,
652 error_data
, error
- error_data
);
654 bgp_notify_send (peer
,
656 BGP_NOTIFY_OPEN_UNSUP_CAPBL
);
664 bgp_open_capability_orf (struct stream
*s
, struct peer
*peer
,
665 afi_t afi
, safi_t safi
, u_char code
)
671 unsigned long numberp
;
672 int number_of_orfs
= 0;
674 if (safi
== SAFI_MPLS_VPN
)
675 safi
= BGP_SAFI_VPNV4
;
677 stream_putc (s
, BGP_OPEN_OPT_CAP
);
678 capp
= stream_get_endp (s
); /* Set Capability Len Pointer */
679 stream_putc (s
, 0); /* Capability Length */
680 stream_putc (s
, code
); /* Capability Code */
681 orfp
= stream_get_endp (s
); /* Set ORF Len Pointer */
682 stream_putc (s
, 0); /* ORF Length */
683 stream_putw (s
, afi
);
685 stream_putc (s
, safi
);
686 numberp
= stream_get_endp (s
); /* Set Number Pointer */
687 stream_putc (s
, 0); /* Number of ORFs */
689 /* Address Prefix ORF */
690 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
691 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
693 stream_putc (s
, (code
== CAPABILITY_CODE_ORF
?
694 ORF_TYPE_PREFIX
: ORF_TYPE_PREFIX_OLD
));
696 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
697 && CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
699 SET_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
);
700 SET_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
);
701 stream_putc (s
, ORF_MODE_BOTH
);
703 else if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
))
705 SET_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
);
706 stream_putc (s
, ORF_MODE_SEND
);
710 SET_FLAG (peer
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
);
711 stream_putc (s
, ORF_MODE_RECEIVE
);
716 /* Total Number of ORFs. */
717 stream_putc_at (s
, numberp
, number_of_orfs
);
720 orf_len
= stream_get_endp (s
) - orfp
- 1;
721 stream_putc_at (s
, orfp
, orf_len
);
723 /* Total Capability Len. */
724 cap_len
= stream_get_endp (s
) - capp
- 1;
725 stream_putc_at (s
, capp
, cap_len
);
728 /* Fill in capability open option to the packet. */
730 bgp_open_capability (struct stream
*s
, struct peer
*peer
)
737 /* Remember current pointer for Opt Parm Len. */
738 cp
= stream_get_endp (s
);
743 /* Do not send capability. */
744 if (! CHECK_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
)
745 || CHECK_FLAG (peer
->flags
, PEER_FLAG_DONT_CAPABILITY
))
749 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
751 peer
->afc_adv
[AFI_IP
][SAFI_UNICAST
] = 1;
752 stream_putc (s
, BGP_OPEN_OPT_CAP
);
753 stream_putc (s
, CAPABILITY_CODE_MP_LEN
+ 2);
754 stream_putc (s
, CAPABILITY_CODE_MP
);
755 stream_putc (s
, CAPABILITY_CODE_MP_LEN
);
756 stream_putw (s
, AFI_IP
);
758 stream_putc (s
, SAFI_UNICAST
);
760 /* IPv4 multicast. */
761 if (peer
->afc
[AFI_IP
][SAFI_MULTICAST
])
763 peer
->afc_adv
[AFI_IP
][SAFI_MULTICAST
] = 1;
764 stream_putc (s
, BGP_OPEN_OPT_CAP
);
765 stream_putc (s
, CAPABILITY_CODE_MP_LEN
+ 2);
766 stream_putc (s
, CAPABILITY_CODE_MP
);
767 stream_putc (s
, CAPABILITY_CODE_MP_LEN
);
768 stream_putw (s
, AFI_IP
);
770 stream_putc (s
, SAFI_MULTICAST
);
773 if (peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
])
775 peer
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
] = 1;
776 stream_putc (s
, BGP_OPEN_OPT_CAP
);
777 stream_putc (s
, CAPABILITY_CODE_MP_LEN
+ 2);
778 stream_putc (s
, CAPABILITY_CODE_MP
);
779 stream_putc (s
, CAPABILITY_CODE_MP_LEN
);
780 stream_putw (s
, AFI_IP
);
782 stream_putc (s
, BGP_SAFI_VPNV4
);
786 if (peer
->afc
[AFI_IP6
][SAFI_UNICAST
])
788 peer
->afc_adv
[AFI_IP6
][SAFI_UNICAST
] = 1;
789 stream_putc (s
, BGP_OPEN_OPT_CAP
);
790 stream_putc (s
, CAPABILITY_CODE_MP_LEN
+ 2);
791 stream_putc (s
, CAPABILITY_CODE_MP
);
792 stream_putc (s
, CAPABILITY_CODE_MP_LEN
);
793 stream_putw (s
, AFI_IP6
);
795 stream_putc (s
, SAFI_UNICAST
);
797 /* IPv6 multicast. */
798 if (peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
800 peer
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
] = 1;
801 stream_putc (s
, BGP_OPEN_OPT_CAP
);
802 stream_putc (s
, CAPABILITY_CODE_MP_LEN
+ 2);
803 stream_putc (s
, CAPABILITY_CODE_MP
);
804 stream_putc (s
, CAPABILITY_CODE_MP_LEN
);
805 stream_putw (s
, AFI_IP6
);
807 stream_putc (s
, SAFI_MULTICAST
);
809 #endif /* HAVE_IPV6 */
812 SET_FLAG (peer
->cap
, PEER_CAP_REFRESH_ADV
);
813 stream_putc (s
, BGP_OPEN_OPT_CAP
);
814 stream_putc (s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
815 stream_putc (s
, CAPABILITY_CODE_REFRESH_OLD
);
816 stream_putc (s
, CAPABILITY_CODE_REFRESH_LEN
);
817 stream_putc (s
, BGP_OPEN_OPT_CAP
);
818 stream_putc (s
, CAPABILITY_CODE_REFRESH_LEN
+ 2);
819 stream_putc (s
, CAPABILITY_CODE_REFRESH
);
820 stream_putc (s
, CAPABILITY_CODE_REFRESH_LEN
);
822 /* ORF capability. */
823 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
824 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
825 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_SM
)
826 || CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ORF_PREFIX_RM
))
828 bgp_open_capability_orf (s
, peer
, afi
, safi
, CAPABILITY_CODE_ORF_OLD
);
829 bgp_open_capability_orf (s
, peer
, afi
, safi
, CAPABILITY_CODE_ORF
);
832 /* Dynamic capability. */
833 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_DYNAMIC_CAPABILITY
))
835 SET_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_ADV
);
836 stream_putc (s
, BGP_OPEN_OPT_CAP
);
837 stream_putc (s
, CAPABILITY_CODE_DYNAMIC_LEN
+ 2);
838 stream_putc (s
, CAPABILITY_CODE_DYNAMIC
);
839 stream_putc (s
, CAPABILITY_CODE_DYNAMIC_LEN
);
842 /* Graceful restart capability */
843 if (bgp_flag_check (peer
->bgp
, BGP_FLAG_GRACEFUL_RESTART
))
845 SET_FLAG (peer
->cap
, PEER_CAP_RESTART_ADV
);
846 stream_putc (s
, BGP_OPEN_OPT_CAP
);
847 stream_putc (s
, CAPABILITY_CODE_RESTART_LEN
+ 2);
848 stream_putc (s
, CAPABILITY_CODE_RESTART
);
849 stream_putc (s
, CAPABILITY_CODE_RESTART_LEN
);
850 stream_putw (s
, peer
->bgp
->restart_time
);
853 /* Total Opt Parm Len. */
854 len
= stream_get_endp (s
) - cp
- 1;
855 stream_putc_at (s
, cp
, len
);