]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_open.c
Merge branch 'stable/2.0-for-merge'
[mirror_frr.git] / bgpd / bgp_open.c
1 /* BGP open message handling
2 Copyright (C) 1998, 1999 Kunihiro Ishiguro
3
4 This file is part of GNU Zebra.
5
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
9 later version.
10
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.
15
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
19 02111-1307, USA. */
20
21 #include <zebra.h>
22
23 #include "linklist.h"
24 #include "prefix.h"
25 #include "stream.h"
26 #include "thread.h"
27 #include "log.h"
28 #include "command.h"
29 #include "memory.h"
30 #include "queue.h"
31 #include "filter.h"
32
33 #include "lib/json.h"
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"
43
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.
48
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. */
53
54 void
55 bgp_capability_vty_out (struct vty *vty, struct peer *peer, u_char use_json, json_object *json_neigh)
56 {
57 char *pnt;
58 char *end;
59 struct capability_mp_data mpc;
60 struct capability_header *hdr;
61 json_object *json_cap = NULL;
62
63 if (use_json)
64 json_cap = json_object_new_object();
65
66 pnt = peer->notify.data;
67 end = pnt + peer->notify.length;
68
69 while (pnt < end)
70 {
71 if (pnt + sizeof (struct capability_mp_data) + 2 > end)
72 return;
73
74 hdr = (struct capability_header *)pnt;
75 if (pnt + hdr->length + 2 > end)
76 return;
77
78 memcpy (&mpc, pnt + 2, sizeof(struct capability_mp_data));
79
80 if (hdr->code == CAPABILITY_CODE_MP)
81 {
82 afi_t afi;
83 safi_t safi;
84
85 bgp_map_afi_safi_iana2int (ntohs(mpc.afi), mpc.safi, &afi, &safi);
86 if (use_json)
87 {
88 switch (afi)
89 {
90 case AFI_IP:
91 json_object_string_add(json_cap, "capabilityErrorMultiProtocolAfi", "IPv4");
92 break;
93 case AFI_IP6:
94 json_object_string_add(json_cap, "capabilityErrorMultiProtocolAfi", "IPv6");
95 break;
96 default:
97 json_object_int_add(json_cap, "capabilityErrorMultiProtocolAfiUnknown", ntohs (mpc.afi));
98 break;
99 }
100 switch (safi)
101 {
102 case SAFI_UNICAST:
103 json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "unicast");
104 break;
105 case SAFI_MULTICAST:
106 json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "multicast");
107 break;
108 case SAFI_MPLS_VPN:
109 json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "MPLS-labeled VPN");
110 break;
111 case SAFI_ENCAP:
112 json_object_string_add(json_cap, "capabilityErrorMultiProtocolSafi", "encap");
113 break;
114 default:
115 json_object_int_add(json_cap, "capabilityErrorMultiProtocolSafiUnknown", mpc.safi);
116 break;
117 }
118 }
119 else
120 {
121 vty_out (vty, " Capability error for: Multi protocol ");
122 switch (afi)
123 {
124 case AFI_IP:
125 vty_out (vty, "AFI IPv4, ");
126 break;
127 case AFI_IP6:
128 vty_out (vty, "AFI IPv6, ");
129 break;
130 default:
131 vty_out (vty, "AFI Unknown %d, ", ntohs (mpc.afi));
132 break;
133 }
134 switch (safi)
135 {
136 case SAFI_UNICAST:
137 vty_out (vty, "SAFI Unicast");
138 break;
139 case SAFI_MULTICAST:
140 vty_out (vty, "SAFI Multicast");
141 break;
142 case SAFI_MPLS_VPN:
143 vty_out (vty, "SAFI MPLS-labeled VPN");
144 break;
145 case SAFI_ENCAP:
146 vty_out (vty, "SAFI ENCAP");
147 break;
148 default:
149 vty_out (vty, "SAFI Unknown %d ", mpc.safi);
150 break;
151 }
152 vty_out (vty, "%s", VTY_NEWLINE);
153 }
154 }
155 else if (hdr->code >= 128)
156 {
157 if (use_json)
158 json_object_int_add(json_cap, "capabilityErrorVendorSpecificCapabilityCode", hdr->code);
159 else
160 vty_out (vty, " Capability error: vendor specific capability code %d",
161 hdr->code);
162 }
163 else
164 {
165 if (use_json)
166 json_object_int_add(json_cap, "capabilityErrorUnknownCapabilityCode", hdr->code);
167 else
168 vty_out (vty, " Capability error: unknown capability code %d",
169 hdr->code);
170 }
171 pnt += hdr->length + 2;
172 }
173 if (use_json)
174 json_object_object_add(json_neigh, "capabilityErrors", json_cap);
175 }
176
177 static void
178 bgp_capability_mp_data (struct stream *s, struct capability_mp_data *mpc)
179 {
180 mpc->afi = stream_getw (s);
181 mpc->reserved = stream_getc (s);
182 mpc->safi = stream_getc (s);
183 }
184
185 /* Set negotiated capability value. */
186 static int
187 bgp_capability_mp (struct peer *peer, struct capability_header *hdr)
188 {
189 struct capability_mp_data mpc;
190 struct stream *s = BGP_INPUT (peer);
191
192 /* Verify length is 4 */
193 if (hdr->length != 4)
194 {
195 zlog_warn("MP Cap: Received invalid length %d, non-multiple of 4",
196 hdr->length);
197 return -1;
198 }
199
200 bgp_capability_mp_data (s, &mpc);
201
202 if (bgp_debug_neighbor_events(peer))
203 zlog_debug ("%s OPEN has MP_EXT CAP for afi/safi: %u/%u",
204 peer->host, mpc.afi, mpc.safi);
205
206 /* Convert AFI, SAFI to internal values, check. */
207 if (bgp_map_afi_safi_iana2int (mpc.afi, mpc.safi, &mpc.afi, &mpc.safi))
208 return -1;
209
210 /* Now safi remapped, and afi/safi are valid array indices */
211 peer->afc_recv[mpc.afi][mpc.safi] = 1;
212
213 if (peer->afc[mpc.afi][mpc.safi])
214 peer->afc_nego[mpc.afi][mpc.safi] = 1;
215 else
216 return -1;
217
218 return 0;
219 }
220
221 static void
222 bgp_capability_orf_not_support (struct peer *peer, afi_t afi, safi_t safi,
223 u_char type, u_char mode)
224 {
225 if (bgp_debug_neighbor_events(peer))
226 zlog_debug ("%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
227 peer->host, afi, safi, type, mode);
228 }
229
230 static const struct message orf_type_str[] =
231 {
232 { ORF_TYPE_PREFIX, "Prefixlist" },
233 { ORF_TYPE_PREFIX_OLD, "Prefixlist (old)" },
234 };
235 static const int orf_type_str_max = array_size(orf_type_str);
236
237 static const struct message orf_mode_str[] =
238 {
239 { ORF_MODE_RECEIVE, "Receive" },
240 { ORF_MODE_SEND, "Send" },
241 { ORF_MODE_BOTH, "Both" },
242 };
243 static const int orf_mode_str_max = array_size(orf_mode_str);
244
245 static int
246 bgp_capability_orf_entry (struct peer *peer, struct capability_header *hdr)
247 {
248 struct stream *s = BGP_INPUT (peer);
249 struct capability_orf_entry entry;
250 afi_t pkt_afi, afi;
251 safi_t pkt_safi, safi;
252 u_char type;
253 u_char mode;
254 u_int16_t sm_cap = 0; /* capability send-mode receive */
255 u_int16_t rm_cap = 0; /* capability receive-mode receive */
256 int i;
257
258 /* ORF Entry header */
259 bgp_capability_mp_data (s, &entry.mpc);
260 entry.num = stream_getc (s);
261 pkt_afi = entry.mpc.afi;
262 pkt_safi = entry.mpc.safi;
263
264 if (bgp_debug_neighbor_events(peer))
265 zlog_debug ("%s ORF Cap entry for afi/safi: %u/%u",
266 peer->host, entry.mpc.afi, entry.mpc.safi);
267
268 /* Convert AFI, SAFI to internal values, check. */
269 if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi))
270 {
271 zlog_info ("%s Addr-family %d/%d not supported."
272 " Ignoring the ORF capability",
273 peer->host, pkt_afi, pkt_safi);
274 return 0;
275 }
276
277 entry.mpc.afi = afi;
278 entry.mpc.safi = safi;
279
280 /* validate number field */
281 if (CAPABILITY_CODE_ORF_LEN + (entry.num * 2) > hdr->length)
282 {
283 zlog_info ("%s ORF Capability entry length error,"
284 " Cap length %u, num %u",
285 peer->host, hdr->length, entry.num);
286 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
287 return -1;
288 }
289
290 for (i = 0 ; i < entry.num ; i++)
291 {
292 type = stream_getc(s);
293 mode = stream_getc(s);
294
295 /* ORF Mode error check */
296 switch (mode)
297 {
298 case ORF_MODE_BOTH:
299 case ORF_MODE_SEND:
300 case ORF_MODE_RECEIVE:
301 break;
302 default:
303 bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode);
304 continue;
305 }
306 /* ORF Type and afi/safi error checks */
307 /* capcode versus type */
308 switch (hdr->code)
309 {
310 case CAPABILITY_CODE_ORF:
311 switch (type)
312 {
313 case ORF_TYPE_PREFIX:
314 break;
315 default:
316 bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode);
317 continue;
318 }
319 break;
320 case CAPABILITY_CODE_ORF_OLD:
321 switch (type)
322 {
323 case ORF_TYPE_PREFIX_OLD:
324 break;
325 default:
326 bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode);
327 continue;
328 }
329 break;
330 default:
331 bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode);
332 continue;
333 }
334
335 /* AFI vs SAFI */
336 if (!((afi == AFI_IP && safi == SAFI_UNICAST)
337 || (afi == AFI_IP && safi == SAFI_MULTICAST)
338 || (afi == AFI_IP6 && safi == SAFI_UNICAST)))
339 {
340 bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode);
341 continue;
342 }
343
344 if (bgp_debug_neighbor_events(peer))
345 zlog_debug ("%s OPEN has %s ORF capability"
346 " as %s for afi/safi: %d/%d",
347 peer->host, LOOKUP (orf_type_str, type),
348 LOOKUP (orf_mode_str, mode),
349 pkt_afi, pkt_safi);
350
351 if (hdr->code == CAPABILITY_CODE_ORF)
352 {
353 sm_cap = PEER_CAP_ORF_PREFIX_SM_RCV;
354 rm_cap = PEER_CAP_ORF_PREFIX_RM_RCV;
355 }
356 else if (hdr->code == CAPABILITY_CODE_ORF_OLD)
357 {
358 sm_cap = PEER_CAP_ORF_PREFIX_SM_OLD_RCV;
359 rm_cap = PEER_CAP_ORF_PREFIX_RM_OLD_RCV;
360 }
361 else
362 {
363 bgp_capability_orf_not_support (peer, pkt_afi, pkt_safi, type, mode);
364 continue;
365 }
366
367 switch (mode)
368 {
369 case ORF_MODE_BOTH:
370 SET_FLAG (peer->af_cap[afi][safi], sm_cap);
371 SET_FLAG (peer->af_cap[afi][safi], rm_cap);
372 break;
373 case ORF_MODE_SEND:
374 SET_FLAG (peer->af_cap[afi][safi], sm_cap);
375 break;
376 case ORF_MODE_RECEIVE:
377 SET_FLAG (peer->af_cap[afi][safi], rm_cap);
378 break;
379 }
380 }
381 return 0;
382 }
383
384 static int
385 bgp_capability_restart (struct peer *peer, struct capability_header *caphdr)
386 {
387 struct stream *s = BGP_INPUT (peer);
388 u_int16_t restart_flag_time;
389 size_t end = stream_get_getp (s) + caphdr->length;
390
391 /* Verify length is a multiple of 4 */
392 if ((caphdr->length-2) % 4)
393 {
394 zlog_warn("Restart Cap: Received invalid length %d, non-multiple of 4",
395 caphdr->length);
396 return -1;
397 }
398
399 SET_FLAG (peer->cap, PEER_CAP_RESTART_RCV);
400 restart_flag_time = stream_getw(s);
401 if (CHECK_FLAG (restart_flag_time, RESTART_R_BIT))
402 SET_FLAG (peer->cap, PEER_CAP_RESTART_BIT_RCV);
403
404 UNSET_FLAG (restart_flag_time, 0xF000);
405 peer->v_gr_restart = restart_flag_time;
406
407 if (bgp_debug_neighbor_events(peer))
408 {
409 zlog_debug ("%s OPEN has Graceful Restart capability", peer->host);
410 zlog_debug ("%s Peer has%srestarted. Restart Time : %d",
411 peer->host,
412 CHECK_FLAG (peer->cap, PEER_CAP_RESTART_BIT_RCV) ? " "
413 : " not ",
414 peer->v_gr_restart);
415 }
416
417 while (stream_get_getp (s) + 4 <= end)
418 {
419 afi_t afi;
420 safi_t safi;
421 afi_t pkt_afi = stream_getw (s);
422 safi_t pkt_safi = stream_getc (s);
423 u_char flag = stream_getc (s);
424
425 /* Convert AFI, SAFI to internal values, check. */
426 if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi))
427 {
428 if (bgp_debug_neighbor_events(peer))
429 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported."
430 " Ignore the Graceful Restart capability for this AFI/SAFI",
431 peer->host, pkt_afi, pkt_safi);
432 }
433 else if (!peer->afc[afi][safi])
434 {
435 if (bgp_debug_neighbor_events(peer))
436 zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled."
437 " Ignore the Graceful Restart capability",
438 peer->host, pkt_afi, pkt_safi);
439 }
440 else
441 {
442 if (bgp_debug_neighbor_events(peer))
443 zlog_debug ("%s Address family %s is%spreserved", peer->host,
444 afi_safi_print (afi, safi),
445 CHECK_FLAG (peer->af_cap[afi][safi],
446 PEER_CAP_RESTART_AF_PRESERVE_RCV)
447 ? " " : " not ");
448
449 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV);
450 if (CHECK_FLAG (flag, RESTART_F_BIT))
451 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV);
452
453 }
454 }
455 return 0;
456 }
457
458 /* Unlike other capability parsing routines, this one returns 0 on error */
459 static as_t
460 bgp_capability_as4 (struct peer *peer, struct capability_header *hdr)
461 {
462 SET_FLAG (peer->cap, PEER_CAP_AS4_RCV);
463
464 if (hdr->length != CAPABILITY_CODE_AS4_LEN)
465 {
466 zlog_err ("%s AS4 capability has incorrect data length %d",
467 peer->host, hdr->length);
468 return 0;
469 }
470
471 as_t as4 = stream_getl (BGP_INPUT(peer));
472
473 if (BGP_DEBUG (as4, AS4))
474 zlog_debug ("%s [AS4] about to set cap PEER_CAP_AS4_RCV, got as4 %u",
475 peer->host, as4);
476 return as4;
477 }
478
479 static int
480 bgp_capability_addpath (struct peer *peer, struct capability_header *hdr)
481 {
482 struct stream *s = BGP_INPUT (peer);
483 size_t end = stream_get_getp (s) + hdr->length;
484
485 SET_FLAG (peer->cap, PEER_CAP_ADDPATH_RCV);
486
487 /* Verify length is a multiple of 4 */
488 if (hdr->length % 4)
489 {
490 zlog_warn("Add Path: Received invalid length %d, non-multiple of 4",
491 hdr->length);
492 return -1;
493 }
494
495 while (stream_get_getp (s) + 4 <= end)
496 {
497 afi_t afi;
498 safi_t safi;
499 afi_t pkt_afi = stream_getw (s);
500 safi_t pkt_safi = stream_getc (s);
501 u_char send_receive = stream_getc (s);
502
503 if (bgp_debug_neighbor_events(peer))
504 zlog_debug ("%s OPEN has AddPath CAP for afi/safi: %u/%u%s%s",
505 peer->host, pkt_afi, pkt_safi,
506 (send_receive & BGP_ADDPATH_RX) ? ", receive" : "",
507 (send_receive & BGP_ADDPATH_TX) ? ", transmit" : "");
508
509 /* Convert AFI, SAFI to internal values, check. */
510 if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi))
511 {
512 if (bgp_debug_neighbor_events(peer))
513 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported."
514 " Ignore the Addpath Attribute for this AFI/SAFI",
515 peer->host, pkt_afi, pkt_safi);
516 continue;
517 }
518 else if (!peer->afc[afi][safi])
519 {
520 if (bgp_debug_neighbor_events(peer))
521 zlog_debug ("%s Addr-family %d/%d(afi/safi) not enabled."
522 " Ignore the AddPath capability for this AFI/SAFI",
523 peer->host, pkt_afi, pkt_safi);
524 continue;
525 }
526
527 if (send_receive & BGP_ADDPATH_RX)
528 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_RCV);
529
530 if (send_receive & BGP_ADDPATH_TX)
531 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_RCV);
532 }
533
534 return 0;
535 }
536
537 static int
538 bgp_capability_enhe (struct peer *peer, struct capability_header *hdr)
539 {
540 struct stream *s = BGP_INPUT (peer);
541 size_t end = stream_get_getp (s) + hdr->length;
542
543 /* Verify length is a multiple of 4 */
544 if (hdr->length % 6)
545 {
546 zlog_warn("Extended NH: Received invalid length %d, non-multiple of 6",
547 hdr->length);
548 return -1;
549 }
550
551 while (stream_get_getp (s) + 6 <= end)
552 {
553 afi_t afi, pkt_afi = stream_getw (s);
554 safi_t safi, pkt_safi = stream_getw (s);
555 afi_t nh_afi, pkt_nh_afi = stream_getw (s);
556
557 if (bgp_debug_neighbor_events(peer))
558 zlog_debug ("%s Received with afi/safi/next-hop afi: %u/%u/%u",
559 peer->host, pkt_afi, pkt_safi, pkt_nh_afi);
560
561 /* Convert AFI, SAFI to internal values, check. */
562 if (bgp_map_afi_safi_iana2int (pkt_afi, pkt_safi, &afi, &safi))
563 {
564 if (bgp_debug_neighbor_events(peer))
565 zlog_debug ("%s Addr-family %d/%d(afi/safi) not supported."
566 " Ignore the ENHE Attribute for this AFI/SAFI",
567 peer->host, pkt_afi, pkt_safi);
568 continue;
569 }
570
571 /* RFC 5549 specifies use of this capability only for IPv4 AFI, with
572 * the Nexthop AFI being IPv6. A future spec may introduce other
573 * possibilities, so we ignore other values with a log. Also, only
574 * Unicast SAFI is currently supported (and expected).
575 */
576 nh_afi = afi_iana2int (pkt_nh_afi);
577
578 if (afi != AFI_IP || safi != SAFI_UNICAST || nh_afi != AFI_IP6)
579 {
580 zlog_warn ("%s Unexpected afi/safi/next-hop afi: %u/%u/%u "
581 "in Extended Next-hop capability, ignoring",
582 peer->host, pkt_afi, pkt_safi, pkt_nh_afi);
583 continue;
584 }
585
586 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ENHE_AF_RCV);
587
588 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ENHE_AF_ADV))
589 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ENHE_AF_NEGO);
590 }
591
592 SET_FLAG (peer->cap, PEER_CAP_ENHE_RCV);
593
594 return 0;
595 }
596
597 static int
598 bgp_capability_hostname (struct peer *peer, struct capability_header *hdr)
599 {
600 struct stream *s = BGP_INPUT (peer);
601 char str[BGP_MAX_HOSTNAME+1];
602 size_t end = stream_get_getp (s) + hdr->length;
603 u_char len;
604
605 SET_FLAG(peer->cap, PEER_CAP_HOSTNAME_RCV);
606
607 len = stream_getc(s);
608 if (stream_get_getp(s) + len > end)
609 {
610 zlog_warn("%s: Received malformed hostname capability from peer %s",
611 __FUNCTION__, peer->host);
612 return -1;
613 }
614
615 if (len > BGP_MAX_HOSTNAME)
616 {
617 stream_get(str, s, BGP_MAX_HOSTNAME);
618 stream_forward_getp(s, len-BGP_MAX_HOSTNAME);
619 len = BGP_MAX_HOSTNAME; /* to set the '\0' below */
620 }
621 else if (len)
622 stream_get(str, s, len);
623
624 if (len)
625 {
626 str[len] = '\0';
627
628 if (peer->hostname != NULL)
629 {
630 XFREE(MTYPE_BGP_PEER_HOST, peer->hostname);
631 peer->hostname = NULL;
632 }
633
634 if (peer->domainname != NULL)
635 {
636 XFREE(MTYPE_BGP_PEER_HOST, peer->domainname);
637 peer->domainname = NULL;
638 }
639
640 peer->hostname = XSTRDUP(MTYPE_BGP_PEER_HOST, str);
641 }
642
643 if (stream_get_getp(s) +1 > end)
644 {
645 zlog_warn("%s: Received invalid domain name len (hostname capability) from peer %s",
646 __FUNCTION__, peer->host);
647 return -1;
648 }
649
650 len = stream_getc(s);
651 if (stream_get_getp(s) + len > end)
652 {
653 zlog_warn("%s: Received runt domain name (hostname capability) from peer %s",
654 __FUNCTION__, peer->host);
655 return -1;
656 }
657
658 if (len > BGP_MAX_HOSTNAME)
659 {
660 stream_get(str, s, BGP_MAX_HOSTNAME);
661 stream_forward_getp(s, len-BGP_MAX_HOSTNAME);
662 len = BGP_MAX_HOSTNAME; /* to set the '\0' below */
663 }
664 else if (len)
665 stream_get(str, s, len);
666
667 if (len)
668 {
669 str[len] = '\0';
670 peer->domainname = XSTRDUP(MTYPE_BGP_PEER_HOST, str);
671 }
672
673 if (bgp_debug_neighbor_events(peer))
674 {
675 zlog_debug("%s received hostname %s, domainname %s",
676 peer->host, peer->hostname, peer->domainname);
677 }
678
679 return 0;
680 }
681
682 static const struct message capcode_str[] =
683 {
684 { CAPABILITY_CODE_MP, "MultiProtocol Extensions" },
685 { CAPABILITY_CODE_REFRESH, "Route Refresh" },
686 { CAPABILITY_CODE_ORF, "Cooperative Route Filtering" },
687 { CAPABILITY_CODE_RESTART, "Graceful Restart" },
688 { CAPABILITY_CODE_AS4, "4-octet AS number" },
689 { CAPABILITY_CODE_ADDPATH, "AddPath" },
690 { CAPABILITY_CODE_DYNAMIC, "Dynamic" },
691 { CAPABILITY_CODE_ENHE, "Extended Next Hop Encoding" },
692 { CAPABILITY_CODE_DYNAMIC_OLD, "Dynamic (Old)" },
693 { CAPABILITY_CODE_REFRESH_OLD, "Route Refresh (Old)" },
694 { CAPABILITY_CODE_ORF_OLD, "ORF (Old)" },
695 { CAPABILITY_CODE_FQDN, "FQDN" },
696 };
697 static const int capcode_str_max = array_size(capcode_str);
698
699 /* Minimum sizes for length field of each cap (so not inc. the header) */
700 static const size_t cap_minsizes[] =
701 {
702 [CAPABILITY_CODE_MP] = CAPABILITY_CODE_MP_LEN,
703 [CAPABILITY_CODE_REFRESH] = CAPABILITY_CODE_REFRESH_LEN,
704 [CAPABILITY_CODE_ORF] = CAPABILITY_CODE_ORF_LEN,
705 [CAPABILITY_CODE_RESTART] = CAPABILITY_CODE_RESTART_LEN,
706 [CAPABILITY_CODE_AS4] = CAPABILITY_CODE_AS4_LEN,
707 [CAPABILITY_CODE_ADDPATH] = CAPABILITY_CODE_ADDPATH_LEN,
708 [CAPABILITY_CODE_DYNAMIC] = CAPABILITY_CODE_DYNAMIC_LEN,
709 [CAPABILITY_CODE_DYNAMIC_OLD] = CAPABILITY_CODE_DYNAMIC_LEN,
710 [CAPABILITY_CODE_ENHE] = CAPABILITY_CODE_ENHE_LEN,
711 [CAPABILITY_CODE_REFRESH_OLD] = CAPABILITY_CODE_REFRESH_LEN,
712 [CAPABILITY_CODE_ORF_OLD] = CAPABILITY_CODE_ORF_LEN,
713 [CAPABILITY_CODE_FQDN] = CAPABILITY_CODE_MIN_FQDN_LEN,
714 };
715
716 /* value the capability must be a multiple of.
717 * 0-data capabilities won't be checked against this.
718 * Other capabilities whose data doesn't fall on convenient boundaries for this
719 * table should be set to 1.
720 */
721 static const size_t cap_modsizes[] =
722 {
723 [CAPABILITY_CODE_MP] = 4,
724 [CAPABILITY_CODE_REFRESH] = 1,
725 [CAPABILITY_CODE_ORF] = 1,
726 [CAPABILITY_CODE_RESTART] = 1,
727 [CAPABILITY_CODE_AS4] = 4,
728 [CAPABILITY_CODE_ADDPATH] = 4,
729 [CAPABILITY_CODE_DYNAMIC] = 1,
730 [CAPABILITY_CODE_DYNAMIC_OLD] = 1,
731 [CAPABILITY_CODE_ENHE] = 6,
732 [CAPABILITY_CODE_REFRESH_OLD] = 1,
733 [CAPABILITY_CODE_ORF_OLD] = 1,
734 [CAPABILITY_CODE_FQDN] = 1,
735 };
736
737 /**
738 * Parse given capability.
739 * XXX: This is reading into a stream, but not using stream API
740 *
741 * @param[out] mp_capability Set to 1 on return iff one or more Multiprotocol
742 * capabilities were encountered.
743 */
744 static int
745 bgp_capability_parse (struct peer *peer, size_t length, int *mp_capability,
746 u_char **error)
747 {
748 int ret;
749 struct stream *s = BGP_INPUT (peer);
750 size_t end = stream_get_getp (s) + length;
751
752 assert (STREAM_READABLE (s) >= length);
753
754 while (stream_get_getp (s) < end)
755 {
756 size_t start;
757 u_char *sp = stream_pnt (s);
758 struct capability_header caphdr;
759
760 ret = 0;
761 /* We need at least capability code and capability length. */
762 if (stream_get_getp(s) + 2 > end)
763 {
764 zlog_info ("%s Capability length error (< header)", peer->host);
765 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
766 return -1;
767 }
768
769 caphdr.code = stream_getc (s);
770 caphdr.length = stream_getc (s);
771 start = stream_get_getp (s);
772
773 /* Capability length check sanity check. */
774 if (start + caphdr.length > end)
775 {
776 zlog_info ("%s Capability length error (< length)", peer->host);
777 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
778 return -1;
779 }
780
781 if (bgp_debug_neighbor_events(peer))
782 zlog_debug ("%s OPEN has %s capability (%u), length %u",
783 peer->host,
784 LOOKUP (capcode_str, caphdr.code),
785 caphdr.code, caphdr.length);
786
787 /* Length sanity check, type-specific, for known capabilities */
788 switch (caphdr.code)
789 {
790 case CAPABILITY_CODE_MP:
791 case CAPABILITY_CODE_REFRESH:
792 case CAPABILITY_CODE_REFRESH_OLD:
793 case CAPABILITY_CODE_ORF:
794 case CAPABILITY_CODE_ORF_OLD:
795 case CAPABILITY_CODE_RESTART:
796 case CAPABILITY_CODE_AS4:
797 case CAPABILITY_CODE_ADDPATH:
798 case CAPABILITY_CODE_DYNAMIC:
799 case CAPABILITY_CODE_DYNAMIC_OLD:
800 case CAPABILITY_CODE_ENHE:
801 case CAPABILITY_CODE_FQDN:
802 /* Check length. */
803 if (caphdr.length < cap_minsizes[caphdr.code])
804 {
805 zlog_info ("%s %s Capability length error: got %u,"
806 " expected at least %u",
807 peer->host,
808 LOOKUP (capcode_str, caphdr.code),
809 caphdr.length,
810 (unsigned) cap_minsizes[caphdr.code]);
811 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
812 return -1;
813 }
814 if (caphdr.length
815 && caphdr.length % cap_modsizes[caphdr.code] != 0)
816 {
817 zlog_info ("%s %s Capability length error: got %u,"
818 " expected a multiple of %u",
819 peer->host,
820 LOOKUP (capcode_str, caphdr.code),
821 caphdr.length,
822 (unsigned) cap_modsizes[caphdr.code]);
823 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR,
824 BGP_NOTIFY_OPEN_MALFORMED_ATTR);
825 return -1;
826 }
827 /* we deliberately ignore unknown codes, see below */
828 default:
829 break;
830 }
831
832 switch (caphdr.code)
833 {
834 case CAPABILITY_CODE_MP:
835 {
836 *mp_capability = 1;
837
838 /* Ignore capability when override-capability is set. */
839 if (! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
840 {
841 /* Set negotiated value. */
842 ret = bgp_capability_mp (peer, &caphdr);
843
844 /* Unsupported Capability. */
845 if (ret < 0)
846 {
847 /* Store return data. */
848 memcpy (*error, sp, caphdr.length + 2);
849 *error += caphdr.length + 2;
850 }
851 ret = 0; /* Don't return error for this */
852 }
853 }
854 break;
855 case CAPABILITY_CODE_REFRESH:
856 case CAPABILITY_CODE_REFRESH_OLD:
857 {
858 /* BGP refresh capability */
859 if (caphdr.code == CAPABILITY_CODE_REFRESH_OLD)
860 SET_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV);
861 else
862 SET_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV);
863 }
864 break;
865 case CAPABILITY_CODE_ORF:
866 case CAPABILITY_CODE_ORF_OLD:
867 ret = bgp_capability_orf_entry (peer, &caphdr);
868 break;
869 case CAPABILITY_CODE_RESTART:
870 ret = bgp_capability_restart (peer, &caphdr);
871 break;
872 case CAPABILITY_CODE_DYNAMIC:
873 case CAPABILITY_CODE_DYNAMIC_OLD:
874 SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV);
875 break;
876 case CAPABILITY_CODE_AS4:
877 /* Already handled as a special-case parsing of the capabilities
878 * at the beginning of OPEN processing. So we care not a jot
879 * for the value really, only error case.
880 */
881 if (!bgp_capability_as4 (peer, &caphdr))
882 ret = -1;
883 break;
884 case CAPABILITY_CODE_ADDPATH:
885 ret = bgp_capability_addpath (peer, &caphdr);
886 break;
887 case CAPABILITY_CODE_ENHE:
888 ret = bgp_capability_enhe (peer, &caphdr);
889 break;
890 case CAPABILITY_CODE_FQDN:
891 ret = bgp_capability_hostname (peer, &caphdr);
892 break;
893 default:
894 if (caphdr.code > 128)
895 {
896 /* We don't send Notification for unknown vendor specific
897 capabilities. It seems reasonable for now... */
898 zlog_warn ("%s Vendor specific capability %d",
899 peer->host, caphdr.code);
900 }
901 else
902 {
903 zlog_warn ("%s unrecognized capability code: %d - ignored",
904 peer->host, caphdr.code);
905 memcpy (*error, sp, caphdr.length + 2);
906 *error += caphdr.length + 2;
907 }
908 }
909
910 if (ret < 0)
911 {
912 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
913 return -1;
914 }
915 if (stream_get_getp(s) != (start + caphdr.length))
916 {
917 if (stream_get_getp(s) > (start + caphdr.length))
918 zlog_warn ("%s Cap-parser for %s read past cap-length, %u!",
919 peer->host, LOOKUP (capcode_str, caphdr.code),
920 caphdr.length);
921 stream_set_getp (s, start + caphdr.length);
922 }
923 }
924 return 0;
925 }
926
927 static int
928 bgp_auth_parse (struct peer *peer, size_t length)
929 {
930 bgp_notify_send (peer,
931 BGP_NOTIFY_OPEN_ERR,
932 BGP_NOTIFY_OPEN_AUTH_FAILURE);
933 return -1;
934 }
935
936 static int
937 strict_capability_same (struct peer *peer)
938 {
939 int i, j;
940
941 for (i = AFI_IP; i < AFI_MAX; i++)
942 for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
943 if (peer->afc[i][j] != peer->afc_nego[i][j])
944 return 0;
945 return 1;
946 }
947
948 /* peek into option, stores ASN to *as4 if the AS4 capability was found.
949 * Returns 0 if no as4 found, as4cap value otherwise.
950 */
951 as_t
952 peek_for_as4_capability (struct peer *peer, u_char length)
953 {
954 struct stream *s = BGP_INPUT (peer);
955 size_t orig_getp = stream_get_getp (s);
956 size_t end = orig_getp + length;
957 as_t as4 = 0;
958
959 if (BGP_DEBUG (as4, AS4))
960 zlog_info ("%s [AS4] rcv OPEN w/ OPTION parameter len: %u,"
961 " peeking for as4",
962 peer->host, length);
963 /* the error cases we DONT handle, we ONLY try to read as4 out of
964 * correctly formatted options.
965 */
966 while (stream_get_getp(s) < end)
967 {
968 u_char opt_type;
969 u_char opt_length;
970
971 /* Check the length. */
972 if (stream_get_getp (s) + 2 > end)
973 goto end;
974
975 /* Fetch option type and length. */
976 opt_type = stream_getc (s);
977 opt_length = stream_getc (s);
978
979 /* Option length check. */
980 if (stream_get_getp (s) + opt_length > end)
981 goto end;
982
983 if (opt_type == BGP_OPEN_OPT_CAP)
984 {
985 unsigned long capd_start = stream_get_getp (s);
986 unsigned long capd_end = capd_start + opt_length;
987
988 assert (capd_end <= end);
989
990 while (stream_get_getp (s) < capd_end)
991 {
992 struct capability_header hdr;
993
994 if (stream_get_getp (s) + 2 > capd_end)
995 goto end;
996
997 hdr.code = stream_getc (s);
998 hdr.length = stream_getc (s);
999
1000 if ((stream_get_getp(s) + hdr.length) > capd_end)
1001 goto end;
1002
1003 if (hdr.code == CAPABILITY_CODE_AS4)
1004 {
1005 if (BGP_DEBUG (as4, AS4))
1006 zlog_info ("[AS4] found AS4 capability, about to parse");
1007 as4 = bgp_capability_as4 (peer, &hdr);
1008
1009 goto end;
1010 }
1011 stream_forward_getp (s, hdr.length);
1012 }
1013 }
1014 }
1015
1016 end:
1017 stream_set_getp (s, orig_getp);
1018 return as4;
1019 }
1020
1021 /**
1022 * Parse open option.
1023 *
1024 * @param[out] mp_capability @see bgp_capability_parse() for semantics.
1025 */
1026 int
1027 bgp_open_option_parse (struct peer *peer, u_char length, int *mp_capability)
1028 {
1029 int ret = 0;
1030 u_char *error;
1031 u_char error_data[BGP_MAX_PACKET_SIZE];
1032 struct stream *s = BGP_INPUT(peer);
1033 size_t end = stream_get_getp (s) + length;
1034
1035 error = error_data;
1036
1037 if (bgp_debug_neighbor_events(peer))
1038 zlog_debug ("%s rcv OPEN w/ OPTION parameter len: %u",
1039 peer->host, length);
1040
1041 while (stream_get_getp(s) < end)
1042 {
1043 u_char opt_type;
1044 u_char opt_length;
1045
1046 /* Must have at least an OPEN option header */
1047 if (STREAM_READABLE(s) < 2)
1048 {
1049 zlog_info ("%s Option length error", peer->host);
1050 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
1051 return -1;
1052 }
1053
1054 /* Fetch option type and length. */
1055 opt_type = stream_getc (s);
1056 opt_length = stream_getc (s);
1057
1058 /* Option length check. */
1059 if (STREAM_READABLE (s) < opt_length)
1060 {
1061 zlog_info ("%s Option length error", peer->host);
1062 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR, BGP_NOTIFY_OPEN_MALFORMED_ATTR);
1063 return -1;
1064 }
1065
1066 if (bgp_debug_neighbor_events(peer))
1067 zlog_debug ("%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
1068 peer->host, opt_type,
1069 opt_type == BGP_OPEN_OPT_AUTH ? "Authentication" :
1070 opt_type == BGP_OPEN_OPT_CAP ? "Capability" : "Unknown",
1071 opt_length);
1072
1073 switch (opt_type)
1074 {
1075 case BGP_OPEN_OPT_AUTH:
1076 ret = bgp_auth_parse (peer, opt_length);
1077 break;
1078 case BGP_OPEN_OPT_CAP:
1079 ret = bgp_capability_parse (peer, opt_length, mp_capability, &error);
1080 break;
1081 default:
1082 bgp_notify_send (peer,
1083 BGP_NOTIFY_OPEN_ERR,
1084 BGP_NOTIFY_OPEN_UNSUP_PARAM);
1085 ret = -1;
1086 break;
1087 }
1088
1089 /* Parse error. To accumulate all unsupported capability codes,
1090 bgp_capability_parse does not return -1 when encounter
1091 unsupported capability code. To detect that, please check
1092 error and erro_data pointer, like below. */
1093 if (ret < 0)
1094 return -1;
1095 }
1096
1097 /* All OPEN option is parsed. Check capability when strict compare
1098 flag is enabled.*/
1099 if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
1100 {
1101 /* If Unsupported Capability exists. */
1102 if (error != error_data)
1103 {
1104 bgp_notify_send_with_data (peer,
1105 BGP_NOTIFY_OPEN_ERR,
1106 BGP_NOTIFY_OPEN_UNSUP_CAPBL,
1107 error_data, error - error_data);
1108 return -1;
1109 }
1110
1111 /* Check local capability does not negotiated with remote
1112 peer. */
1113 if (! strict_capability_same (peer))
1114 {
1115 bgp_notify_send (peer,
1116 BGP_NOTIFY_OPEN_ERR,
1117 BGP_NOTIFY_OPEN_UNSUP_CAPBL);
1118 return -1;
1119 }
1120 }
1121
1122 /* Check there are no common AFI/SAFIs and send Unsupported Capability
1123 error. */
1124 if (*mp_capability &&
1125 ! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
1126 {
1127 if (! peer->afc_nego[AFI_IP][SAFI_UNICAST]
1128 && ! peer->afc_nego[AFI_IP][SAFI_MULTICAST]
1129 && ! peer->afc_nego[AFI_IP][SAFI_MPLS_VPN]
1130 && ! peer->afc_nego[AFI_IP][SAFI_ENCAP]
1131 && ! peer->afc_nego[AFI_IP6][SAFI_UNICAST]
1132 && ! peer->afc_nego[AFI_IP6][SAFI_MULTICAST]
1133 && ! peer->afc_nego[AFI_IP6][SAFI_MPLS_VPN]
1134 && ! peer->afc_nego[AFI_IP6][SAFI_ENCAP])
1135 {
1136 zlog_err ("%s [Error] Configured AFI/SAFIs do not "
1137 "overlap with received MP capabilities",
1138 peer->host);
1139
1140 if (error != error_data)
1141 bgp_notify_send_with_data (peer,
1142 BGP_NOTIFY_OPEN_ERR,
1143 BGP_NOTIFY_OPEN_UNSUP_CAPBL,
1144 error_data, error - error_data);
1145 else
1146 bgp_notify_send (peer,
1147 BGP_NOTIFY_OPEN_ERR,
1148 BGP_NOTIFY_OPEN_UNSUP_CAPBL);
1149 return -1;
1150 }
1151 }
1152 return 0;
1153 }
1154
1155 static void
1156 bgp_open_capability_orf (struct stream *s, struct peer *peer,
1157 afi_t afi, safi_t safi, u_char code)
1158 {
1159 u_char cap_len;
1160 u_char orf_len;
1161 unsigned long capp;
1162 unsigned long orfp;
1163 unsigned long numberp;
1164 int number_of_orfs = 0;
1165 afi_t pkt_afi;
1166 safi_t pkt_safi;
1167
1168 /* Convert AFI, SAFI to values for packet. */
1169 bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi);
1170
1171 stream_putc (s, BGP_OPEN_OPT_CAP);
1172 capp = stream_get_endp (s); /* Set Capability Len Pointer */
1173 stream_putc (s, 0); /* Capability Length */
1174 stream_putc (s, code); /* Capability Code */
1175 orfp = stream_get_endp (s); /* Set ORF Len Pointer */
1176 stream_putc (s, 0); /* ORF Length */
1177 stream_putw (s, pkt_afi);
1178 stream_putc (s, 0);
1179 stream_putc (s, pkt_safi);
1180 numberp = stream_get_endp (s); /* Set Number Pointer */
1181 stream_putc (s, 0); /* Number of ORFs */
1182
1183 /* Address Prefix ORF */
1184 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
1185 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
1186 {
1187 stream_putc (s, (code == CAPABILITY_CODE_ORF ?
1188 ORF_TYPE_PREFIX : ORF_TYPE_PREFIX_OLD));
1189
1190 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
1191 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
1192 {
1193 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
1194 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
1195 stream_putc (s, ORF_MODE_BOTH);
1196 }
1197 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM))
1198 {
1199 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
1200 stream_putc (s, ORF_MODE_SEND);
1201 }
1202 else
1203 {
1204 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
1205 stream_putc (s, ORF_MODE_RECEIVE);
1206 }
1207 number_of_orfs++;
1208 }
1209
1210 /* Total Number of ORFs. */
1211 stream_putc_at (s, numberp, number_of_orfs);
1212
1213 /* Total ORF Len. */
1214 orf_len = stream_get_endp (s) - orfp - 1;
1215 stream_putc_at (s, orfp, orf_len);
1216
1217 /* Total Capability Len. */
1218 cap_len = stream_get_endp (s) - capp - 1;
1219 stream_putc_at (s, capp, cap_len);
1220 }
1221
1222 /* Fill in capability open option to the packet. */
1223 void
1224 bgp_open_capability (struct stream *s, struct peer *peer)
1225 {
1226 u_char len;
1227 unsigned long cp, capp, rcapp;
1228 afi_t afi, pkt_afi;
1229 safi_t safi, pkt_safi;
1230 as_t local_as;
1231 u_int32_t restart_time;
1232 u_char afi_safi_count = 0;
1233 struct utsname names;
1234 int adv_addpath_tx = 0;
1235
1236 /* Remember current pointer for Opt Parm Len. */
1237 cp = stream_get_endp (s);
1238
1239 /* Opt Parm Len. */
1240 stream_putc (s, 0);
1241
1242 /* Do not send capability. */
1243 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN)
1244 || CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
1245 return;
1246
1247 /* MP capability for configured AFI, SAFI */
1248 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1249 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1250 {
1251 if (peer->afc[afi][safi])
1252 {
1253 /* Convert AFI, SAFI to values for packet. */
1254 bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi);
1255
1256 peer->afc_adv[afi][safi] = 1;
1257 stream_putc (s, BGP_OPEN_OPT_CAP);
1258 stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
1259 stream_putc (s, CAPABILITY_CODE_MP);
1260 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1261 stream_putw (s, pkt_afi);
1262 stream_putc (s, 0);
1263 stream_putc (s, pkt_safi);
1264 }
1265 }
1266
1267 /* Extended nexthop capability - currently supporting RFC-5549 for
1268 * Link-Local peering only
1269 */
1270 if (CHECK_FLAG (peer->flags, PEER_FLAG_CAPABILITY_ENHE) &&
1271 peer->su.sa.sa_family == AF_INET6 &&
1272 IN6_IS_ADDR_LINKLOCAL(&peer->su.sin6.sin6_addr))
1273 {
1274 /* RFC 5549 Extended Next Hop Encoding */
1275 SET_FLAG (peer->cap, PEER_CAP_ENHE_ADV);
1276 stream_putc (s, BGP_OPEN_OPT_CAP);
1277 stream_putc (s, CAPABILITY_CODE_ENHE_LEN + 2);
1278 stream_putc (s, CAPABILITY_CODE_ENHE);
1279 stream_putc (s, CAPABILITY_CODE_ENHE_LEN);
1280 /* Currently supporting for SAFI_UNICAST only */
1281 SET_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_ADV);
1282 stream_putw (s, AFI_IP);
1283 stream_putw (s, SAFI_UNICAST);
1284 stream_putw (s, AFI_IP6);
1285
1286 if (CHECK_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_RCV))
1287 SET_FLAG (peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_NEGO);
1288 }
1289
1290 /* Route refresh. */
1291 SET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV);
1292 stream_putc (s, BGP_OPEN_OPT_CAP);
1293 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
1294 stream_putc (s, CAPABILITY_CODE_REFRESH_OLD);
1295 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
1296 stream_putc (s, BGP_OPEN_OPT_CAP);
1297 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
1298 stream_putc (s, CAPABILITY_CODE_REFRESH);
1299 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
1300
1301 /* AS4 */
1302 SET_FLAG (peer->cap, PEER_CAP_AS4_ADV);
1303 stream_putc (s, BGP_OPEN_OPT_CAP);
1304 stream_putc (s, CAPABILITY_CODE_AS4_LEN + 2);
1305 stream_putc (s, CAPABILITY_CODE_AS4);
1306 stream_putc (s, CAPABILITY_CODE_AS4_LEN);
1307 if ( peer->change_local_as )
1308 local_as = peer->change_local_as;
1309 else
1310 local_as = peer->local_as;
1311 stream_putl (s, local_as );
1312
1313 /* AddPath */
1314 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1315 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1316 if (peer->afc[afi][safi])
1317 {
1318 afi_safi_count++;
1319
1320 /* Only advertise addpath TX if a feature that will use it is
1321 * configured */
1322 if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_ALL_PATHS) ||
1323 CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS))
1324 adv_addpath_tx = 1;
1325 }
1326
1327 SET_FLAG (peer->cap, PEER_CAP_ADDPATH_ADV);
1328 stream_putc (s, BGP_OPEN_OPT_CAP);
1329 stream_putc (s, (CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count) + 2);
1330 stream_putc (s, CAPABILITY_CODE_ADDPATH);
1331 stream_putc (s, CAPABILITY_CODE_ADDPATH_LEN * afi_safi_count);
1332
1333 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1334 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1335 if (peer->afc[afi][safi])
1336 {
1337 /* Convert AFI, SAFI to values for packet. */
1338 bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi);
1339
1340 stream_putw (s, pkt_afi);
1341 stream_putc (s, pkt_safi);
1342
1343 if (adv_addpath_tx)
1344 {
1345 stream_putc (s, BGP_ADDPATH_RX|BGP_ADDPATH_TX);
1346 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV);
1347 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV);
1348 }
1349 else
1350 {
1351 stream_putc (s, BGP_ADDPATH_RX);
1352 SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV);
1353 UNSET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV);
1354 }
1355 }
1356
1357 /* ORF capability. */
1358 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1359 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1360 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
1361 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
1362 {
1363 bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF_OLD);
1364 bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF);
1365 }
1366
1367 /* Dynamic capability. */
1368 if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
1369 {
1370 SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV);
1371 stream_putc (s, BGP_OPEN_OPT_CAP);
1372 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN + 2);
1373 stream_putc (s, CAPABILITY_CODE_DYNAMIC_OLD);
1374 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN);
1375 stream_putc (s, BGP_OPEN_OPT_CAP);
1376 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN + 2);
1377 stream_putc (s, CAPABILITY_CODE_DYNAMIC);
1378 stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN);
1379 }
1380
1381 /* Hostname capability */
1382 uname(&names);
1383 if (names.nodename[0] != '\0')
1384 {
1385 SET_FLAG(peer->cap, PEER_CAP_HOSTNAME_ADV);
1386 stream_putc (s, BGP_OPEN_OPT_CAP);
1387 rcapp = stream_get_endp(s); /* Ptr to length placeholder */
1388 stream_putc(s, 0); /* dummy len for now */
1389 stream_putc (s, CAPABILITY_CODE_FQDN);
1390 capp = stream_get_endp(s);
1391 stream_putc(s, 0); /* dummy len for now */
1392 len = strlen(names.nodename);
1393 if (len > BGP_MAX_HOSTNAME)
1394 len = BGP_MAX_HOSTNAME;
1395
1396 stream_putc(s, len);
1397 stream_put(s, names.nodename, len);
1398 #ifdef HAVE_STRUCT_UTSNAME_DOMAINNAME
1399 if ((names.domainname[0] != '\0') &&
1400 (strcmp(names.domainname, "(none)") != 0))
1401 {
1402 len = strlen(names.domainname);
1403 if (len > BGP_MAX_HOSTNAME)
1404 len = BGP_MAX_HOSTNAME;
1405
1406 stream_putc(s, len);
1407 stream_put(s, names.domainname, len);
1408 }
1409 else
1410 #endif
1411 {
1412 stream_putc(s, 0); /* 0 length */
1413 }
1414
1415 /* Set the lengths straight */
1416 len = stream_get_endp(s) - rcapp - 1;
1417 stream_putc_at(s, rcapp, len);
1418 len = stream_get_endp(s) - capp - 1;
1419 stream_putc_at(s, capp, len);
1420
1421 if (bgp_debug_neighbor_events(peer))
1422 #ifdef HAVE_STRUCT_UTSNAME_DOMAINNAME
1423 zlog_debug("%s Sending hostname cap with hn = %s, dn = %s",
1424 peer->host, names.nodename, names.domainname);
1425 #else
1426 zlog_debug("%s Sending hostname cap with hn = %s", peer->host,
1427 names.nodename);
1428 #endif
1429 }
1430
1431 /* Sending base graceful-restart capability irrespective of the config */
1432 SET_FLAG (peer->cap, PEER_CAP_RESTART_ADV);
1433 stream_putc (s, BGP_OPEN_OPT_CAP);
1434 capp = stream_get_endp (s); /* Set Capability Len Pointer */
1435 stream_putc (s, 0); /* Capability Length */
1436 stream_putc (s, CAPABILITY_CODE_RESTART);
1437 rcapp = stream_get_endp (s); /* Set Restart Capability Len Pointer */
1438 stream_putc (s, 0);
1439 restart_time = peer->bgp->restart_time;
1440 if (peer->bgp->t_startup)
1441 {
1442 SET_FLAG (restart_time, RESTART_R_BIT);
1443 SET_FLAG (peer->cap, PEER_CAP_RESTART_BIT_ADV);
1444 }
1445 stream_putw (s, restart_time);
1446
1447 /* Send address-family specific graceful-restart capability only when GR config
1448 is present */
1449 if (bgp_flag_check (peer->bgp, BGP_FLAG_GRACEFUL_RESTART))
1450 {
1451 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1452 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1453 if (peer->afc[afi][safi])
1454 {
1455 /* Convert AFI, SAFI to values for packet. */
1456 bgp_map_afi_safi_int2iana (afi, safi, &pkt_afi, &pkt_safi);
1457 stream_putw (s, pkt_afi);
1458 stream_putc (s, pkt_safi);
1459 if (bgp_flag_check(peer->bgp, BGP_FLAG_GR_PRESERVE_FWD))
1460 stream_putc (s, RESTART_F_BIT);
1461 else
1462 stream_putc (s, 0);
1463 }
1464 }
1465
1466 /* Total Graceful restart capability Len. */
1467 len = stream_get_endp (s) - rcapp - 1;
1468 stream_putc_at (s, rcapp, len);
1469
1470 /* Total Capability Len. */
1471 len = stream_get_endp (s) - capp - 1;
1472 stream_putc_at (s, capp, len);
1473
1474 /* Total Opt Parm Len. */
1475 len = stream_get_endp (s) - cp - 1;
1476 stream_putc_at (s, cp, len);
1477 }