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