blob: 316c44e2f22567331f1738f934745fe82bf3f074 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* BGP packet management routine.
2 Copyright (C) 1999 Kunihiro Ishiguro
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING. If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA. */
20
21#include <zebra.h>
22
23#include "thread.h"
24#include "stream.h"
25#include "network.h"
26#include "prefix.h"
27#include "command.h"
28#include "log.h"
29#include "memory.h"
30#include "sockunion.h" /* for inet_ntop () */
31#include "linklist.h"
32#include "plist.h"
33
34#include "bgpd/bgpd.h"
35#include "bgpd/bgp_table.h"
36#include "bgpd/bgp_dump.h"
37#include "bgpd/bgp_attr.h"
38#include "bgpd/bgp_debug.h"
39#include "bgpd/bgp_fsm.h"
40#include "bgpd/bgp_route.h"
41#include "bgpd/bgp_packet.h"
42#include "bgpd/bgp_open.h"
43#include "bgpd/bgp_aspath.h"
44#include "bgpd/bgp_community.h"
45#include "bgpd/bgp_ecommunity.h"
46#include "bgpd/bgp_network.h"
47#include "bgpd/bgp_mplsvpn.h"
48#include "bgpd/bgp_advertise.h"
49
50int stream_put_prefix (struct stream *, struct prefix *);
51
52/* Set up BGP packet marker and packet type. */
53static int
54bgp_packet_set_marker (struct stream *s, u_char type)
55{
56 int i;
57
58 /* Fill in marker. */
59 for (i = 0; i < BGP_MARKER_SIZE; i++)
60 stream_putc (s, 0xff);
61
62 /* Dummy total length. This field is should be filled in later on. */
63 stream_putw (s, 0);
64
65 /* BGP packet type. */
66 stream_putc (s, type);
67
68 /* Return current stream size. */
69 return stream_get_putp (s);
70}
71
72/* Set BGP packet header size entry. If size is zero then use current
73 stream size. */
74static int
75bgp_packet_set_size (struct stream *s)
76{
77 int cp;
78
79 /* Preserve current pointer. */
80 cp = stream_get_putp (s);
81 stream_set_putp (s, BGP_MARKER_SIZE);
82 stream_putw (s, cp);
83
84 /* Write back current pointer. */
85 stream_set_putp (s, cp);
86
87 return cp;
88}
89
90/* Add new packet to the peer. */
91void
92bgp_packet_add (struct peer *peer, struct stream *s)
93{
94 /* Add packet to the end of list. */
95 stream_fifo_push (peer->obuf, s);
96}
97
98/* Free first packet. */
99void
100bgp_packet_delete (struct peer *peer)
101{
102 stream_free (stream_fifo_pop (peer->obuf));
103}
104
105/* Duplicate packet. */
106struct stream *
107bgp_packet_dup (struct stream *s)
108{
109 struct stream *new;
110
111 new = stream_new (stream_get_endp (s));
112
113 new->endp = s->endp;
114 new->putp = s->putp;
115 new->getp = s->getp;
116
117 memcpy (new->data, s->data, stream_get_endp (s));
118
119 return new;
120}
121
122/* Check file descriptor whether connect is established. */
123static void
124bgp_connect_check (struct peer *peer)
125{
126 int status;
paul5228ad22004-06-04 17:58:18 +0000127 socklen_t slen;
paul718e3742002-12-13 20:15:29 +0000128 int ret;
129
130 /* Anyway I have to reset read and write thread. */
131 BGP_READ_OFF (peer->t_read);
132 BGP_WRITE_OFF (peer->t_write);
133
134 /* Check file descriptor. */
135 slen = sizeof (status);
pauleb821182004-05-01 08:44:08 +0000136 ret = getsockopt(peer->fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen);
paul718e3742002-12-13 20:15:29 +0000137
138 /* If getsockopt is fail, this is fatal error. */
139 if (ret < 0)
140 {
141 zlog (peer->log, LOG_INFO, "can't get sockopt for nonblocking connect");
142 BGP_EVENT_ADD (peer, TCP_fatal_error);
143 return;
144 }
145
146 /* When status is 0 then TCP connection is established. */
147 if (status == 0)
148 {
149 BGP_EVENT_ADD (peer, TCP_connection_open);
150 }
151 else
152 {
153 if (BGP_DEBUG (events, EVENTS))
154 plog_info (peer->log, "%s [Event] Connect failed (%s)",
155 peer->host, strerror (errno));
156 BGP_EVENT_ADD (peer, TCP_connection_open_failed);
157 }
158}
159
160/* Make BGP update packet. */
161struct stream *
162bgp_update_packet (struct peer *peer, afi_t afi, safi_t safi)
163{
164 struct stream *s;
165 struct bgp_adj_out *adj;
166 struct bgp_advertise *adv;
167 struct stream *packet;
168 struct bgp_node *rn = NULL;
169 struct bgp_info *binfo = NULL;
170 bgp_size_t total_attr_len = 0;
171 unsigned long pos;
172 char buf[BUFSIZ];
173 struct prefix_rd *prd = NULL;
174 char *tag = NULL;
175
176 s = peer->work;
177 stream_reset (s);
178
179 adv = FIFO_HEAD (&peer->sync[afi][safi]->update);
180
181 while (adv)
182 {
183 if (adv->rn)
184 rn = adv->rn;
185 adj = adv->adj;
186 if (adv->binfo)
187 binfo = adv->binfo;
188#ifdef MPLS_VPN
189 if (rn)
190 prd = (struct prefix_rd *) &rn->prn->p;
191 if (binfo)
192 tag = binfo->tag;
193#endif /* MPLS_VPN */
194
195 /* When remaining space can't include NLRI and it's length. */
196 if (rn && STREAM_REMAIN (s) <= BGP_NLRI_LENGTH + PSIZE (rn->p.prefixlen))
197 break;
198
199 /* If packet is empty, set attribute. */
200 if (stream_empty (s))
201 {
202 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
203 stream_putw (s, 0);
204 pos = stream_get_putp (s);
205 stream_putw (s, 0);
paul5228ad22004-06-04 17:58:18 +0000206 total_attr_len = bgp_packet_attribute (NULL, peer, s,
207 adv->baa->attr,
208 &rn->p, afi, safi,
209 binfo->peer, prd, tag);
paul718e3742002-12-13 20:15:29 +0000210 stream_putw_at (s, pos, total_attr_len);
211 }
212
213 if (afi == AFI_IP && safi == SAFI_UNICAST)
214 stream_put_prefix (s, &rn->p);
215
216 if (BGP_DEBUG (update, UPDATE_OUT))
217 zlog (peer->log, LOG_INFO, "%s send UPDATE %s/%d",
218 peer->host,
219 inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, BUFSIZ),
220 rn->p.prefixlen);
221
222 /* Synchnorize attribute. */
223 if (adj->attr)
224 bgp_attr_unintern (adj->attr);
225 else
226 peer->scount[afi][safi]++;
227
228 adj->attr = bgp_attr_intern (adv->baa->attr);
229
230 adv = bgp_advertise_clean (peer, adj, afi, safi);
231
232 if (! (afi == AFI_IP && safi == SAFI_UNICAST))
233 break;
234 }
235
236 if (! stream_empty (s))
237 {
238 bgp_packet_set_size (s);
239 packet = bgp_packet_dup (s);
240 bgp_packet_add (peer, packet);
pauleb821182004-05-01 08:44:08 +0000241 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +0000242 stream_reset (s);
243 return packet;
244 }
245 return NULL;
246
247}
248
249/* Make BGP withdraw packet. */
250struct stream *
251bgp_withdraw_packet (struct peer *peer, afi_t afi, safi_t safi)
252{
253 struct stream *s;
254 struct stream *packet;
255 struct bgp_adj_out *adj;
256 struct bgp_advertise *adv;
257 struct bgp_node *rn;
258 unsigned long pos;
259 bgp_size_t unfeasible_len;
260 bgp_size_t total_attr_len;
261 char buf[BUFSIZ];
262 struct prefix_rd *prd = NULL;
263
264 s = peer->work;
265 stream_reset (s);
266
267 while ((adv = FIFO_HEAD (&peer->sync[afi][safi]->withdraw)) != NULL)
268 {
269 adj = adv->adj;
270 rn = adv->rn;
271#ifdef MPLS_VPN
272 prd = (struct prefix_rd *) &rn->prn->p;
273#endif /* MPLS_VPN */
274
275 if (STREAM_REMAIN (s)
hasso4372df72004-05-20 10:20:02 +0000276 < (BGP_NLRI_LENGTH + BGP_TOTAL_ATTR_LEN + PSIZE (rn->p.prefixlen)))
paul718e3742002-12-13 20:15:29 +0000277 break;
278
279 if (stream_empty (s))
280 {
281 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
282 stream_putw (s, 0);
283 }
284
285 if (afi == AFI_IP && safi == SAFI_UNICAST)
286 stream_put_prefix (s, &rn->p);
287 else
288 {
289 pos = stream_get_putp (s);
290 stream_putw (s, 0);
291 total_attr_len
292 = bgp_packet_withdraw (peer, s, &rn->p, afi, safi, prd, NULL);
293
294 /* Set total path attribute length. */
295 stream_putw_at (s, pos, total_attr_len);
296 }
297
298 if (BGP_DEBUG (update, UPDATE_OUT))
299 zlog (peer->log, LOG_INFO, "%s send UPDATE %s/%d -- unreachable",
300 peer->host,
301 inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, BUFSIZ),
302 rn->p.prefixlen);
303
304 peer->scount[afi][safi]--;
305
306 bgp_adj_out_remove (rn, adj, peer, afi, safi);
307 bgp_unlock_node (rn);
308
309 if (! (afi == AFI_IP && safi == SAFI_UNICAST))
310 break;
311 }
312
313 if (! stream_empty (s))
314 {
315 if (afi == AFI_IP && safi == SAFI_UNICAST)
316 {
317 unfeasible_len
318 = stream_get_putp (s) - BGP_HEADER_SIZE - BGP_UNFEASIBLE_LEN;
319 stream_putw_at (s, BGP_HEADER_SIZE, unfeasible_len);
320 stream_putw (s, 0);
321 }
322 bgp_packet_set_size (s);
323 packet = bgp_packet_dup (s);
324 bgp_packet_add (peer, packet);
325 stream_reset (s);
326 return packet;
327 }
328
329 return NULL;
330}
331
332void
333bgp_default_update_send (struct peer *peer, struct attr *attr,
334 afi_t afi, safi_t safi, struct peer *from)
335{
336 struct stream *s;
337 struct stream *packet;
338 struct prefix p;
339 unsigned long pos;
340 bgp_size_t total_attr_len;
341 char attrstr[BUFSIZ];
342 char buf[BUFSIZ];
343
344#ifdef DISABLE_BGP_ANNOUNCE
345 return;
346#endif /* DISABLE_BGP_ANNOUNCE */
347
348 if (afi == AFI_IP)
349 str2prefix ("0.0.0.0/0", &p);
350#ifdef HAVE_IPV6
351 else
352 str2prefix ("::/0", &p);
353#endif /* HAVE_IPV6 */
354
355 /* Logging the attribute. */
356 if (BGP_DEBUG (update, UPDATE_OUT))
357 {
358 bgp_dump_attr (peer, attr, attrstr, BUFSIZ);
359 zlog (peer->log, LOG_INFO, "%s send UPDATE %s/%d %s",
360 peer->host, inet_ntop(p.family, &(p.u.prefix), buf, BUFSIZ),
361 p.prefixlen, attrstr);
362 }
363
364 s = stream_new (BGP_MAX_PACKET_SIZE);
365
366 /* Make BGP update packet. */
367 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
368
369 /* Unfeasible Routes Length. */
370 stream_putw (s, 0);
371
372 /* Make place for total attribute length. */
373 pos = stream_get_putp (s);
374 stream_putw (s, 0);
375 total_attr_len = bgp_packet_attribute (NULL, peer, s, attr, &p, afi, safi, from, NULL, NULL);
376
377 /* Set Total Path Attribute Length. */
378 stream_putw_at (s, pos, total_attr_len);
379
380 /* NLRI set. */
381 if (p.family == AF_INET && safi == SAFI_UNICAST)
382 stream_put_prefix (s, &p);
383
384 /* Set size. */
385 bgp_packet_set_size (s);
386
387 packet = bgp_packet_dup (s);
388 stream_free (s);
389
390 /* Dump packet if debug option is set. */
391#ifdef DEBUG
392 bgp_packet_dump (packet);
393#endif /* DEBUG */
394
395 /* Add packet to the peer. */
396 bgp_packet_add (peer, packet);
397
pauleb821182004-05-01 08:44:08 +0000398 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +0000399}
400
401void
402bgp_default_withdraw_send (struct peer *peer, afi_t afi, safi_t safi)
403{
404 struct stream *s;
405 struct stream *packet;
406 struct prefix p;
407 unsigned long pos;
408 unsigned long cp;
409 bgp_size_t unfeasible_len;
410 bgp_size_t total_attr_len;
411 char buf[BUFSIZ];
412
413#ifdef DISABLE_BGP_ANNOUNCE
414 return;
415#endif /* DISABLE_BGP_ANNOUNCE */
416
417 if (afi == AFI_IP)
418 str2prefix ("0.0.0.0/0", &p);
419#ifdef HAVE_IPV6
420 else
421 str2prefix ("::/0", &p);
422#endif /* HAVE_IPV6 */
423
424 total_attr_len = 0;
425 pos = 0;
426
427 if (BGP_DEBUG (update, UPDATE_OUT))
428 zlog (peer->log, LOG_INFO, "%s send UPDATE %s/%d -- unreachable",
429 peer->host, inet_ntop(p.family, &(p.u.prefix), buf, BUFSIZ),
430 p.prefixlen);
431
432 s = stream_new (BGP_MAX_PACKET_SIZE);
433
434 /* Make BGP update packet. */
435 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
436
437 /* Unfeasible Routes Length. */;
438 cp = stream_get_putp (s);
439 stream_putw (s, 0);
440
441 /* Withdrawn Routes. */
442 if (p.family == AF_INET && safi == SAFI_UNICAST)
443 {
444 stream_put_prefix (s, &p);
445
446 unfeasible_len = stream_get_putp (s) - cp - 2;
447
448 /* Set unfeasible len. */
449 stream_putw_at (s, cp, unfeasible_len);
450
451 /* Set total path attribute length. */
452 stream_putw (s, 0);
453 }
454 else
455 {
456 pos = stream_get_putp (s);
457 stream_putw (s, 0);
458 total_attr_len = bgp_packet_withdraw (peer, s, &p, afi, safi, NULL, NULL);
459
460 /* Set total path attribute length. */
461 stream_putw_at (s, pos, total_attr_len);
462 }
463
464 bgp_packet_set_size (s);
465
466 packet = bgp_packet_dup (s);
467 stream_free (s);
468
469 /* Add packet to the peer. */
470 bgp_packet_add (peer, packet);
471
pauleb821182004-05-01 08:44:08 +0000472 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +0000473}
474
475/* Get next packet to be written. */
476struct stream *
477bgp_write_packet (struct peer *peer)
478{
479 afi_t afi;
480 safi_t safi;
481 struct stream *s = NULL;
482 struct bgp_advertise *adv;
483
484 s = stream_fifo_head (peer->obuf);
485 if (s)
486 return s;
487
488 for (afi = AFI_IP; afi < AFI_MAX; afi++)
489 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
490 {
491 adv = FIFO_HEAD (&peer->sync[afi][safi]->withdraw);
492 if (adv)
493 {
494 s = bgp_withdraw_packet (peer, afi, safi);
495 if (s)
496 return s;
497 }
498 }
499
500 for (afi = AFI_IP; afi < AFI_MAX; afi++)
501 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
502 {
503 adv = FIFO_HEAD (&peer->sync[afi][safi]->update);
504 if (adv)
505 {
506 if (adv->binfo && adv->binfo->uptime < peer->synctime)
507 s = bgp_update_packet (peer, afi, safi);
508
509 if (s)
510 return s;
511 }
512 }
513
514 return NULL;
515}
516
517/* Is there partially written packet or updates we can send right
518 now. */
519int
520bgp_write_proceed (struct peer *peer)
521{
522 afi_t afi;
523 safi_t safi;
524 struct bgp_advertise *adv;
525
526 if (stream_fifo_head (peer->obuf))
527 return 1;
528
529 for (afi = AFI_IP; afi < AFI_MAX; afi++)
530 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
531 if (FIFO_HEAD (&peer->sync[afi][safi]->withdraw))
532 return 1;
533
534 for (afi = AFI_IP; afi < AFI_MAX; afi++)
535 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
536 if ((adv = FIFO_HEAD (&peer->sync[afi][safi]->update)) != NULL)
537 if (adv->binfo->uptime < peer->synctime)
538 return 1;
539
540 return 0;
541}
542
543/* Write packet to the peer. */
544int
545bgp_write (struct thread *thread)
546{
547 struct peer *peer;
548 u_char type;
549 struct stream *s;
550 int num;
551 int count = 0;
552 int write_errno;
553
554 /* Yes first of all get peer pointer. */
555 peer = THREAD_ARG (thread);
556 peer->t_write = NULL;
557
558 /* For non-blocking IO check. */
559 if (peer->status == Connect)
560 {
561 bgp_connect_check (peer);
562 return 0;
563 }
564
565 /* Nonblocking write until TCP output buffer is full. */
566 while (1)
567 {
568 int writenum;
569
570 s = bgp_write_packet (peer);
571 if (! s)
572 return 0;
573
574 /* Number of bytes to be sent. */
575 writenum = stream_get_endp (s) - stream_get_getp (s);
576
577 /* Call write() system call. */
pauleb821182004-05-01 08:44:08 +0000578 num = write (peer->fd, STREAM_PNT (s), writenum);
paul718e3742002-12-13 20:15:29 +0000579 write_errno = errno;
580 if (num <= 0)
581 {
582 /* Partial write. */
583 if (write_errno == EWOULDBLOCK || write_errno == EAGAIN)
584 break;
585
586 bgp_stop (peer);
587 peer->status = Idle;
588 bgp_timer_set (peer);
589 return 0;
590 }
591 if (num != writenum)
592 {
593 stream_forward (s, num);
594
595 if (write_errno == EAGAIN)
596 break;
597
598 continue;
599 }
600
601 /* Retrieve BGP packet type. */
602 stream_set_getp (s, BGP_MARKER_SIZE + 2);
603 type = stream_getc (s);
604
605 switch (type)
606 {
607 case BGP_MSG_OPEN:
608 peer->open_out++;
609 break;
610 case BGP_MSG_UPDATE:
611 peer->update_out++;
612 break;
613 case BGP_MSG_NOTIFY:
614 peer->notify_out++;
615 /* Double start timer. */
616 peer->v_start *= 2;
617
618 /* Overflow check. */
619 if (peer->v_start >= (60 * 2))
620 peer->v_start = (60 * 2);
621
622 /* BGP_EVENT_ADD (peer, BGP_Stop); */
623 bgp_stop (peer);
624 peer->status = Idle;
625 bgp_timer_set (peer);
626 return 0;
627 break;
628 case BGP_MSG_KEEPALIVE:
629 peer->keepalive_out++;
630 break;
631 case BGP_MSG_ROUTE_REFRESH_NEW:
632 case BGP_MSG_ROUTE_REFRESH_OLD:
633 peer->refresh_out++;
634 break;
635 case BGP_MSG_CAPABILITY:
636 peer->dynamic_cap_out++;
637 break;
638 }
639
640 /* OK we send packet so delete it. */
641 bgp_packet_delete (peer);
642
643 if (++count >= BGP_WRITE_PACKET_MAX)
644 break;
645 }
646
647 if (bgp_write_proceed (peer))
pauleb821182004-05-01 08:44:08 +0000648 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +0000649
650 return 0;
651}
652
653/* This is only for sending NOTIFICATION message to neighbor. */
654int
655bgp_write_notify (struct peer *peer)
656{
657 int ret;
658 u_char type;
659 struct stream *s;
660
661 /* There should be at least one packet. */
662 s = stream_fifo_head (peer->obuf);
663 if (!s)
664 return 0;
665 assert (stream_get_endp (s) >= BGP_HEADER_SIZE);
666
667 /* I'm not sure fd is writable. */
pauleb821182004-05-01 08:44:08 +0000668 ret = writen (peer->fd, STREAM_DATA (s), stream_get_endp (s));
paul718e3742002-12-13 20:15:29 +0000669 if (ret <= 0)
670 {
671 bgp_stop (peer);
672 peer->status = Idle;
673 bgp_timer_set (peer);
674 return 0;
675 }
676
677 /* Retrieve BGP packet type. */
678 stream_set_getp (s, BGP_MARKER_SIZE + 2);
679 type = stream_getc (s);
680
681 assert (type == BGP_MSG_NOTIFY);
682
683 /* Type should be notify. */
684 peer->notify_out++;
685
686 /* Double start timer. */
687 peer->v_start *= 2;
688
689 /* Overflow check. */
690 if (peer->v_start >= (60 * 2))
691 peer->v_start = (60 * 2);
692
693 /* We don't call event manager at here for avoiding other events. */
694 bgp_stop (peer);
695 peer->status = Idle;
696 bgp_timer_set (peer);
697
698 return 0;
699}
700
701/* Make keepalive packet and send it to the peer. */
702void
703bgp_keepalive_send (struct peer *peer)
704{
705 struct stream *s;
706 int length;
707
708 s = stream_new (BGP_MAX_PACKET_SIZE);
709
710 /* Make keepalive packet. */
711 bgp_packet_set_marker (s, BGP_MSG_KEEPALIVE);
712
713 /* Set packet size. */
714 length = bgp_packet_set_size (s);
715
716 /* Dump packet if debug option is set. */
717 /* bgp_packet_dump (s); */
718
719 if (BGP_DEBUG (keepalive, KEEPALIVE))
720 zlog_info ("%s sending KEEPALIVE", peer->host);
721 if (BGP_DEBUG (normal, NORMAL))
722 zlog_info ("%s send message type %d, length (incl. header) %d",
723 peer->host, BGP_MSG_KEEPALIVE, length);
724
725 /* Add packet to the peer. */
726 bgp_packet_add (peer, s);
727
pauleb821182004-05-01 08:44:08 +0000728 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +0000729}
730
731/* Make open packet and send it to the peer. */
732void
733bgp_open_send (struct peer *peer)
734{
735 struct stream *s;
736 int length;
737 u_int16_t send_holdtime;
738 as_t local_as;
739
740 if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
741 send_holdtime = peer->holdtime;
742 else
743 send_holdtime = peer->bgp->default_holdtime;
744
745 /* local-as Change */
746 if (peer->change_local_as)
747 local_as = peer->change_local_as;
748 else
749 local_as = peer->local_as;
750
751 s = stream_new (BGP_MAX_PACKET_SIZE);
752
753 /* Make open packet. */
754 bgp_packet_set_marker (s, BGP_MSG_OPEN);
755
756 /* Set open packet values. */
757 stream_putc (s, BGP_VERSION_4); /* BGP version */
758 stream_putw (s, local_as); /* My Autonomous System*/
759 stream_putw (s, send_holdtime); /* Hold Time */
760 stream_put_in_addr (s, &peer->local_id); /* BGP Identifier */
761
762 /* Set capability code. */
763 bgp_open_capability (s, peer);
764
765 /* Set BGP packet length. */
766 length = bgp_packet_set_size (s);
767
768 if (BGP_DEBUG (normal, NORMAL))
769 zlog_info ("%s sending OPEN, version %d, my as %d, holdtime %d, id %s",
770 peer->host, BGP_VERSION_4, local_as,
771 send_holdtime, inet_ntoa (peer->local_id));
772
773 if (BGP_DEBUG (normal, NORMAL))
774 zlog_info ("%s send message type %d, length (incl. header) %d",
775 peer->host, BGP_MSG_OPEN, length);
776
777 /* Dump packet if debug option is set. */
778 /* bgp_packet_dump (s); */
779
780 /* Add packet to the peer. */
781 bgp_packet_add (peer, s);
782
pauleb821182004-05-01 08:44:08 +0000783 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +0000784}
785
786/* Send BGP notify packet with data potion. */
787void
788bgp_notify_send_with_data (struct peer *peer, u_char code, u_char sub_code,
789 u_char *data, size_t datalen)
790{
791 struct stream *s;
792 int length;
793
794 /* Allocate new stream. */
795 s = stream_new (BGP_MAX_PACKET_SIZE);
796
797 /* Make nitify packet. */
798 bgp_packet_set_marker (s, BGP_MSG_NOTIFY);
799
800 /* Set notify packet values. */
801 stream_putc (s, code); /* BGP notify code */
802 stream_putc (s, sub_code); /* BGP notify sub_code */
803
804 /* If notify data is present. */
805 if (data)
806 stream_write (s, data, datalen);
807
808 /* Set BGP packet length. */
809 length = bgp_packet_set_size (s);
810
811 /* Add packet to the peer. */
812 stream_fifo_clean (peer->obuf);
813 bgp_packet_add (peer, s);
814
815 /* For debug */
816 {
817 struct bgp_notify bgp_notify;
818 int first = 0;
819 int i;
820 char c[4];
821
822 bgp_notify.code = code;
823 bgp_notify.subcode = sub_code;
824 bgp_notify.data = NULL;
825 bgp_notify.length = length - BGP_MSG_NOTIFY_MIN_SIZE;
826
827 if (bgp_notify.length)
828 {
829 bgp_notify.data = XMALLOC (MTYPE_TMP, bgp_notify.length * 3);
830 for (i = 0; i < bgp_notify.length; i++)
831 if (first)
832 {
833 sprintf (c, " %02x", data[i]);
834 strcat (bgp_notify.data, c);
835 }
836 else
837 {
838 first = 1;
839 sprintf (c, "%02x", data[i]);
840 strcpy (bgp_notify.data, c);
841 }
842 }
843 bgp_notify_print (peer, &bgp_notify, "sending");
844 if (bgp_notify.data)
845 XFREE (MTYPE_TMP, bgp_notify.data);
846 }
847
848 if (BGP_DEBUG (normal, NORMAL))
849 zlog_info ("%s send message type %d, length (incl. header) %d",
850 peer->host, BGP_MSG_NOTIFY, length);
851
hassoe0701b72004-05-20 09:19:34 +0000852 /* peer reset cause */
853 if (sub_code != BGP_NOTIFY_CEASE_CONFIG_CHANGE)
854 {
855 if (sub_code == BGP_NOTIFY_CEASE_ADMIN_RESET)
856 peer->last_reset = PEER_DOWN_USER_RESET;
857 else if (sub_code == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN)
858 peer->last_reset = PEER_DOWN_USER_SHUTDOWN;
859 else
860 peer->last_reset = PEER_DOWN_NOTIFY_SEND;
861 }
862
paul718e3742002-12-13 20:15:29 +0000863 /* Call imidiately. */
864 BGP_WRITE_OFF (peer->t_write);
865
866 bgp_write_notify (peer);
867}
868
869/* Send BGP notify packet. */
870void
871bgp_notify_send (struct peer *peer, u_char code, u_char sub_code)
872{
873 bgp_notify_send_with_data (peer, code, sub_code, NULL, 0);
874}
875
876char *
877afi2str (afi_t afi)
878{
879 if (afi == AFI_IP)
880 return "AFI_IP";
881 else if (afi == AFI_IP6)
882 return "AFI_IP6";
883 else
884 return "Unknown AFI";
885}
886
887char *
888safi2str (safi_t safi)
889{
890 if (safi == SAFI_UNICAST)
891 return "SAFI_UNICAST";
892 else if (safi == SAFI_MULTICAST)
893 return "SAFI_MULTICAST";
894 else if (safi == SAFI_MPLS_VPN || safi == BGP_SAFI_VPNV4)
895 return "SAFI_MPLS_VPN";
896 else
897 return "Unknown SAFI";
898}
899
900/* Send route refresh message to the peer. */
901void
902bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi,
903 u_char orf_type, u_char when_to_refresh, int remove)
904{
905 struct stream *s;
906 struct stream *packet;
907 int length;
908 struct bgp_filter *filter;
909 int orf_refresh = 0;
910
911#ifdef DISABLE_BGP_ANNOUNCE
912 return;
913#endif /* DISABLE_BGP_ANNOUNCE */
914
915 filter = &peer->filter[afi][safi];
916
917 /* Adjust safi code. */
918 if (safi == SAFI_MPLS_VPN)
919 safi = BGP_SAFI_VPNV4;
920
921 s = stream_new (BGP_MAX_PACKET_SIZE);
922
923 /* Make BGP update packet. */
924 if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
925 bgp_packet_set_marker (s, BGP_MSG_ROUTE_REFRESH_NEW);
926 else
927 bgp_packet_set_marker (s, BGP_MSG_ROUTE_REFRESH_OLD);
928
929 /* Encode Route Refresh message. */
930 stream_putw (s, afi);
931 stream_putc (s, 0);
932 stream_putc (s, safi);
933
934 if (orf_type == ORF_TYPE_PREFIX
935 || orf_type == ORF_TYPE_PREFIX_OLD)
936 if (remove || filter->plist[FILTER_IN].plist)
937 {
938 u_int16_t orf_len;
939 unsigned long orfp;
940
941 orf_refresh = 1;
942 stream_putc (s, when_to_refresh);
943 stream_putc (s, orf_type);
944 orfp = stream_get_putp (s);
945 stream_putw (s, 0);
946
947 if (remove)
948 {
949 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND);
950 stream_putc (s, ORF_COMMON_PART_REMOVE_ALL);
951 if (BGP_DEBUG (normal, NORMAL))
952 zlog_info ("%s sending REFRESH_REQ to remove ORF(%d) (%s) for afi/safi: %d/%d",
953 peer->host, orf_type,
954 (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"),
955 afi, safi);
956 }
957 else
958 {
959 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND);
960 prefix_bgp_orf_entry (s, filter->plist[FILTER_IN].plist,
961 ORF_COMMON_PART_ADD, ORF_COMMON_PART_PERMIT,
962 ORF_COMMON_PART_DENY);
963 if (BGP_DEBUG (normal, NORMAL))
964 zlog_info ("%s sending REFRESH_REQ with pfxlist ORF(%d) (%s) for afi/safi: %d/%d",
965 peer->host, orf_type,
966 (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"),
967 afi, safi);
968 }
969
970 /* Total ORF Entry Len. */
971 orf_len = stream_get_putp (s) - orfp - 2;
972 stream_putw_at (s, orfp, orf_len);
973 }
974
975 /* Set packet size. */
976 length = bgp_packet_set_size (s);
977
978 if (BGP_DEBUG (normal, NORMAL))
979 {
980 if (! orf_refresh)
981 zlog_info ("%s sending REFRESH_REQ for afi/safi: %d/%d",
982 peer->host, afi, safi);
983 zlog_info ("%s send message type %d, length (incl. header) %d",
984 peer->host, CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV) ?
985 BGP_MSG_ROUTE_REFRESH_NEW : BGP_MSG_ROUTE_REFRESH_OLD, length);
986 }
987
988 /* Make real packet. */
989 packet = bgp_packet_dup (s);
990 stream_free (s);
991
992 /* Add packet to the peer. */
993 bgp_packet_add (peer, packet);
994
pauleb821182004-05-01 08:44:08 +0000995 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +0000996}
997
998/* Send capability message to the peer. */
999void
1000bgp_capability_send (struct peer *peer, afi_t afi, safi_t safi,
1001 int capability_code, int action)
1002{
1003 struct stream *s;
1004 struct stream *packet;
1005 int length;
1006
1007 /* Adjust safi code. */
1008 if (safi == SAFI_MPLS_VPN)
1009 safi = BGP_SAFI_VPNV4;
1010
1011 s = stream_new (BGP_MAX_PACKET_SIZE);
1012
1013 /* Make BGP update packet. */
1014 bgp_packet_set_marker (s, BGP_MSG_CAPABILITY);
1015
1016 /* Encode MP_EXT capability. */
1017 if (capability_code == CAPABILITY_CODE_MP)
1018 {
1019 stream_putc (s, action);
1020 stream_putc (s, CAPABILITY_CODE_MP);
1021 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1022 stream_putw (s, afi);
1023 stream_putc (s, 0);
1024 stream_putc (s, safi);
1025
1026 if (BGP_DEBUG (normal, NORMAL))
1027 zlog_info ("%s sending CAPABILITY has %s MP_EXT CAP for afi/safi: %d/%d",
1028 peer->host, action == CAPABILITY_ACTION_SET ?
1029 "Advertising" : "Removing", afi, safi);
1030 }
1031
1032 /* Encode Route Refresh capability. */
1033 if (capability_code == CAPABILITY_CODE_REFRESH)
1034 {
1035 stream_putc (s, action);
1036 stream_putc (s, CAPABILITY_CODE_REFRESH);
1037 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
1038 stream_putc (s, action);
1039 stream_putc (s, CAPABILITY_CODE_REFRESH_OLD);
1040 stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
1041
1042 if (BGP_DEBUG (normal, NORMAL))
1043 zlog_info ("%s sending CAPABILITY has %s ROUTE-REFRESH capability",
1044 peer->host, action == CAPABILITY_ACTION_SET ?
1045 "Advertising" : "Removing");
1046 }
1047
1048 /* Set packet size. */
1049 length = bgp_packet_set_size (s);
1050
1051 /* Make real packet. */
1052 packet = bgp_packet_dup (s);
1053 stream_free (s);
1054
1055 /* Add packet to the peer. */
1056 bgp_packet_add (peer, packet);
1057
1058 if (BGP_DEBUG (normal, NORMAL))
1059 zlog_info ("%s send message type %d, length (incl. header) %d",
1060 peer->host, BGP_MSG_CAPABILITY, length);
1061
pauleb821182004-05-01 08:44:08 +00001062 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
paul718e3742002-12-13 20:15:29 +00001063}
1064
1065/* RFC1771 6.8 Connection collision detection. */
1066int
pauleb821182004-05-01 08:44:08 +00001067bgp_collision_detect (struct peer *new, struct in_addr remote_id)
paul718e3742002-12-13 20:15:29 +00001068{
pauleb821182004-05-01 08:44:08 +00001069 struct peer *peer;
paul718e3742002-12-13 20:15:29 +00001070 struct listnode *nn;
1071 struct bgp *bgp;
1072
1073 bgp = bgp_get_default ();
1074 if (! bgp)
1075 return 0;
1076
1077 /* Upon receipt of an OPEN message, the local system must examine
1078 all of its connections that are in the OpenConfirm state. A BGP
1079 speaker may also examine connections in an OpenSent state if it
1080 knows the BGP Identifier of the peer by means outside of the
1081 protocol. If among these connections there is a connection to a
1082 remote BGP speaker whose BGP Identifier equals the one in the
1083 OPEN message, then the local system performs the following
1084 collision resolution procedure: */
1085
1086 LIST_LOOP (bgp->peer, peer, nn)
1087 {
1088 /* Under OpenConfirm status, local peer structure already hold
1089 remote router ID. */
pauleb821182004-05-01 08:44:08 +00001090
1091 if (peer != new
1092 && (peer->status == OpenConfirm || peer->status == OpenSent)
1093 && sockunion_same (&peer->su, &new->su))
1094 {
paul718e3742002-12-13 20:15:29 +00001095 /* 1. The BGP Identifier of the local system is compared to
1096 the BGP Identifier of the remote system (as specified in
1097 the OPEN message). */
1098
1099 if (ntohl (peer->local_id.s_addr) < ntohl (remote_id.s_addr))
1100 {
1101 /* 2. If the value of the local BGP Identifier is less
1102 than the remote one, the local system closes BGP
1103 connection that already exists (the one that is
1104 already in the OpenConfirm state), and accepts BGP
1105 connection initiated by the remote system. */
1106
pauleb821182004-05-01 08:44:08 +00001107 if (peer->fd >= 0)
hassoe0701b72004-05-20 09:19:34 +00001108 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
paul718e3742002-12-13 20:15:29 +00001109 return 1;
1110 }
1111 else
1112 {
1113 /* 3. Otherwise, the local system closes newly created
1114 BGP connection (the one associated with the newly
1115 received OPEN message), and continues to use the
1116 existing one (the one that is already in the
1117 OpenConfirm state). */
1118
pauleb821182004-05-01 08:44:08 +00001119 if (new->fd >= 0)
hassoe0701b72004-05-20 09:19:34 +00001120 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
paul718e3742002-12-13 20:15:29 +00001121 return -1;
1122 }
pauleb821182004-05-01 08:44:08 +00001123 }
1124 }
paul718e3742002-12-13 20:15:29 +00001125 return 0;
1126}
1127
1128int
1129bgp_open_receive (struct peer *peer, bgp_size_t size)
1130{
1131 int ret;
1132 u_char version;
1133 u_char optlen;
1134 u_int16_t holdtime;
1135 u_int16_t send_holdtime;
1136 as_t remote_as;
1137 struct peer *realpeer;
1138 struct in_addr remote_id;
1139 int capability;
paul5228ad22004-06-04 17:58:18 +00001140 u_int8_t notify_data_remote_as[2];
1141 u_int8_t notify_data_remote_id[4];
paul718e3742002-12-13 20:15:29 +00001142
1143 realpeer = NULL;
1144
1145 /* Parse open packet. */
1146 version = stream_getc (peer->ibuf);
1147 memcpy (notify_data_remote_as, stream_pnt (peer->ibuf), 2);
1148 remote_as = stream_getw (peer->ibuf);
1149 holdtime = stream_getw (peer->ibuf);
1150 memcpy (notify_data_remote_id, stream_pnt (peer->ibuf), 4);
1151 remote_id.s_addr = stream_get_ipv4 (peer->ibuf);
1152
1153 /* Receive OPEN message log */
1154 if (BGP_DEBUG (normal, NORMAL))
1155 zlog_info ("%s rcv OPEN, version %d, remote-as %d, holdtime %d, id %s",
1156 peer->host, version, remote_as, holdtime,
1157 inet_ntoa (remote_id));
1158
1159 /* Lookup peer from Open packet. */
1160 if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1161 {
1162 int as = 0;
1163
1164 realpeer = peer_lookup_with_open (&peer->su, remote_as, &remote_id, &as);
1165
1166 if (! realpeer)
1167 {
1168 /* Peer's source IP address is check in bgp_accept(), so this
1169 must be AS number mismatch or remote-id configuration
1170 mismatch. */
1171 if (as)
1172 {
1173 if (BGP_DEBUG (normal, NORMAL))
paul5228ad22004-06-04 17:58:18 +00001174 zlog_info ("%s bad OPEN, wrong router identifier %s",
1175 peer->host, inet_ntoa (remote_id));
1176 bgp_notify_send_with_data (peer,
1177 BGP_NOTIFY_OPEN_ERR,
1178 BGP_NOTIFY_OPEN_BAD_BGP_IDENT,
1179 notify_data_remote_id, 4);
paul718e3742002-12-13 20:15:29 +00001180 }
1181 else
1182 {
1183 if (BGP_DEBUG (normal, NORMAL))
paul5228ad22004-06-04 17:58:18 +00001184 zlog_info ("%s bad OPEN, remote AS is %d, expected %d",
1185 peer->host, remote_as, peer->as);
1186 bgp_notify_send_with_data (peer,
1187 BGP_NOTIFY_OPEN_ERR,
1188 BGP_NOTIFY_OPEN_BAD_PEER_AS,
1189 notify_data_remote_as, 2);
paul718e3742002-12-13 20:15:29 +00001190 }
1191 return -1;
1192 }
1193 }
1194
1195 /* When collision is detected and this peer is closed. Retrun
1196 immidiately. */
1197 ret = bgp_collision_detect (peer, remote_id);
1198 if (ret < 0)
1199 return ret;
1200
pauleb821182004-05-01 08:44:08 +00001201 /* Hack part. */
1202 if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1203 {
1204 if (ret == 0 && realpeer->status != Active
1205 && realpeer->status != OpenSent
1206 && realpeer->status != OpenConfirm)
1207 {
1208 if (BGP_DEBUG (events, EVENTS))
1209 zlog_info ("%s [Event] peer's status is %s close connection",
1210 realpeer->host, LOOKUP (bgp_status_msg, peer->status));
1211 return -1;
1212 }
1213
1214 if (BGP_DEBUG (events, EVENTS))
1215 zlog_info ("%s [Event] Transfer temporary BGP peer to existing one",
1216 peer->host);
1217
1218 bgp_stop (realpeer);
1219
1220 /* Transfer file descriptor. */
1221 realpeer->fd = peer->fd;
1222 peer->fd = -1;
1223
1224 /* Transfer input buffer. */
1225 stream_free (realpeer->ibuf);
1226 realpeer->ibuf = peer->ibuf;
1227 realpeer->packet_size = peer->packet_size;
1228 peer->ibuf = NULL;
1229
1230 /* Transfer status. */
1231 realpeer->status = peer->status;
1232 bgp_stop (peer);
1233
1234 /* peer pointer change. Open packet send to neighbor. */
1235 peer = realpeer;
1236 bgp_open_send (peer);
1237 if (peer->fd < 0)
1238 {
1239 zlog_err ("bgp_open_receive peer's fd is negative value %d",
1240 peer->fd);
1241 return -1;
1242 }
1243 BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
1244 }
1245
paul718e3742002-12-13 20:15:29 +00001246 /* remote router-id check. */
1247 if (remote_id.s_addr == 0
1248 || ntohl (remote_id.s_addr) >= 0xe0000000
1249 || ntohl (peer->local_id.s_addr) == ntohl (remote_id.s_addr))
1250 {
1251 if (BGP_DEBUG (normal, NORMAL))
1252 zlog_info ("%s bad OPEN, wrong router identifier %s",
1253 peer->host, inet_ntoa (remote_id));
1254 bgp_notify_send_with_data (peer,
1255 BGP_NOTIFY_OPEN_ERR,
1256 BGP_NOTIFY_OPEN_BAD_BGP_IDENT,
1257 notify_data_remote_id, 4);
1258 return -1;
1259 }
1260
1261 /* Set remote router-id */
1262 peer->remote_id = remote_id;
1263
1264 /* Peer BGP version check. */
1265 if (version != BGP_VERSION_4)
1266 {
paul5228ad22004-06-04 17:58:18 +00001267 u_int8_t maxver = BGP_VERSION_4;
paul718e3742002-12-13 20:15:29 +00001268 if (BGP_DEBUG (normal, NORMAL))
1269 zlog_info ("%s bad protocol version, remote requested %d, local request %d",
1270 peer->host, version, BGP_VERSION_4);
1271 bgp_notify_send_with_data (peer,
1272 BGP_NOTIFY_OPEN_ERR,
1273 BGP_NOTIFY_OPEN_UNSUP_VERSION,
paul5228ad22004-06-04 17:58:18 +00001274 &maxver, 1);
paul718e3742002-12-13 20:15:29 +00001275 return -1;
1276 }
1277
1278 /* Check neighbor as number. */
1279 if (remote_as != peer->as)
1280 {
1281 if (BGP_DEBUG (normal, NORMAL))
1282 zlog_info ("%s bad OPEN, remote AS is %d, expected %d",
1283 peer->host, remote_as, peer->as);
1284 bgp_notify_send_with_data (peer,
1285 BGP_NOTIFY_OPEN_ERR,
1286 BGP_NOTIFY_OPEN_BAD_PEER_AS,
1287 notify_data_remote_as, 2);
1288 return -1;
1289 }
1290
1291 /* From the rfc: Upon receipt of an OPEN message, a BGP speaker MUST
1292 calculate the value of the Hold Timer by using the smaller of its
1293 configured Hold Time and the Hold Time received in the OPEN message.
1294 The Hold Time MUST be either zero or at least three seconds. An
1295 implementation may reject connections on the basis of the Hold Time. */
1296
1297 if (holdtime < 3 && holdtime != 0)
1298 {
1299 bgp_notify_send (peer,
1300 BGP_NOTIFY_OPEN_ERR,
1301 BGP_NOTIFY_OPEN_UNACEP_HOLDTIME);
1302 return -1;
1303 }
1304
1305 /* From the rfc: A reasonable maximum time between KEEPALIVE messages
1306 would be one third of the Hold Time interval. KEEPALIVE messages
1307 MUST NOT be sent more frequently than one per second. An
1308 implementation MAY adjust the rate at which it sends KEEPALIVE
1309 messages as a function of the Hold Time interval. */
1310
1311 if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
1312 send_holdtime = peer->holdtime;
1313 else
1314 send_holdtime = peer->bgp->default_holdtime;
1315
1316 if (holdtime < send_holdtime)
1317 peer->v_holdtime = holdtime;
1318 else
1319 peer->v_holdtime = send_holdtime;
1320
1321 peer->v_keepalive = peer->v_holdtime / 3;
1322
1323 /* Open option part parse. */
1324 capability = 0;
1325 optlen = stream_getc (peer->ibuf);
1326 if (optlen != 0)
1327 {
1328 ret = bgp_open_option_parse (peer, optlen, &capability);
1329 if (ret < 0)
1330 return ret;
1331
1332 stream_forward (peer->ibuf, optlen);
1333 }
1334 else
1335 {
1336 if (BGP_DEBUG (normal, NORMAL))
1337 zlog_info ("%s rcvd OPEN w/ OPTION parameter len: 0",
1338 peer->host);
1339 }
1340
1341 /* Override capability. */
1342 if (! capability || CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
1343 {
1344 peer->afc_nego[AFI_IP][SAFI_UNICAST] = peer->afc[AFI_IP][SAFI_UNICAST];
1345 peer->afc_nego[AFI_IP][SAFI_MULTICAST] = peer->afc[AFI_IP][SAFI_MULTICAST];
1346 peer->afc_nego[AFI_IP6][SAFI_UNICAST] = peer->afc[AFI_IP6][SAFI_UNICAST];
1347 peer->afc_nego[AFI_IP6][SAFI_MULTICAST] = peer->afc[AFI_IP6][SAFI_MULTICAST];
1348 }
1349
1350 /* Get sockname. */
1351 bgp_getsockname (peer);
1352
1353 BGP_EVENT_ADD (peer, Receive_OPEN_message);
1354
1355 peer->packet_size = 0;
1356 if (peer->ibuf)
1357 stream_reset (peer->ibuf);
1358
1359 return 0;
1360}
1361
1362/* Parse BGP Update packet and make attribute object. */
1363int
1364bgp_update_receive (struct peer *peer, bgp_size_t size)
1365{
1366 int ret;
1367 u_char *end;
1368 struct stream *s;
1369 struct attr attr;
1370 bgp_size_t attribute_len;
1371 bgp_size_t update_len;
1372 bgp_size_t withdraw_len;
1373 struct bgp_nlri update;
1374 struct bgp_nlri withdraw;
1375 struct bgp_nlri mp_update;
1376 struct bgp_nlri mp_withdraw;
1377 char attrstr[BUFSIZ];
1378
1379 /* Status must be Established. */
1380 if (peer->status != Established)
1381 {
1382 zlog_err ("%s [FSM] Update packet received under status %s",
1383 peer->host, LOOKUP (bgp_status_msg, peer->status));
1384 bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
1385 return -1;
1386 }
1387
1388 /* Set initial values. */
1389 memset (&attr, 0, sizeof (struct attr));
1390 memset (&update, 0, sizeof (struct bgp_nlri));
1391 memset (&withdraw, 0, sizeof (struct bgp_nlri));
1392 memset (&mp_update, 0, sizeof (struct bgp_nlri));
1393 memset (&mp_withdraw, 0, sizeof (struct bgp_nlri));
1394
1395 s = peer->ibuf;
1396 end = stream_pnt (s) + size;
1397
1398 /* RFC1771 6.3 If the Unfeasible Routes Length or Total Attribute
1399 Length is too large (i.e., if Unfeasible Routes Length + Total
1400 Attribute Length + 23 exceeds the message Length), then the Error
1401 Subcode is set to Malformed Attribute List. */
1402 if (stream_pnt (s) + 2 > end)
1403 {
1404 zlog_err ("%s [Error] Update packet error"
1405 " (packet length is short for unfeasible length)",
1406 peer->host);
1407 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1408 BGP_NOTIFY_UPDATE_MAL_ATTR);
1409 return -1;
1410 }
1411
1412 /* Unfeasible Route Length. */
1413 withdraw_len = stream_getw (s);
1414
1415 /* Unfeasible Route Length check. */
1416 if (stream_pnt (s) + withdraw_len > end)
1417 {
1418 zlog_err ("%s [Error] Update packet error"
1419 " (packet unfeasible length overflow %d)",
1420 peer->host, withdraw_len);
1421 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1422 BGP_NOTIFY_UPDATE_MAL_ATTR);
1423 return -1;
1424 }
1425
1426 /* Unfeasible Route packet format check. */
1427 if (withdraw_len > 0)
1428 {
1429 ret = bgp_nlri_sanity_check (peer, AFI_IP, stream_pnt (s), withdraw_len);
1430 if (ret < 0)
1431 return -1;
1432
1433 if (BGP_DEBUG (packet, PACKET_RECV))
1434 zlog_info ("%s [Update:RECV] Unfeasible NLRI received", peer->host);
1435
1436 withdraw.afi = AFI_IP;
1437 withdraw.safi = SAFI_UNICAST;
1438 withdraw.nlri = stream_pnt (s);
1439 withdraw.length = withdraw_len;
1440 stream_forward (s, withdraw_len);
1441 }
1442
1443 /* Attribute total length check. */
1444 if (stream_pnt (s) + 2 > end)
1445 {
1446 zlog_warn ("%s [Error] Packet Error"
1447 " (update packet is short for attribute length)",
1448 peer->host);
1449 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1450 BGP_NOTIFY_UPDATE_MAL_ATTR);
1451 return -1;
1452 }
1453
1454 /* Fetch attribute total length. */
1455 attribute_len = stream_getw (s);
1456
1457 /* Attribute length check. */
1458 if (stream_pnt (s) + attribute_len > end)
1459 {
1460 zlog_warn ("%s [Error] Packet Error"
1461 " (update packet attribute length overflow %d)",
1462 peer->host, attribute_len);
1463 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1464 BGP_NOTIFY_UPDATE_MAL_ATTR);
1465 return -1;
1466 }
1467
1468 /* Parse attribute when it exists. */
1469 if (attribute_len)
1470 {
1471 ret = bgp_attr_parse (peer, &attr, attribute_len,
1472 &mp_update, &mp_withdraw);
1473 if (ret < 0)
1474 return -1;
1475 }
1476
1477 /* Logging the attribute. */
1478 if (BGP_DEBUG (update, UPDATE_IN))
1479 {
1480 bgp_dump_attr (peer, &attr, attrstr, BUFSIZ);
1481 zlog (peer->log, LOG_INFO, "%s rcvd UPDATE w/ attr: %s",
1482 peer->host, attrstr);
1483 }
1484
1485 /* Network Layer Reachability Information. */
1486 update_len = end - stream_pnt (s);
1487
1488 if (update_len)
1489 {
1490 /* Check NLRI packet format and prefix length. */
1491 ret = bgp_nlri_sanity_check (peer, AFI_IP, stream_pnt (s), update_len);
1492 if (ret < 0)
1493 return -1;
1494
1495 /* Set NLRI portion to structure. */
1496 update.afi = AFI_IP;
1497 update.safi = SAFI_UNICAST;
1498 update.nlri = stream_pnt (s);
1499 update.length = update_len;
1500 stream_forward (s, update_len);
1501 }
1502
1503 /* NLRI is processed only when the peer is configured specific
1504 Address Family and Subsequent Address Family. */
1505 if (peer->afc[AFI_IP][SAFI_UNICAST])
1506 {
1507 if (withdraw.length)
1508 bgp_nlri_parse (peer, NULL, &withdraw);
1509
1510 if (update.length)
1511 {
1512 /* We check well-known attribute only for IPv4 unicast
1513 update. */
1514 ret = bgp_attr_check (peer, &attr);
1515 if (ret < 0)
1516 return -1;
1517
1518 bgp_nlri_parse (peer, &attr, &update);
1519 }
1520 }
1521 if (peer->afc[AFI_IP][SAFI_MULTICAST])
1522 {
1523 if (mp_update.length
1524 && mp_update.afi == AFI_IP
1525 && mp_update.safi == SAFI_MULTICAST)
1526 bgp_nlri_parse (peer, &attr, &mp_update);
1527
1528 if (mp_withdraw.length
1529 && mp_withdraw.afi == AFI_IP
1530 && mp_withdraw.safi == SAFI_MULTICAST)
1531 bgp_nlri_parse (peer, NULL, &mp_withdraw);
1532 }
1533 if (peer->afc[AFI_IP6][SAFI_UNICAST])
1534 {
1535 if (mp_update.length
1536 && mp_update.afi == AFI_IP6
1537 && mp_update.safi == SAFI_UNICAST)
1538 bgp_nlri_parse (peer, &attr, &mp_update);
1539
1540 if (mp_withdraw.length
1541 && mp_withdraw.afi == AFI_IP6
1542 && mp_withdraw.safi == SAFI_UNICAST)
1543 bgp_nlri_parse (peer, NULL, &mp_withdraw);
1544 }
1545 if (peer->afc[AFI_IP6][SAFI_MULTICAST])
1546 {
1547 if (mp_update.length
1548 && mp_update.afi == AFI_IP6
1549 && mp_update.safi == SAFI_MULTICAST)
1550 bgp_nlri_parse (peer, &attr, &mp_update);
1551
1552 if (mp_withdraw.length
1553 && mp_withdraw.afi == AFI_IP6
1554 && mp_withdraw.safi == SAFI_MULTICAST)
1555 bgp_nlri_parse (peer, NULL, &mp_withdraw);
1556 }
1557 if (peer->afc[AFI_IP][SAFI_MPLS_VPN])
1558 {
1559 if (mp_update.length
1560 && mp_update.afi == AFI_IP
1561 && mp_update.safi == BGP_SAFI_VPNV4)
1562 bgp_nlri_parse_vpnv4 (peer, &attr, &mp_update);
1563
1564 if (mp_withdraw.length
1565 && mp_withdraw.afi == AFI_IP
1566 && mp_withdraw.safi == BGP_SAFI_VPNV4)
1567 bgp_nlri_parse_vpnv4 (peer, NULL, &mp_withdraw);
1568 }
1569
1570 /* Everything is done. We unintern temporary structures which
1571 interned in bgp_attr_parse(). */
1572 if (attr.aspath)
1573 aspath_unintern (attr.aspath);
1574 if (attr.community)
1575 community_unintern (attr.community);
1576 if (attr.ecommunity)
1577 ecommunity_unintern (attr.ecommunity);
1578 if (attr.cluster)
1579 cluster_unintern (attr.cluster);
1580 if (attr.transit)
1581 transit_unintern (attr.transit);
1582
1583 /* If peering is stopped due to some reason, do not generate BGP
1584 event. */
1585 if (peer->status != Established)
1586 return 0;
1587
1588 /* Increment packet counter. */
1589 peer->update_in++;
1590 peer->update_time = time (NULL);
1591
1592 /* Generate BGP event. */
1593 BGP_EVENT_ADD (peer, Receive_UPDATE_message);
1594
1595 return 0;
1596}
1597
1598/* Notify message treatment function. */
1599void
1600bgp_notify_receive (struct peer *peer, bgp_size_t size)
1601{
1602 struct bgp_notify bgp_notify;
1603
1604 if (peer->notify.data)
1605 {
1606 XFREE (MTYPE_TMP, peer->notify.data);
1607 peer->notify.data = NULL;
1608 peer->notify.length = 0;
1609 }
1610
1611 bgp_notify.code = stream_getc (peer->ibuf);
1612 bgp_notify.subcode = stream_getc (peer->ibuf);
1613 bgp_notify.length = size - 2;
1614 bgp_notify.data = NULL;
1615
1616 /* Preserv notify code and sub code. */
1617 peer->notify.code = bgp_notify.code;
1618 peer->notify.subcode = bgp_notify.subcode;
1619 /* For further diagnostic record returned Data. */
1620 if (bgp_notify.length)
1621 {
1622 peer->notify.length = size - 2;
1623 peer->notify.data = XMALLOC (MTYPE_TMP, size - 2);
1624 memcpy (peer->notify.data, stream_pnt (peer->ibuf), size - 2);
1625 }
1626
1627 /* For debug */
1628 {
1629 int i;
1630 int first = 0;
1631 char c[4];
1632
1633 if (bgp_notify.length)
1634 {
1635 bgp_notify.data = XMALLOC (MTYPE_TMP, bgp_notify.length * 3);
1636 for (i = 0; i < bgp_notify.length; i++)
1637 if (first)
1638 {
1639 sprintf (c, " %02x", stream_getc (peer->ibuf));
1640 strcat (bgp_notify.data, c);
1641 }
1642 else
1643 {
1644 first = 1;
1645 sprintf (c, "%02x", stream_getc (peer->ibuf));
1646 strcpy (bgp_notify.data, c);
1647 }
1648 }
1649
1650 bgp_notify_print(peer, &bgp_notify, "received");
1651 if (bgp_notify.data)
1652 XFREE (MTYPE_TMP, bgp_notify.data);
1653 }
1654
1655 /* peer count update */
1656 peer->notify_in++;
1657
hassoe0701b72004-05-20 09:19:34 +00001658 if (peer->status == Established)
1659 peer->last_reset = PEER_DOWN_NOTIFY_RECEIVED;
1660
paul718e3742002-12-13 20:15:29 +00001661 /* We have to check for Notify with Unsupported Optional Parameter.
1662 in that case we fallback to open without the capability option.
1663 But this done in bgp_stop. We just mark it here to avoid changing
1664 the fsm tables. */
1665 if (bgp_notify.code == BGP_NOTIFY_OPEN_ERR &&
1666 bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_PARAM )
1667 UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
1668
1669 /* Also apply to Unsupported Capability until remote router support
1670 capability. */
1671 if (bgp_notify.code == BGP_NOTIFY_OPEN_ERR &&
1672 bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
1673 UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
1674
1675 BGP_EVENT_ADD (peer, Receive_NOTIFICATION_message);
1676}
1677
1678/* Keepalive treatment function -- get keepalive send keepalive */
1679void
1680bgp_keepalive_receive (struct peer *peer, bgp_size_t size)
1681{
1682 if (BGP_DEBUG (keepalive, KEEPALIVE))
1683 zlog_info ("%s KEEPALIVE rcvd", peer->host);
1684
1685 BGP_EVENT_ADD (peer, Receive_KEEPALIVE_message);
1686}
1687
1688/* Route refresh message is received. */
1689void
1690bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
1691{
1692 afi_t afi;
1693 safi_t safi;
1694 u_char reserved;
1695 struct stream *s;
1696
1697 /* If peer does not have the capability, send notification. */
1698 if (! CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_ADV))
1699 {
1700 plog_err (peer->log, "%s [Error] BGP route refresh is not enabled",
1701 peer->host);
1702 bgp_notify_send (peer,
1703 BGP_NOTIFY_HEADER_ERR,
1704 BGP_NOTIFY_HEADER_BAD_MESTYPE);
1705 return;
1706 }
1707
1708 /* Status must be Established. */
1709 if (peer->status != Established)
1710 {
1711 plog_err (peer->log,
1712 "%s [Error] Route refresh packet received under status %s",
1713 peer->host, LOOKUP (bgp_status_msg, peer->status));
1714 bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
1715 return;
1716 }
1717
1718 s = peer->ibuf;
1719
1720 /* Parse packet. */
1721 afi = stream_getw (s);
1722 reserved = stream_getc (s);
1723 safi = stream_getc (s);
1724
1725 if (BGP_DEBUG (normal, NORMAL))
1726 zlog_info ("%s rcvd REFRESH_REQ for afi/safi: %d/%d",
1727 peer->host, afi, safi);
1728
1729 /* Check AFI and SAFI. */
1730 if ((afi != AFI_IP && afi != AFI_IP6)
1731 || (safi != SAFI_UNICAST && safi != SAFI_MULTICAST
1732 && safi != BGP_SAFI_VPNV4))
1733 {
1734 if (BGP_DEBUG (normal, NORMAL))
1735 {
1736 zlog_info ("%s REFRESH_REQ for unrecognized afi/safi: %d/%d - ignored",
1737 peer->host, afi, safi);
1738 }
1739 return;
1740 }
1741
1742 /* Adjust safi code. */
1743 if (safi == BGP_SAFI_VPNV4)
1744 safi = SAFI_MPLS_VPN;
1745
1746 if (size != BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE)
1747 {
1748 u_char *end;
1749 u_char when_to_refresh;
1750 u_char orf_type;
1751 u_int16_t orf_len;
1752
1753 if (size - (BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE) < 5)
1754 {
1755 zlog_info ("%s ORF route refresh length error", peer->host);
1756 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
1757 return;
1758 }
1759
1760 when_to_refresh = stream_getc (s);
1761 end = stream_pnt (s) + (size - 5);
1762
1763 while (stream_pnt (s) < end)
1764 {
1765 orf_type = stream_getc (s);
1766 orf_len = stream_getw (s);
1767
1768 if (orf_type == ORF_TYPE_PREFIX
1769 || orf_type == ORF_TYPE_PREFIX_OLD)
1770 {
1771 u_char *p_pnt = stream_pnt (s);
1772 u_char *p_end = stream_pnt (s) + orf_len;
1773 struct orf_prefix orfp;
1774 u_char common = 0;
1775 u_int32_t seq;
1776 int psize;
1777 char name[BUFSIZ];
1778 char buf[BUFSIZ];
1779 int ret;
1780
1781 if (BGP_DEBUG (normal, NORMAL))
1782 {
1783 zlog_info ("%s rcvd Prefixlist ORF(%d) length %d",
1784 peer->host, orf_type, orf_len);
1785 }
1786
1787 /* ORF prefix-list name */
1788 sprintf (name, "%s.%d.%d", peer->host, afi, safi);
1789
1790 while (p_pnt < p_end)
1791 {
1792 memset (&orfp, 0, sizeof (struct orf_prefix));
1793 common = *p_pnt++;
1794 if (common & ORF_COMMON_PART_REMOVE_ALL)
1795 {
1796 if (BGP_DEBUG (normal, NORMAL))
1797 zlog_info ("%s rcvd Remove-All pfxlist ORF request", peer->host);
1798 prefix_bgp_orf_remove_all (name);
1799 break;
1800 }
1801 memcpy (&seq, p_pnt, sizeof (u_int32_t));
1802 p_pnt += sizeof (u_int32_t);
1803 orfp.seq = ntohl (seq);
1804 orfp.ge = *p_pnt++;
1805 orfp.le = *p_pnt++;
1806 orfp.p.prefixlen = *p_pnt++;
1807 orfp.p.family = afi2family (afi);
1808 psize = PSIZE (orfp.p.prefixlen);
1809 memcpy (&orfp.p.u.prefix, p_pnt, psize);
1810 p_pnt += psize;
1811
1812 if (BGP_DEBUG (normal, NORMAL))
1813 zlog_info ("%s rcvd %s %s seq %u %s/%d ge %d le %d",
1814 peer->host,
1815 (common & ORF_COMMON_PART_REMOVE ? "Remove" : "Add"),
1816 (common & ORF_COMMON_PART_DENY ? "deny" : "permit"),
1817 orfp.seq,
1818 inet_ntop (orfp.p.family, &orfp.p.u.prefix, buf, BUFSIZ),
1819 orfp.p.prefixlen, orfp.ge, orfp.le);
1820
1821 ret = prefix_bgp_orf_set (name, afi, &orfp,
1822 (common & ORF_COMMON_PART_DENY ? 0 : 1 ),
1823 (common & ORF_COMMON_PART_REMOVE ? 0 : 1));
1824
1825 if (ret != CMD_SUCCESS)
1826 {
1827 if (BGP_DEBUG (normal, NORMAL))
1828 zlog_info ("%s Received misformatted prefixlist ORF. Remove All pfxlist", peer->host);
1829 prefix_bgp_orf_remove_all (name);
1830 break;
1831 }
1832 }
1833 peer->orf_plist[afi][safi] =
1834 prefix_list_lookup (AFI_ORF_PREFIX, name);
1835 }
1836 stream_forward (s, orf_len);
1837 }
1838 if (BGP_DEBUG (normal, NORMAL))
1839 zlog_info ("%s rcvd Refresh %s ORF request", peer->host,
1840 when_to_refresh == REFRESH_DEFER ? "Defer" : "Immediate");
1841 if (when_to_refresh == REFRESH_DEFER)
1842 return;
1843 }
1844
1845 /* First update is deferred until ORF or ROUTE-REFRESH is received */
1846 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
1847 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH);
1848
1849 /* Perform route refreshment to the peer */
1850 bgp_announce_route (peer, afi, safi);
1851}
1852
1853int
1854bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length)
1855{
1856 u_char *end;
1857 struct capability cap;
1858 u_char action;
1859 struct bgp *bgp;
1860 afi_t afi;
1861 safi_t safi;
1862
1863 bgp = peer->bgp;
1864 end = pnt + length;
1865
1866 while (pnt < end)
1867 {
1868 /* We need at least action, capability code and capability length. */
1869 if (pnt + 3 > end)
1870 {
1871 zlog_info ("%s Capability length error", peer->host);
1872 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
1873 return -1;
1874 }
1875
1876 action = *pnt;
1877
1878 /* Fetch structure to the byte stream. */
1879 memcpy (&cap, pnt + 1, sizeof (struct capability));
1880
1881 /* Action value check. */
1882 if (action != CAPABILITY_ACTION_SET
1883 && action != CAPABILITY_ACTION_UNSET)
1884 {
1885 zlog_info ("%s Capability Action Value error %d",
1886 peer->host, action);
1887 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
1888 return -1;
1889 }
1890
1891 if (BGP_DEBUG (normal, NORMAL))
1892 zlog_info ("%s CAPABILITY has action: %d, code: %u, length %u",
1893 peer->host, action, cap.code, cap.length);
1894
1895 /* Capability length check. */
1896 if (pnt + (cap.length + 3) > end)
1897 {
1898 zlog_info ("%s Capability length error", peer->host);
1899 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
1900 return -1;
1901 }
1902
1903 /* We know MP Capability Code. */
1904 if (cap.code == CAPABILITY_CODE_MP)
1905 {
1906 afi = ntohs (cap.mpc.afi);
1907 safi = cap.mpc.safi;
1908
1909 /* Ignore capability when override-capability is set. */
1910 if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
1911 continue;
1912
1913 /* Address family check. */
1914 if ((afi == AFI_IP
1915 || afi == AFI_IP6)
1916 && (safi == SAFI_UNICAST
1917 || safi == SAFI_MULTICAST
1918 || safi == BGP_SAFI_VPNV4))
1919 {
1920 if (BGP_DEBUG (normal, NORMAL))
1921 zlog_info ("%s CAPABILITY has %s MP_EXT CAP for afi/safi: %u/%u",
1922 peer->host,
1923 action == CAPABILITY_ACTION_SET
1924 ? "Advertising" : "Removing",
1925 ntohs(cap.mpc.afi) , cap.mpc.safi);
1926
1927 /* Adjust safi code. */
1928 if (safi == BGP_SAFI_VPNV4)
1929 safi = SAFI_MPLS_VPN;
1930
1931 if (action == CAPABILITY_ACTION_SET)
1932 {
1933 peer->afc_recv[afi][safi] = 1;
1934 if (peer->afc[afi][safi])
1935 {
1936 peer->afc_nego[afi][safi] = 1;
1937 bgp_announce_route (peer, afi, safi);
1938 }
1939 }
1940 else
1941 {
1942 peer->afc_recv[afi][safi] = 0;
1943 peer->afc_nego[afi][safi] = 0;
1944
1945 if (peer_active_nego (peer))
1946 bgp_clear_route (peer, afi, safi);
1947 else
1948 BGP_EVENT_ADD (peer, BGP_Stop);
1949 }
1950 }
1951 }
1952 else if (cap.code == CAPABILITY_CODE_REFRESH
1953 || cap.code == CAPABILITY_CODE_REFRESH_OLD)
1954 {
1955 /* Check length. */
1956 if (cap.length != 0)
1957 {
1958 zlog_info ("%s Route Refresh Capability length error %d",
1959 peer->host, cap.length);
1960 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
1961 return -1;
1962 }
1963
1964 if (BGP_DEBUG (normal, NORMAL))
1965 zlog_info ("%s CAPABILITY has %s ROUTE-REFRESH capability(%s) for all address-families",
1966 peer->host,
1967 action == CAPABILITY_ACTION_SET
1968 ? "Advertising" : "Removing",
1969 cap.code == CAPABILITY_CODE_REFRESH_OLD
1970 ? "old" : "new");
1971
1972 /* BGP refresh capability */
1973 if (action == CAPABILITY_ACTION_SET)
1974 {
1975 if (cap.code == CAPABILITY_CODE_REFRESH_OLD)
1976 SET_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV);
1977 else
1978 SET_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV);
1979 }
1980 else
1981 {
1982 if (cap.code == CAPABILITY_CODE_REFRESH_OLD)
1983 UNSET_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV);
1984 else
1985 UNSET_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV);
1986 }
1987 }
1988 else
1989 {
1990 zlog_warn ("%s unrecognized capability code: %d - ignored",
1991 peer->host, cap.code);
1992 }
1993 pnt += cap.length + 3;
1994 }
1995 return 0;
1996}
1997
1998/* Dynamic Capability is received. */
1999void
2000bgp_capability_receive (struct peer *peer, bgp_size_t size)
2001{
2002 u_char *pnt;
2003 int ret;
2004
2005 /* Fetch pointer. */
2006 pnt = stream_pnt (peer->ibuf);
2007
2008 if (BGP_DEBUG (normal, NORMAL))
2009 zlog_info ("%s rcv CAPABILITY", peer->host);
2010
2011 /* If peer does not have the capability, send notification. */
2012 if (! CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV))
2013 {
2014 plog_err (peer->log, "%s [Error] BGP dynamic capability is not enabled",
2015 peer->host);
2016 bgp_notify_send (peer,
2017 BGP_NOTIFY_HEADER_ERR,
2018 BGP_NOTIFY_HEADER_BAD_MESTYPE);
2019 return;
2020 }
2021
2022 /* Status must be Established. */
2023 if (peer->status != Established)
2024 {
2025 plog_err (peer->log,
2026 "%s [Error] Dynamic capability packet received under status %s", peer->host, LOOKUP (bgp_status_msg, peer->status));
2027 bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
2028 return;
2029 }
2030
2031 /* Parse packet. */
2032 ret = bgp_capability_msg_parse (peer, pnt, size);
2033}
2034
2035/* BGP read utility function. */
2036int
2037bgp_read_packet (struct peer *peer)
2038{
2039 int nbytes;
2040 int readsize;
2041
2042 readsize = peer->packet_size - peer->ibuf->putp;
2043
2044 /* If size is zero then return. */
2045 if (! readsize)
2046 return 0;
2047
2048 /* Read packet from fd. */
pauleb821182004-05-01 08:44:08 +00002049 nbytes = stream_read_unblock (peer->ibuf, peer->fd, readsize);
paul718e3742002-12-13 20:15:29 +00002050
2051 /* If read byte is smaller than zero then error occured. */
2052 if (nbytes < 0)
2053 {
2054 if (errno == EAGAIN)
2055 return -1;
2056
2057 plog_err (peer->log, "%s [Error] bgp_read_packet error: %s",
2058 peer->host, strerror (errno));
2059 BGP_EVENT_ADD (peer, TCP_fatal_error);
2060 return -1;
2061 }
2062
2063 /* When read byte is zero : clear bgp peer and return */
2064 if (nbytes == 0)
2065 {
2066 if (BGP_DEBUG (events, EVENTS))
2067 plog_info (peer->log, "%s [Event] BGP connection closed fd %d",
pauleb821182004-05-01 08:44:08 +00002068 peer->host, peer->fd);
hassoe0701b72004-05-20 09:19:34 +00002069
2070 if (peer->status == Established)
2071 peer->last_reset = PEER_DOWN_CLOSE_SESSION;
2072
paul718e3742002-12-13 20:15:29 +00002073 BGP_EVENT_ADD (peer, TCP_connection_closed);
2074 return -1;
2075 }
2076
2077 /* We read partial packet. */
2078 if (peer->ibuf->putp != peer->packet_size)
2079 return -1;
2080
2081 return 0;
2082}
2083
2084/* Marker check. */
2085int
2086bgp_marker_all_one (struct stream *s, int length)
2087{
2088 int i;
2089
2090 for (i = 0; i < length; i++)
2091 if (s->data[i] != 0xff)
2092 return 0;
2093
2094 return 1;
2095}
2096
2097/* Starting point of packet process function. */
2098int
2099bgp_read (struct thread *thread)
2100{
2101 int ret;
2102 u_char type = 0;
2103 struct peer *peer;
2104 bgp_size_t size;
2105 char notify_data_length[2];
2106
2107 /* Yes first of all get peer pointer. */
2108 peer = THREAD_ARG (thread);
2109 peer->t_read = NULL;
2110
2111 /* For non-blocking IO check. */
2112 if (peer->status == Connect)
2113 {
2114 bgp_connect_check (peer);
2115 goto done;
2116 }
2117 else
2118 {
pauleb821182004-05-01 08:44:08 +00002119 if (peer->fd < 0)
paul718e3742002-12-13 20:15:29 +00002120 {
pauleb821182004-05-01 08:44:08 +00002121 zlog_err ("bgp_read peer's fd is negative value %d", peer->fd);
paul718e3742002-12-13 20:15:29 +00002122 return -1;
2123 }
pauleb821182004-05-01 08:44:08 +00002124 BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
paul718e3742002-12-13 20:15:29 +00002125 }
2126
2127 /* Read packet header to determine type of the packet */
2128 if (peer->packet_size == 0)
2129 peer->packet_size = BGP_HEADER_SIZE;
2130
2131 if (peer->ibuf->putp < BGP_HEADER_SIZE)
2132 {
2133 ret = bgp_read_packet (peer);
2134
2135 /* Header read error or partial read packet. */
2136 if (ret < 0)
2137 goto done;
2138
2139 /* Get size and type. */
2140 stream_forward (peer->ibuf, BGP_MARKER_SIZE);
2141 memcpy (notify_data_length, stream_pnt (peer->ibuf), 2);
2142 size = stream_getw (peer->ibuf);
2143 type = stream_getc (peer->ibuf);
2144
2145 if (BGP_DEBUG (normal, NORMAL) && type != 2 && type != 0)
2146 zlog_info ("%s rcv message type %d, length (excl. header) %d",
2147 peer->host, type, size - BGP_HEADER_SIZE);
2148
2149 /* Marker check */
2150 if (type == BGP_MSG_OPEN
2151 && ! bgp_marker_all_one (peer->ibuf, BGP_MARKER_SIZE))
2152 {
2153 bgp_notify_send (peer,
2154 BGP_NOTIFY_HEADER_ERR,
2155 BGP_NOTIFY_HEADER_NOT_SYNC);
2156 goto done;
2157 }
2158
2159 /* BGP type check. */
2160 if (type != BGP_MSG_OPEN && type != BGP_MSG_UPDATE
2161 && type != BGP_MSG_NOTIFY && type != BGP_MSG_KEEPALIVE
2162 && type != BGP_MSG_ROUTE_REFRESH_NEW
2163 && type != BGP_MSG_ROUTE_REFRESH_OLD
2164 && type != BGP_MSG_CAPABILITY)
2165 {
2166 if (BGP_DEBUG (normal, NORMAL))
2167 plog_err (peer->log,
2168 "%s unknown message type 0x%02x",
2169 peer->host, type);
2170 bgp_notify_send_with_data (peer,
2171 BGP_NOTIFY_HEADER_ERR,
2172 BGP_NOTIFY_HEADER_BAD_MESTYPE,
2173 &type, 1);
2174 goto done;
2175 }
2176 /* Mimimum packet length check. */
2177 if ((size < BGP_HEADER_SIZE)
2178 || (size > BGP_MAX_PACKET_SIZE)
2179 || (type == BGP_MSG_OPEN && size < BGP_MSG_OPEN_MIN_SIZE)
2180 || (type == BGP_MSG_UPDATE && size < BGP_MSG_UPDATE_MIN_SIZE)
2181 || (type == BGP_MSG_NOTIFY && size < BGP_MSG_NOTIFY_MIN_SIZE)
2182 || (type == BGP_MSG_KEEPALIVE && size != BGP_MSG_KEEPALIVE_MIN_SIZE)
2183 || (type == BGP_MSG_ROUTE_REFRESH_NEW && size < BGP_MSG_ROUTE_REFRESH_MIN_SIZE)
2184 || (type == BGP_MSG_ROUTE_REFRESH_OLD && size < BGP_MSG_ROUTE_REFRESH_MIN_SIZE)
2185 || (type == BGP_MSG_CAPABILITY && size < BGP_MSG_CAPABILITY_MIN_SIZE))
2186 {
2187 if (BGP_DEBUG (normal, NORMAL))
2188 plog_err (peer->log,
2189 "%s bad message length - %d for %s",
2190 peer->host, size,
2191 type == 128 ? "ROUTE-REFRESH" :
2192 bgp_type_str[(int) type]);
2193 bgp_notify_send_with_data (peer,
2194 BGP_NOTIFY_HEADER_ERR,
2195 BGP_NOTIFY_HEADER_BAD_MESLEN,
2196 notify_data_length, 2);
2197 goto done;
2198 }
2199
2200 /* Adjust size to message length. */
2201 peer->packet_size = size;
2202 }
2203
2204 ret = bgp_read_packet (peer);
2205 if (ret < 0)
2206 goto done;
2207
2208 /* Get size and type again. */
2209 size = stream_getw_from (peer->ibuf, BGP_MARKER_SIZE);
2210 type = stream_getc_from (peer->ibuf, BGP_MARKER_SIZE + 2);
2211
2212 /* BGP packet dump function. */
2213 bgp_dump_packet (peer, type, peer->ibuf);
2214
2215 size = (peer->packet_size - BGP_HEADER_SIZE);
2216
2217 /* Read rest of the packet and call each sort of packet routine */
2218 switch (type)
2219 {
2220 case BGP_MSG_OPEN:
2221 peer->open_in++;
2222 bgp_open_receive (peer, size);
2223 break;
2224 case BGP_MSG_UPDATE:
2225 peer->readtime = time(NULL); /* Last read timer reset */
2226 bgp_update_receive (peer, size);
2227 break;
2228 case BGP_MSG_NOTIFY:
2229 bgp_notify_receive (peer, size);
2230 break;
2231 case BGP_MSG_KEEPALIVE:
2232 peer->readtime = time(NULL); /* Last read timer reset */
2233 bgp_keepalive_receive (peer, size);
2234 break;
2235 case BGP_MSG_ROUTE_REFRESH_NEW:
2236 case BGP_MSG_ROUTE_REFRESH_OLD:
2237 peer->refresh_in++;
2238 bgp_route_refresh_receive (peer, size);
2239 break;
2240 case BGP_MSG_CAPABILITY:
2241 peer->dynamic_cap_in++;
2242 bgp_capability_receive (peer, size);
2243 break;
2244 }
2245
2246 /* Clear input buffer. */
2247 peer->packet_size = 0;
2248 if (peer->ibuf)
2249 stream_reset (peer->ibuf);
2250
2251 done:
2252 if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
2253 {
2254 if (BGP_DEBUG (events, EVENTS))
2255 zlog_info ("%s [Event] Accepting BGP peer delete", peer->host);
2256 peer_delete (peer);
2257 }
2258 return 0;
2259}