]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_packet.c
Merge branch 'quagga' into google-bgp-multipath
[mirror_frr.git] / bgpd / bgp_packet.c
CommitLineData
718e3744 1/* 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"
93406d87 49#include "bgpd/bgp_vty.h"
718e3744 50
51int stream_put_prefix (struct stream *, struct prefix *);
52\f
53/* Set up BGP packet marker and packet type. */
54static int
55bgp_packet_set_marker (struct stream *s, u_char type)
56{
57 int i;
58
59 /* Fill in marker. */
60 for (i = 0; i < BGP_MARKER_SIZE; i++)
61 stream_putc (s, 0xff);
62
63 /* Dummy total length. This field is should be filled in later on. */
64 stream_putw (s, 0);
65
66 /* BGP packet type. */
67 stream_putc (s, type);
68
69 /* Return current stream size. */
9985f83c 70 return stream_get_endp (s);
718e3744 71}
72
73/* Set BGP packet header size entry. If size is zero then use current
74 stream size. */
75static int
76bgp_packet_set_size (struct stream *s)
77{
78 int cp;
79
80 /* Preserve current pointer. */
9985f83c 81 cp = stream_get_endp (s);
82 stream_putw_at (s, BGP_MARKER_SIZE, cp);
718e3744 83
84 return cp;
85}
86
87/* Add new packet to the peer. */
94f2b392 88static void
718e3744 89bgp_packet_add (struct peer *peer, struct stream *s)
90{
91 /* Add packet to the end of list. */
92 stream_fifo_push (peer->obuf, s);
93}
94
95/* Free first packet. */
94f2b392 96static void
718e3744 97bgp_packet_delete (struct peer *peer)
98{
99 stream_free (stream_fifo_pop (peer->obuf));
100}
101
718e3744 102/* Check file descriptor whether connect is established. */
103static void
104bgp_connect_check (struct peer *peer)
105{
106 int status;
5228ad27 107 socklen_t slen;
718e3744 108 int ret;
109
110 /* Anyway I have to reset read and write thread. */
111 BGP_READ_OFF (peer->t_read);
112 BGP_WRITE_OFF (peer->t_write);
113
114 /* Check file descriptor. */
115 slen = sizeof (status);
eb821189 116 ret = getsockopt(peer->fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen);
718e3744 117
118 /* If getsockopt is fail, this is fatal error. */
119 if (ret < 0)
120 {
121 zlog (peer->log, LOG_INFO, "can't get sockopt for nonblocking connect");
122 BGP_EVENT_ADD (peer, TCP_fatal_error);
123 return;
124 }
125
126 /* When status is 0 then TCP connection is established. */
127 if (status == 0)
128 {
129 BGP_EVENT_ADD (peer, TCP_connection_open);
130 }
131 else
132 {
133 if (BGP_DEBUG (events, EVENTS))
6b51474d 134 plog_debug (peer->log, "%s [Event] Connect failed (%s)",
6099b3b5 135 peer->host, safe_strerror (errno));
718e3744 136 BGP_EVENT_ADD (peer, TCP_connection_open_failed);
137 }
138}
139
140/* Make BGP update packet. */
94f2b392 141static struct stream *
718e3744 142bgp_update_packet (struct peer *peer, afi_t afi, safi_t safi)
143{
144 struct stream *s;
145 struct bgp_adj_out *adj;
146 struct bgp_advertise *adv;
147 struct stream *packet;
148 struct bgp_node *rn = NULL;
149 struct bgp_info *binfo = NULL;
150 bgp_size_t total_attr_len = 0;
151 unsigned long pos;
152 char buf[BUFSIZ];
718e3744 153
154 s = peer->work;
155 stream_reset (s);
156
157 adv = FIFO_HEAD (&peer->sync[afi][safi]->update);
158
159 while (adv)
160 {
ed3ebfa3
PJ
161 assert (adv->rn);
162 rn = adv->rn;
718e3744 163 adj = adv->adj;
164 if (adv->binfo)
165 binfo = adv->binfo;
718e3744 166
167 /* When remaining space can't include NLRI and it's length. */
ed3ebfa3 168 if (STREAM_REMAIN (s) <= BGP_NLRI_LENGTH + PSIZE (rn->p.prefixlen))
718e3744 169 break;
170
171 /* If packet is empty, set attribute. */
172 if (stream_empty (s))
173 {
a3b6ea56
PJ
174 struct prefix_rd *prd = NULL;
175 u_char *tag = NULL;
ed3ebfa3 176 struct peer *from = NULL;
a3b6ea56
PJ
177
178 if (rn->prn)
179 prd = (struct prefix_rd *) &rn->prn->p;
d3ddb22e 180 if (binfo)
ed3ebfa3 181 {
ed3ebfa3 182 from = binfo->peer;
d3ddb22e
GT
183 if (binfo->extra)
184 tag = binfo->extra->tag;
ed3ebfa3 185 }
a3b6ea56 186
718e3744 187 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
188 stream_putw (s, 0);
9985f83c 189 pos = stream_get_endp (s);
718e3744 190 stream_putw (s, 0);
5228ad27 191 total_attr_len = bgp_packet_attribute (NULL, peer, s,
192 adv->baa->attr,
193 &rn->p, afi, safi,
ed3ebfa3 194 from, prd, tag);
718e3744 195 stream_putw_at (s, pos, total_attr_len);
196 }
197
198 if (afi == AFI_IP && safi == SAFI_UNICAST)
199 stream_put_prefix (s, &rn->p);
200
201 if (BGP_DEBUG (update, UPDATE_OUT))
6b51474d 202 zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d",
718e3744 203 peer->host,
204 inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, BUFSIZ),
205 rn->p.prefixlen);
206
207 /* Synchnorize attribute. */
208 if (adj->attr)
f6f434b2 209 bgp_attr_unintern (&adj->attr);
718e3744 210 else
211 peer->scount[afi][safi]++;
212
213 adj->attr = bgp_attr_intern (adv->baa->attr);
214
215 adv = bgp_advertise_clean (peer, adj, afi, safi);
216
217 if (! (afi == AFI_IP && safi == SAFI_UNICAST))
218 break;
219 }
220
221 if (! stream_empty (s))
222 {
223 bgp_packet_set_size (s);
e83e2080 224 packet = stream_dup (s);
718e3744 225 bgp_packet_add (peer, packet);
eb821189 226 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
718e3744 227 stream_reset (s);
228 return packet;
229 }
230 return NULL;
93406d87 231}
232
94f2b392 233static struct stream *
93406d87 234bgp_update_packet_eor (struct peer *peer, afi_t afi, safi_t safi)
235{
236 struct stream *s;
237 struct stream *packet;
238
750e8146
PJ
239 if (DISABLE_BGP_ANNOUNCE)
240 return NULL;
93406d87 241
242 if (BGP_DEBUG (normal, NORMAL))
243 zlog_debug ("send End-of-RIB for %s to %s", afi_safi_print (afi, safi), peer->host);
244
245 s = stream_new (BGP_MAX_PACKET_SIZE);
246
247 /* Make BGP update packet. */
248 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
249
250 /* Unfeasible Routes Length */
251 stream_putw (s, 0);
718e3744 252
93406d87 253 if (afi == AFI_IP && safi == SAFI_UNICAST)
254 {
255 /* Total Path Attribute Length */
256 stream_putw (s, 0);
257 }
258 else
259 {
260 /* Total Path Attribute Length */
261 stream_putw (s, 6);
262 stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
263 stream_putc (s, BGP_ATTR_MP_UNREACH_NLRI);
264 stream_putc (s, 3);
265 stream_putw (s, afi);
266 stream_putc (s, safi);
267 }
268
269 bgp_packet_set_size (s);
e83e2080 270 packet = stream_dup (s);
93406d87 271 bgp_packet_add (peer, packet);
272 stream_free (s);
273 return packet;
718e3744 274}
275
276/* Make BGP withdraw packet. */
94f2b392 277static struct stream *
718e3744 278bgp_withdraw_packet (struct peer *peer, afi_t afi, safi_t safi)
279{
280 struct stream *s;
281 struct stream *packet;
282 struct bgp_adj_out *adj;
283 struct bgp_advertise *adv;
284 struct bgp_node *rn;
285 unsigned long pos;
286 bgp_size_t unfeasible_len;
287 bgp_size_t total_attr_len;
288 char buf[BUFSIZ];
718e3744 289
290 s = peer->work;
291 stream_reset (s);
292
293 while ((adv = FIFO_HEAD (&peer->sync[afi][safi]->withdraw)) != NULL)
294 {
ed3ebfa3 295 assert (adv->rn);
718e3744 296 adj = adv->adj;
297 rn = adv->rn;
718e3744 298
299 if (STREAM_REMAIN (s)
4372df71 300 < (BGP_NLRI_LENGTH + BGP_TOTAL_ATTR_LEN + PSIZE (rn->p.prefixlen)))
718e3744 301 break;
302
303 if (stream_empty (s))
304 {
305 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
306 stream_putw (s, 0);
307 }
308
309 if (afi == AFI_IP && safi == SAFI_UNICAST)
310 stream_put_prefix (s, &rn->p);
311 else
312 {
a3b6ea56
PJ
313 struct prefix_rd *prd = NULL;
314
315 if (rn->prn)
316 prd = (struct prefix_rd *) &rn->prn->p;
9985f83c 317 pos = stream_get_endp (s);
718e3744 318 stream_putw (s, 0);
319 total_attr_len
320 = bgp_packet_withdraw (peer, s, &rn->p, afi, safi, prd, NULL);
321
322 /* Set total path attribute length. */
323 stream_putw_at (s, pos, total_attr_len);
324 }
325
326 if (BGP_DEBUG (update, UPDATE_OUT))
6b51474d 327 zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d -- unreachable",
718e3744 328 peer->host,
329 inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, BUFSIZ),
330 rn->p.prefixlen);
331
332 peer->scount[afi][safi]--;
333
334 bgp_adj_out_remove (rn, adj, peer, afi, safi);
335 bgp_unlock_node (rn);
336
337 if (! (afi == AFI_IP && safi == SAFI_UNICAST))
338 break;
339 }
340
341 if (! stream_empty (s))
342 {
343 if (afi == AFI_IP && safi == SAFI_UNICAST)
344 {
345 unfeasible_len
9985f83c 346 = stream_get_endp (s) - BGP_HEADER_SIZE - BGP_UNFEASIBLE_LEN;
718e3744 347 stream_putw_at (s, BGP_HEADER_SIZE, unfeasible_len);
348 stream_putw (s, 0);
349 }
350 bgp_packet_set_size (s);
e83e2080 351 packet = stream_dup (s);
718e3744 352 bgp_packet_add (peer, packet);
353 stream_reset (s);
354 return packet;
355 }
356
357 return NULL;
358}
359
360void
361bgp_default_update_send (struct peer *peer, struct attr *attr,
362 afi_t afi, safi_t safi, struct peer *from)
363{
364 struct stream *s;
365 struct stream *packet;
366 struct prefix p;
367 unsigned long pos;
368 bgp_size_t total_attr_len;
369 char attrstr[BUFSIZ];
370 char buf[BUFSIZ];
371
750e8146
PJ
372 if (DISABLE_BGP_ANNOUNCE)
373 return;
718e3744 374
375 if (afi == AFI_IP)
376 str2prefix ("0.0.0.0/0", &p);
377#ifdef HAVE_IPV6
378 else
379 str2prefix ("::/0", &p);
380#endif /* HAVE_IPV6 */
381
382 /* Logging the attribute. */
383 if (BGP_DEBUG (update, UPDATE_OUT))
384 {
385 bgp_dump_attr (peer, attr, attrstr, BUFSIZ);
6b51474d 386 zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d %s",
718e3744 387 peer->host, inet_ntop(p.family, &(p.u.prefix), buf, BUFSIZ),
388 p.prefixlen, attrstr);
389 }
390
391 s = stream_new (BGP_MAX_PACKET_SIZE);
392
393 /* Make BGP update packet. */
394 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
395
396 /* Unfeasible Routes Length. */
397 stream_putw (s, 0);
398
399 /* Make place for total attribute length. */
9985f83c 400 pos = stream_get_endp (s);
718e3744 401 stream_putw (s, 0);
402 total_attr_len = bgp_packet_attribute (NULL, peer, s, attr, &p, afi, safi, from, NULL, NULL);
403
404 /* Set Total Path Attribute Length. */
405 stream_putw_at (s, pos, total_attr_len);
406
407 /* NLRI set. */
408 if (p.family == AF_INET && safi == SAFI_UNICAST)
409 stream_put_prefix (s, &p);
410
411 /* Set size. */
412 bgp_packet_set_size (s);
413
e83e2080 414 packet = stream_dup (s);
718e3744 415 stream_free (s);
416
417 /* Dump packet if debug option is set. */
418#ifdef DEBUG
2d74db55 419 /* bgp_packet_dump (packet); */
718e3744 420#endif /* DEBUG */
421
422 /* Add packet to the peer. */
423 bgp_packet_add (peer, packet);
424
eb821189 425 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
718e3744 426}
427
428void
429bgp_default_withdraw_send (struct peer *peer, afi_t afi, safi_t safi)
430{
431 struct stream *s;
432 struct stream *packet;
433 struct prefix p;
434 unsigned long pos;
435 unsigned long cp;
436 bgp_size_t unfeasible_len;
437 bgp_size_t total_attr_len;
438 char buf[BUFSIZ];
439
750e8146
PJ
440 if (DISABLE_BGP_ANNOUNCE)
441 return;
718e3744 442
443 if (afi == AFI_IP)
444 str2prefix ("0.0.0.0/0", &p);
445#ifdef HAVE_IPV6
446 else
447 str2prefix ("::/0", &p);
448#endif /* HAVE_IPV6 */
449
450 total_attr_len = 0;
451 pos = 0;
452
453 if (BGP_DEBUG (update, UPDATE_OUT))
6b51474d 454 zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d -- unreachable",
718e3744 455 peer->host, inet_ntop(p.family, &(p.u.prefix), buf, BUFSIZ),
456 p.prefixlen);
457
458 s = stream_new (BGP_MAX_PACKET_SIZE);
459
460 /* Make BGP update packet. */
461 bgp_packet_set_marker (s, BGP_MSG_UPDATE);
462
463 /* Unfeasible Routes Length. */;
9985f83c 464 cp = stream_get_endp (s);
718e3744 465 stream_putw (s, 0);
466
467 /* Withdrawn Routes. */
468 if (p.family == AF_INET && safi == SAFI_UNICAST)
469 {
470 stream_put_prefix (s, &p);
471
9985f83c 472 unfeasible_len = stream_get_endp (s) - cp - 2;
718e3744 473
474 /* Set unfeasible len. */
475 stream_putw_at (s, cp, unfeasible_len);
476
477 /* Set total path attribute length. */
478 stream_putw (s, 0);
479 }
480 else
481 {
9985f83c 482 pos = stream_get_endp (s);
718e3744 483 stream_putw (s, 0);
484 total_attr_len = bgp_packet_withdraw (peer, s, &p, afi, safi, NULL, NULL);
485
486 /* Set total path attribute length. */
487 stream_putw_at (s, pos, total_attr_len);
488 }
489
490 bgp_packet_set_size (s);
491
e83e2080 492 packet = stream_dup (s);
718e3744 493 stream_free (s);
494
495 /* Add packet to the peer. */
496 bgp_packet_add (peer, packet);
497
eb821189 498 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
718e3744 499}
500
501/* Get next packet to be written. */
94f2b392 502static struct stream *
718e3744 503bgp_write_packet (struct peer *peer)
504{
505 afi_t afi;
506 safi_t safi;
507 struct stream *s = NULL;
508 struct bgp_advertise *adv;
509
510 s = stream_fifo_head (peer->obuf);
511 if (s)
512 return s;
513
514 for (afi = AFI_IP; afi < AFI_MAX; afi++)
515 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
516 {
517 adv = FIFO_HEAD (&peer->sync[afi][safi]->withdraw);
518 if (adv)
519 {
520 s = bgp_withdraw_packet (peer, afi, safi);
521 if (s)
522 return s;
523 }
524 }
525
526 for (afi = AFI_IP; afi < AFI_MAX; afi++)
527 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
528 {
529 adv = FIFO_HEAD (&peer->sync[afi][safi]->update);
530 if (adv)
531 {
532 if (adv->binfo && adv->binfo->uptime < peer->synctime)
93406d87 533 {
534 if (CHECK_FLAG (adv->binfo->peer->cap, PEER_CAP_RESTART_RCV)
535 && CHECK_FLAG (adv->binfo->peer->cap, PEER_CAP_RESTART_ADV)
536 && ! CHECK_FLAG (adv->binfo->flags, BGP_INFO_STALE)
537 && safi != SAFI_MPLS_VPN)
538 {
539 if (CHECK_FLAG (adv->binfo->peer->af_sflags[afi][safi],
540 PEER_STATUS_EOR_RECEIVED))
541 s = bgp_update_packet (peer, afi, safi);
542 }
543 else
544 s = bgp_update_packet (peer, afi, safi);
545 }
718e3744 546
547 if (s)
548 return s;
549 }
93406d87 550
551 if (CHECK_FLAG (peer->cap, PEER_CAP_RESTART_RCV))
552 {
553 if (peer->afc_nego[afi][safi] && peer->synctime
554 && ! CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_EOR_SEND)
555 && safi != SAFI_MPLS_VPN)
556 {
557 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_EOR_SEND);
558 return bgp_update_packet_eor (peer, afi, safi);
559 }
560 }
718e3744 561 }
562
563 return NULL;
564}
565
566/* Is there partially written packet or updates we can send right
567 now. */
94f2b392 568static int
718e3744 569bgp_write_proceed (struct peer *peer)
570{
571 afi_t afi;
572 safi_t safi;
573 struct bgp_advertise *adv;
574
575 if (stream_fifo_head (peer->obuf))
576 return 1;
577
578 for (afi = AFI_IP; afi < AFI_MAX; afi++)
579 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
580 if (FIFO_HEAD (&peer->sync[afi][safi]->withdraw))
581 return 1;
582
583 for (afi = AFI_IP; afi < AFI_MAX; afi++)
584 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
585 if ((adv = FIFO_HEAD (&peer->sync[afi][safi]->update)) != NULL)
586 if (adv->binfo->uptime < peer->synctime)
587 return 1;
588
589 return 0;
590}
591
592/* Write packet to the peer. */
593int
594bgp_write (struct thread *thread)
595{
596 struct peer *peer;
597 u_char type;
598 struct stream *s;
599 int num;
fd79ac91 600 unsigned int count = 0;
718e3744 601
602 /* Yes first of all get peer pointer. */
603 peer = THREAD_ARG (thread);
604 peer->t_write = NULL;
605
606 /* For non-blocking IO check. */
607 if (peer->status == Connect)
608 {
609 bgp_connect_check (peer);
610 return 0;
611 }
612
eac5702d
SH
613 s = bgp_write_packet (peer);
614 if (!s)
615 return 0; /* nothing to send */
616
617 sockopt_cork (peer->fd, 1);
618
619 /* Nonblocking write until TCP output buffer is full. */
620 do
718e3744 621 {
622 int writenum;
718e3744 623
624 /* Number of bytes to be sent. */
625 writenum = stream_get_endp (s) - stream_get_getp (s);
626
627 /* Call write() system call. */
eb821189 628 num = write (peer->fd, STREAM_PNT (s), writenum);
35398589 629 if (num < 0)
718e3744 630 {
eac5702d
SH
631 /* write failed either retry needed or error */
632 if (ERRNO_IO_RETRY(errno))
633 break;
634
635 BGP_EVENT_ADD (peer, TCP_fatal_error);
718e3744 636 return 0;
637 }
35398589 638
718e3744 639 if (num != writenum)
640 {
35398589 641 /* Partial write */
9985f83c 642 stream_forward_getp (s, num);
eac5702d 643 break;
718e3744 644 }
645
646 /* Retrieve BGP packet type. */
647 stream_set_getp (s, BGP_MARKER_SIZE + 2);
648 type = stream_getc (s);
649
650 switch (type)
651 {
652 case BGP_MSG_OPEN:
653 peer->open_out++;
654 break;
655 case BGP_MSG_UPDATE:
656 peer->update_out++;
657 break;
658 case BGP_MSG_NOTIFY:
659 peer->notify_out++;
660 /* Double start timer. */
661 peer->v_start *= 2;
662
663 /* Overflow check. */
664 if (peer->v_start >= (60 * 2))
665 peer->v_start = (60 * 2);
666
ca058a30 667 /* Flush any existing events */
dcdf399f 668 BGP_EVENT_ADD (peer, BGP_Stop);
718e3744 669 return 0;
718e3744 670 case BGP_MSG_KEEPALIVE:
671 peer->keepalive_out++;
672 break;
673 case BGP_MSG_ROUTE_REFRESH_NEW:
674 case BGP_MSG_ROUTE_REFRESH_OLD:
675 peer->refresh_out++;
676 break;
677 case BGP_MSG_CAPABILITY:
678 peer->dynamic_cap_out++;
679 break;
680 }
681
682 /* OK we send packet so delete it. */
683 bgp_packet_delete (peer);
718e3744 684 }
eac5702d
SH
685 while (++count < BGP_WRITE_PACKET_MAX &&
686 (s = bgp_write_packet (peer)) != NULL);
718e3744 687
688 if (bgp_write_proceed (peer))
eb821189 689 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
eac5702d
SH
690 else
691 sockopt_cork (peer->fd, 0);
718e3744 692
693 return 0;
694}
695
696/* This is only for sending NOTIFICATION message to neighbor. */
94f2b392 697static int
718e3744 698bgp_write_notify (struct peer *peer)
699{
35398589 700 int ret, val;
718e3744 701 u_char type;
702 struct stream *s;
703
704 /* There should be at least one packet. */
705 s = stream_fifo_head (peer->obuf);
706 if (!s)
707 return 0;
708 assert (stream_get_endp (s) >= BGP_HEADER_SIZE);
709
35398589
SH
710 /* Put socket in blocking mode. */
711 val = fcntl (peer->fd, F_GETFL, 0);
712 fcntl (peer->fd, F_SETFL, val & ~O_NONBLOCK);
713
eb821189 714 ret = writen (peer->fd, STREAM_DATA (s), stream_get_endp (s));
718e3744 715 if (ret <= 0)
716 {
dcdf399f 717 BGP_EVENT_ADD (peer, TCP_fatal_error);
718e3744 718 return 0;
719 }
720
721 /* Retrieve BGP packet type. */
722 stream_set_getp (s, BGP_MARKER_SIZE + 2);
723 type = stream_getc (s);
724
725 assert (type == BGP_MSG_NOTIFY);
726
727 /* Type should be notify. */
728 peer->notify_out++;
729
730 /* Double start timer. */
731 peer->v_start *= 2;
732
733 /* Overflow check. */
734 if (peer->v_start >= (60 * 2))
735 peer->v_start = (60 * 2);
736
dcdf399f 737 BGP_EVENT_ADD (peer, BGP_Stop);
718e3744 738
739 return 0;
740}
741
742/* Make keepalive packet and send it to the peer. */
743void
744bgp_keepalive_send (struct peer *peer)
745{
746 struct stream *s;
747 int length;
748
749 s = stream_new (BGP_MAX_PACKET_SIZE);
750
751 /* Make keepalive packet. */
752 bgp_packet_set_marker (s, BGP_MSG_KEEPALIVE);
753
754 /* Set packet size. */
755 length = bgp_packet_set_size (s);
756
757 /* Dump packet if debug option is set. */
758 /* bgp_packet_dump (s); */
759
760 if (BGP_DEBUG (keepalive, KEEPALIVE))
6b51474d 761 zlog_debug ("%s sending KEEPALIVE", peer->host);
718e3744 762 if (BGP_DEBUG (normal, NORMAL))
6b51474d 763 zlog_debug ("%s send message type %d, length (incl. header) %d",
718e3744 764 peer->host, BGP_MSG_KEEPALIVE, length);
765
766 /* Add packet to the peer. */
767 bgp_packet_add (peer, s);
768
eb821189 769 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
718e3744 770}
771
772/* Make open packet and send it to the peer. */
773void
774bgp_open_send (struct peer *peer)
775{
776 struct stream *s;
777 int length;
778 u_int16_t send_holdtime;
779 as_t local_as;
780
781 if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
782 send_holdtime = peer->holdtime;
783 else
784 send_holdtime = peer->bgp->default_holdtime;
785
786 /* local-as Change */
787 if (peer->change_local_as)
788 local_as = peer->change_local_as;
789 else
790 local_as = peer->local_as;
791
792 s = stream_new (BGP_MAX_PACKET_SIZE);
793
794 /* Make open packet. */
795 bgp_packet_set_marker (s, BGP_MSG_OPEN);
796
797 /* Set open packet values. */
798 stream_putc (s, BGP_VERSION_4); /* BGP version */
0b2aa3a0
PJ
799 stream_putw (s, (local_as <= BGP_AS_MAX) ? (u_int16_t) local_as
800 : BGP_AS_TRANS);
718e3744 801 stream_putw (s, send_holdtime); /* Hold Time */
802 stream_put_in_addr (s, &peer->local_id); /* BGP Identifier */
803
804 /* Set capability code. */
805 bgp_open_capability (s, peer);
806
807 /* Set BGP packet length. */
808 length = bgp_packet_set_size (s);
809
810 if (BGP_DEBUG (normal, NORMAL))
aea339f7 811 zlog_debug ("%s sending OPEN, version %d, my as %u, holdtime %d, id %s",
718e3744 812 peer->host, BGP_VERSION_4, local_as,
813 send_holdtime, inet_ntoa (peer->local_id));
814
815 if (BGP_DEBUG (normal, NORMAL))
6b51474d 816 zlog_debug ("%s send message type %d, length (incl. header) %d",
718e3744 817 peer->host, BGP_MSG_OPEN, length);
818
819 /* Dump packet if debug option is set. */
820 /* bgp_packet_dump (s); */
821
822 /* Add packet to the peer. */
823 bgp_packet_add (peer, s);
824
eb821189 825 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
718e3744 826}
827
828/* Send BGP notify packet with data potion. */
829void
830bgp_notify_send_with_data (struct peer *peer, u_char code, u_char sub_code,
831 u_char *data, size_t datalen)
832{
833 struct stream *s;
834 int length;
835
836 /* Allocate new stream. */
837 s = stream_new (BGP_MAX_PACKET_SIZE);
838
839 /* Make nitify packet. */
840 bgp_packet_set_marker (s, BGP_MSG_NOTIFY);
841
842 /* Set notify packet values. */
843 stream_putc (s, code); /* BGP notify code */
844 stream_putc (s, sub_code); /* BGP notify sub_code */
845
846 /* If notify data is present. */
847 if (data)
848 stream_write (s, data, datalen);
849
850 /* Set BGP packet length. */
851 length = bgp_packet_set_size (s);
852
853 /* Add packet to the peer. */
854 stream_fifo_clean (peer->obuf);
855 bgp_packet_add (peer, s);
856
857 /* For debug */
858 {
859 struct bgp_notify bgp_notify;
860 int first = 0;
861 int i;
862 char c[4];
863
864 bgp_notify.code = code;
865 bgp_notify.subcode = sub_code;
866 bgp_notify.data = NULL;
867 bgp_notify.length = length - BGP_MSG_NOTIFY_MIN_SIZE;
868
869 if (bgp_notify.length)
870 {
871 bgp_notify.data = XMALLOC (MTYPE_TMP, bgp_notify.length * 3);
872 for (i = 0; i < bgp_notify.length; i++)
873 if (first)
874 {
875 sprintf (c, " %02x", data[i]);
876 strcat (bgp_notify.data, c);
877 }
878 else
879 {
880 first = 1;
881 sprintf (c, "%02x", data[i]);
882 strcpy (bgp_notify.data, c);
883 }
884 }
885 bgp_notify_print (peer, &bgp_notify, "sending");
886 if (bgp_notify.data)
887 XFREE (MTYPE_TMP, bgp_notify.data);
888 }
889
890 if (BGP_DEBUG (normal, NORMAL))
6b51474d 891 zlog_debug ("%s send message type %d, length (incl. header) %d",
718e3744 892 peer->host, BGP_MSG_NOTIFY, length);
893
e0701b79 894 /* peer reset cause */
895 if (sub_code != BGP_NOTIFY_CEASE_CONFIG_CHANGE)
896 {
897 if (sub_code == BGP_NOTIFY_CEASE_ADMIN_RESET)
1212dc19 898 {
899 peer->last_reset = PEER_DOWN_USER_RESET;
900 zlog_info ("Notification sent to neighbor %s: User reset", peer->host);
901 }
e0701b79 902 else if (sub_code == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN)
1212dc19 903 {
904 peer->last_reset = PEER_DOWN_USER_SHUTDOWN;
905 zlog_info ("Notification sent to neighbor %s: shutdown", peer->host);
906 }
e0701b79 907 else
1212dc19 908 {
909 peer->last_reset = PEER_DOWN_NOTIFY_SEND;
910 zlog_info ("Notification sent to neighbor %s: type %u/%u",
911 peer->host, code, sub_code);
912 }
e0701b79 913 }
1212dc19 914 else
915 zlog_info ("Notification sent to neighbor %s: configuration change",
916 peer->host);
e0701b79 917
7ccf5e59 918 /* Call immediately. */
718e3744 919 BGP_WRITE_OFF (peer->t_write);
920
921 bgp_write_notify (peer);
922}
923
924/* Send BGP notify packet. */
925void
926bgp_notify_send (struct peer *peer, u_char code, u_char sub_code)
927{
928 bgp_notify_send_with_data (peer, code, sub_code, NULL, 0);
929}
930
718e3744 931/* Send route refresh message to the peer. */
932void
933bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi,
934 u_char orf_type, u_char when_to_refresh, int remove)
935{
936 struct stream *s;
937 struct stream *packet;
938 int length;
939 struct bgp_filter *filter;
940 int orf_refresh = 0;
941
750e8146
PJ
942 if (DISABLE_BGP_ANNOUNCE)
943 return;
718e3744 944
945 filter = &peer->filter[afi][safi];
946
947 /* Adjust safi code. */
948 if (safi == SAFI_MPLS_VPN)
42e6d745 949 safi = SAFI_MPLS_LABELED_VPN;
718e3744 950
951 s = stream_new (BGP_MAX_PACKET_SIZE);
952
953 /* Make BGP update packet. */
954 if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
955 bgp_packet_set_marker (s, BGP_MSG_ROUTE_REFRESH_NEW);
956 else
957 bgp_packet_set_marker (s, BGP_MSG_ROUTE_REFRESH_OLD);
958
959 /* Encode Route Refresh message. */
960 stream_putw (s, afi);
961 stream_putc (s, 0);
962 stream_putc (s, safi);
963
964 if (orf_type == ORF_TYPE_PREFIX
965 || orf_type == ORF_TYPE_PREFIX_OLD)
966 if (remove || filter->plist[FILTER_IN].plist)
967 {
968 u_int16_t orf_len;
969 unsigned long orfp;
970
971 orf_refresh = 1;
972 stream_putc (s, when_to_refresh);
973 stream_putc (s, orf_type);
9985f83c 974 orfp = stream_get_endp (s);
718e3744 975 stream_putw (s, 0);
976
977 if (remove)
978 {
979 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND);
980 stream_putc (s, ORF_COMMON_PART_REMOVE_ALL);
981 if (BGP_DEBUG (normal, NORMAL))
6b51474d 982 zlog_debug ("%s sending REFRESH_REQ to remove ORF(%d) (%s) for afi/safi: %d/%d",
718e3744 983 peer->host, orf_type,
984 (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"),
985 afi, safi);
986 }
987 else
988 {
989 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND);
990 prefix_bgp_orf_entry (s, filter->plist[FILTER_IN].plist,
991 ORF_COMMON_PART_ADD, ORF_COMMON_PART_PERMIT,
992 ORF_COMMON_PART_DENY);
993 if (BGP_DEBUG (normal, NORMAL))
6b51474d 994 zlog_debug ("%s sending REFRESH_REQ with pfxlist ORF(%d) (%s) for afi/safi: %d/%d",
718e3744 995 peer->host, orf_type,
996 (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"),
997 afi, safi);
998 }
999
1000 /* Total ORF Entry Len. */
9985f83c 1001 orf_len = stream_get_endp (s) - orfp - 2;
718e3744 1002 stream_putw_at (s, orfp, orf_len);
1003 }
1004
1005 /* Set packet size. */
1006 length = bgp_packet_set_size (s);
1007
1008 if (BGP_DEBUG (normal, NORMAL))
1009 {
1010 if (! orf_refresh)
6b51474d 1011 zlog_debug ("%s sending REFRESH_REQ for afi/safi: %d/%d",
718e3744 1012 peer->host, afi, safi);
6b51474d 1013 zlog_debug ("%s send message type %d, length (incl. header) %d",
718e3744 1014 peer->host, CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV) ?
1015 BGP_MSG_ROUTE_REFRESH_NEW : BGP_MSG_ROUTE_REFRESH_OLD, length);
1016 }
1017
1018 /* Make real packet. */
e83e2080 1019 packet = stream_dup (s);
718e3744 1020 stream_free (s);
1021
1022 /* Add packet to the peer. */
1023 bgp_packet_add (peer, packet);
1024
eb821189 1025 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
718e3744 1026}
1027
1028/* Send capability message to the peer. */
1029void
1030bgp_capability_send (struct peer *peer, afi_t afi, safi_t safi,
1031 int capability_code, int action)
1032{
1033 struct stream *s;
1034 struct stream *packet;
1035 int length;
1036
1037 /* Adjust safi code. */
1038 if (safi == SAFI_MPLS_VPN)
42e6d745 1039 safi = SAFI_MPLS_LABELED_VPN;
718e3744 1040
1041 s = stream_new (BGP_MAX_PACKET_SIZE);
1042
1043 /* Make BGP update packet. */
1044 bgp_packet_set_marker (s, BGP_MSG_CAPABILITY);
1045
1046 /* Encode MP_EXT capability. */
1047 if (capability_code == CAPABILITY_CODE_MP)
1048 {
1049 stream_putc (s, action);
1050 stream_putc (s, CAPABILITY_CODE_MP);
1051 stream_putc (s, CAPABILITY_CODE_MP_LEN);
1052 stream_putw (s, afi);
1053 stream_putc (s, 0);
1054 stream_putc (s, safi);
1055
1056 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1057 zlog_debug ("%s sending CAPABILITY has %s MP_EXT CAP for afi/safi: %d/%d",
718e3744 1058 peer->host, action == CAPABILITY_ACTION_SET ?
1059 "Advertising" : "Removing", afi, safi);
1060 }
1061
718e3744 1062 /* Set packet size. */
1063 length = bgp_packet_set_size (s);
1064
1065 /* Make real packet. */
e83e2080 1066 packet = stream_dup (s);
718e3744 1067 stream_free (s);
1068
1069 /* Add packet to the peer. */
1070 bgp_packet_add (peer, packet);
1071
1072 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1073 zlog_debug ("%s send message type %d, length (incl. header) %d",
718e3744 1074 peer->host, BGP_MSG_CAPABILITY, length);
1075
eb821189 1076 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
718e3744 1077}
1078\f
1079/* RFC1771 6.8 Connection collision detection. */
94f2b392 1080static int
eb821189 1081bgp_collision_detect (struct peer *new, struct in_addr remote_id)
718e3744 1082{
eb821189 1083 struct peer *peer;
1eb8ef25 1084 struct listnode *node, *nnode;
718e3744 1085 struct bgp *bgp;
1086
1087 bgp = bgp_get_default ();
1088 if (! bgp)
1089 return 0;
1090
1091 /* Upon receipt of an OPEN message, the local system must examine
1092 all of its connections that are in the OpenConfirm state. A BGP
1093 speaker may also examine connections in an OpenSent state if it
1094 knows the BGP Identifier of the peer by means outside of the
1095 protocol. If among these connections there is a connection to a
1096 remote BGP speaker whose BGP Identifier equals the one in the
1097 OPEN message, then the local system performs the following
1098 collision resolution procedure: */
1099
1eb8ef25 1100 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
718e3744 1101 {
1102 /* Under OpenConfirm status, local peer structure already hold
1103 remote router ID. */
eb821189 1104
1105 if (peer != new
1106 && (peer->status == OpenConfirm || peer->status == OpenSent)
1107 && sockunion_same (&peer->su, &new->su))
1108 {
718e3744 1109 /* 1. The BGP Identifier of the local system is compared to
1110 the BGP Identifier of the remote system (as specified in
1111 the OPEN message). */
1112
1113 if (ntohl (peer->local_id.s_addr) < ntohl (remote_id.s_addr))
1114 {
1115 /* 2. If the value of the local BGP Identifier is less
1116 than the remote one, the local system closes BGP
1117 connection that already exists (the one that is
1118 already in the OpenConfirm state), and accepts BGP
1119 connection initiated by the remote system. */
1120
eb821189 1121 if (peer->fd >= 0)
e0701b79 1122 bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
718e3744 1123 return 1;
1124 }
1125 else
1126 {
1127 /* 3. Otherwise, the local system closes newly created
1128 BGP connection (the one associated with the newly
1129 received OPEN message), and continues to use the
1130 existing one (the one that is already in the
1131 OpenConfirm state). */
1132
eb821189 1133 if (new->fd >= 0)
f5ba3874 1134 bgp_notify_send (new, BGP_NOTIFY_CEASE,
1135 BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
718e3744 1136 return -1;
1137 }
eb821189 1138 }
1139 }
718e3744 1140 return 0;
1141}
1142
94f2b392 1143static int
718e3744 1144bgp_open_receive (struct peer *peer, bgp_size_t size)
1145{
1146 int ret;
1147 u_char version;
1148 u_char optlen;
1149 u_int16_t holdtime;
1150 u_int16_t send_holdtime;
1151 as_t remote_as;
0b2aa3a0 1152 as_t as4 = 0;
718e3744 1153 struct peer *realpeer;
1154 struct in_addr remote_id;
1155 int capability;
5228ad27 1156 u_int8_t notify_data_remote_as[2];
1157 u_int8_t notify_data_remote_id[4];
718e3744 1158
1159 realpeer = NULL;
1160
1161 /* Parse open packet. */
1162 version = stream_getc (peer->ibuf);
1163 memcpy (notify_data_remote_as, stream_pnt (peer->ibuf), 2);
1164 remote_as = stream_getw (peer->ibuf);
1165 holdtime = stream_getw (peer->ibuf);
1166 memcpy (notify_data_remote_id, stream_pnt (peer->ibuf), 4);
1167 remote_id.s_addr = stream_get_ipv4 (peer->ibuf);
1168
1169 /* Receive OPEN message log */
1170 if (BGP_DEBUG (normal, NORMAL))
aea339f7 1171 zlog_debug ("%s rcv OPEN, version %d, remote-as (in open) %u,"
0b2aa3a0
PJ
1172 " holdtime %d, id %s",
1173 peer->host, version, remote_as, holdtime,
1174 inet_ntoa (remote_id));
1175
1176 /* BEGIN to read the capability here, but dont do it yet */
1177 capability = 0;
1178 optlen = stream_getc (peer->ibuf);
1179
1180 if (optlen != 0)
1181 {
1182 /* We need the as4 capability value *right now* because
1183 * if it is there, we have not got the remote_as yet, and without
1184 * that we do not know which peer is connecting to us now.
1185 */
1186 as4 = peek_for_as4_capability (peer, optlen);
1187 }
1188
1189 /* Just in case we have a silly peer who sends AS4 capability set to 0 */
1190 if (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV) && !as4)
1191 {
1192 zlog_err ("%s bad OPEN, got AS4 capability, but AS4 set to 0",
1193 peer->host);
1194 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR,
1195 BGP_NOTIFY_OPEN_BAD_PEER_AS);
1196 return -1;
1197 }
1198
1199 if (remote_as == BGP_AS_TRANS)
1200 {
1201 /* Take the AS4 from the capability. We must have received the
1202 * capability now! Otherwise we have a asn16 peer who uses
1203 * BGP_AS_TRANS, for some unknown reason.
1204 */
1205 if (as4 == BGP_AS_TRANS)
1206 {
1207 zlog_err ("%s [AS4] NEW speaker using AS_TRANS for AS4, not allowed",
1208 peer->host);
1209 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR,
1210 BGP_NOTIFY_OPEN_BAD_PEER_AS);
1211 return -1;
1212 }
1213
1214 if (!as4 && BGP_DEBUG (as4, AS4))
1215 zlog_debug ("%s [AS4] OPEN remote_as is AS_TRANS, but no AS4."
1216 " Odd, but proceeding.", peer->host);
1217 else if (as4 < BGP_AS_MAX && BGP_DEBUG (as4, AS4))
0df7c91f 1218 zlog_debug ("%s [AS4] OPEN remote_as is AS_TRANS, but AS4 (%u) fits "
0b2aa3a0
PJ
1219 "in 2-bytes, very odd peer.", peer->host, as4);
1220 if (as4)
1221 remote_as = as4;
1222 }
1223 else
1224 {
1225 /* We may have a partner with AS4 who has an asno < BGP_AS_MAX */
1226 /* If we have got the capability, peer->as4cap must match remote_as */
1227 if (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV)
1228 && as4 != remote_as)
1229 {
1230 /* raise error, log this, close session */
1231 zlog_err ("%s bad OPEN, got AS4 capability, but remote_as %u"
1232 " mismatch with 16bit 'myasn' %u in open",
1233 peer->host, as4, remote_as);
1234 bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR,
1235 BGP_NOTIFY_OPEN_BAD_PEER_AS);
1236 return -1;
1237 }
1238 }
1239
718e3744 1240 /* Lookup peer from Open packet. */
1241 if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1242 {
1243 int as = 0;
1244
1245 realpeer = peer_lookup_with_open (&peer->su, remote_as, &remote_id, &as);
1246
1247 if (! realpeer)
1248 {
1249 /* Peer's source IP address is check in bgp_accept(), so this
1250 must be AS number mismatch or remote-id configuration
1251 mismatch. */
1252 if (as)
1253 {
1254 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1255 zlog_debug ("%s bad OPEN, wrong router identifier %s",
1256 peer->host, inet_ntoa (remote_id));
1257 bgp_notify_send_with_data (peer, BGP_NOTIFY_OPEN_ERR,
1258 BGP_NOTIFY_OPEN_BAD_BGP_IDENT,
1259 notify_data_remote_id, 4);
718e3744 1260 }
1261 else
1262 {
1263 if (BGP_DEBUG (normal, NORMAL))
aea339f7 1264 zlog_debug ("%s bad OPEN, remote AS is %u, expected %u",
6b51474d 1265 peer->host, remote_as, peer->as);
1266 bgp_notify_send_with_data (peer, BGP_NOTIFY_OPEN_ERR,
1267 BGP_NOTIFY_OPEN_BAD_PEER_AS,
1268 notify_data_remote_as, 2);
718e3744 1269 }
1270 return -1;
1271 }
1272 }
1273
1274 /* When collision is detected and this peer is closed. Retrun
1275 immidiately. */
1276 ret = bgp_collision_detect (peer, remote_id);
1277 if (ret < 0)
1278 return ret;
1279
eb821189 1280 /* Hack part. */
1281 if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1282 {
93406d87 1283 if (realpeer->status == Established
1284 && CHECK_FLAG (realpeer->sflags, PEER_STATUS_NSF_MODE))
1285 {
1286 realpeer->last_reset = PEER_DOWN_NSF_CLOSE_SESSION;
1287 SET_FLAG (realpeer->sflags, PEER_STATUS_NSF_WAIT);
1288 }
1289 else if (ret == 0 && realpeer->status != Active
1290 && realpeer->status != OpenSent
6e199263
PJ
1291 && realpeer->status != OpenConfirm
1292 && realpeer->status != Connect)
eb821189 1293 {
2b2fc560
PJ
1294 /* XXX: This is an awful problem..
1295 *
1296 * According to the RFC we should just let this connection (of the
1297 * accepted 'peer') continue on to Established if the other
1298 * connection (the 'realpeer' one) is in state Connect, and deal
1299 * with the more larval FSM as/when it gets far enough to receive
1300 * an Open. We don't do that though, we instead close the (more
1301 * developed) accepted connection.
1302 *
1303 * This means there's a race, which if hit, can loop:
1304 *
1305 * FSM for A FSM for B
1306 * realpeer accept-peer realpeer accept-peer
1307 *
1308 * Connect Connect
1309 * Active
1310 * OpenSent OpenSent
1311 * <arrive here,
1312 * Notify, delete>
1313 * Idle Active
1314 * OpenSent OpenSent
1315 * <arrive here,
1316 * Notify, delete>
1317 * Idle
1318 * <wait> <wait>
1319 * Connect Connect
1320 *
1321 *
1322 * If both sides are Quagga, they're almost certain to wait for
1323 * the same amount of time of course (which doesn't preclude other
1324 * implementations also waiting for same time). The race is
1325 * exacerbated by high-latency (in bgpd and/or the network).
1326 *
1327 * The reason we do this is because our FSM is tied to our peer
1328 * structure, which carries our configuration information, etc.
1329 * I.e. we can't let the accepted-peer FSM continue on as it is,
1330 * cause it's not associated with any actual peer configuration -
1331 * it's just a dummy.
1332 *
1333 * It's possible we could hack-fix this by just bgp_stop'ing the
1334 * realpeer and continueing on with the 'transfer FSM' below.
1335 * Ideally, we need to seperate FSMs from struct peer.
1336 *
1337 * Setting one side to passive avoids the race, as a workaround.
1338 */
eb821189 1339 if (BGP_DEBUG (events, EVENTS))
93406d87 1340 zlog_debug ("%s peer status is %s close connection",
1341 realpeer->host, LOOKUP (bgp_status_msg,
1342 realpeer->status));
1343 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1344 BGP_NOTIFY_CEASE_CONNECT_REJECT);
1345
eb821189 1346 return -1;
1347 }
1348
1349 if (BGP_DEBUG (events, EVENTS))
6e199263
PJ
1350 zlog_debug ("%s [Event] Transfer accept BGP peer to real (state %s)",
1351 peer->host,
1352 LOOKUP (bgp_status_msg, realpeer->status));
eb821189 1353
1354 bgp_stop (realpeer);
1355
1356 /* Transfer file descriptor. */
1357 realpeer->fd = peer->fd;
1358 peer->fd = -1;
1359
1360 /* Transfer input buffer. */
1361 stream_free (realpeer->ibuf);
1362 realpeer->ibuf = peer->ibuf;
1363 realpeer->packet_size = peer->packet_size;
1364 peer->ibuf = NULL;
1365
1366 /* Transfer status. */
1367 realpeer->status = peer->status;
1368 bgp_stop (peer);
200df115 1369
eb821189 1370 /* peer pointer change. Open packet send to neighbor. */
1371 peer = realpeer;
1372 bgp_open_send (peer);
1373 if (peer->fd < 0)
1374 {
1375 zlog_err ("bgp_open_receive peer's fd is negative value %d",
1376 peer->fd);
1377 return -1;
1378 }
1379 BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
1380 }
1381
718e3744 1382 /* remote router-id check. */
1383 if (remote_id.s_addr == 0
733cd9e5 1384 || IPV4_CLASS_DE (ntohl (remote_id.s_addr))
718e3744 1385 || ntohl (peer->local_id.s_addr) == ntohl (remote_id.s_addr))
1386 {
1387 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1388 zlog_debug ("%s bad OPEN, wrong router identifier %s",
718e3744 1389 peer->host, inet_ntoa (remote_id));
1390 bgp_notify_send_with_data (peer,
1391 BGP_NOTIFY_OPEN_ERR,
1392 BGP_NOTIFY_OPEN_BAD_BGP_IDENT,
1393 notify_data_remote_id, 4);
1394 return -1;
1395 }
1396
1397 /* Set remote router-id */
1398 peer->remote_id = remote_id;
1399
1400 /* Peer BGP version check. */
1401 if (version != BGP_VERSION_4)
1402 {
5228ad27 1403 u_int8_t maxver = BGP_VERSION_4;
718e3744 1404 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1405 zlog_debug ("%s bad protocol version, remote requested %d, local request %d",
718e3744 1406 peer->host, version, BGP_VERSION_4);
1407 bgp_notify_send_with_data (peer,
1408 BGP_NOTIFY_OPEN_ERR,
1409 BGP_NOTIFY_OPEN_UNSUP_VERSION,
5228ad27 1410 &maxver, 1);
718e3744 1411 return -1;
1412 }
1413
1414 /* Check neighbor as number. */
1415 if (remote_as != peer->as)
1416 {
1417 if (BGP_DEBUG (normal, NORMAL))
aea339f7 1418 zlog_debug ("%s bad OPEN, remote AS is %u, expected %u",
718e3744 1419 peer->host, remote_as, peer->as);
1420 bgp_notify_send_with_data (peer,
1421 BGP_NOTIFY_OPEN_ERR,
1422 BGP_NOTIFY_OPEN_BAD_PEER_AS,
1423 notify_data_remote_as, 2);
1424 return -1;
1425 }
1426
1427 /* From the rfc: Upon receipt of an OPEN message, a BGP speaker MUST
1428 calculate the value of the Hold Timer by using the smaller of its
1429 configured Hold Time and the Hold Time received in the OPEN message.
1430 The Hold Time MUST be either zero or at least three seconds. An
1431 implementation may reject connections on the basis of the Hold Time. */
1432
1433 if (holdtime < 3 && holdtime != 0)
1434 {
1435 bgp_notify_send (peer,
1436 BGP_NOTIFY_OPEN_ERR,
1437 BGP_NOTIFY_OPEN_UNACEP_HOLDTIME);
1438 return -1;
1439 }
1440
1441 /* From the rfc: A reasonable maximum time between KEEPALIVE messages
1442 would be one third of the Hold Time interval. KEEPALIVE messages
1443 MUST NOT be sent more frequently than one per second. An
1444 implementation MAY adjust the rate at which it sends KEEPALIVE
1445 messages as a function of the Hold Time interval. */
1446
1447 if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
1448 send_holdtime = peer->holdtime;
1449 else
1450 send_holdtime = peer->bgp->default_holdtime;
1451
1452 if (holdtime < send_holdtime)
1453 peer->v_holdtime = holdtime;
1454 else
1455 peer->v_holdtime = send_holdtime;
1456
1457 peer->v_keepalive = peer->v_holdtime / 3;
1458
1459 /* Open option part parse. */
718e3744 1460 if (optlen != 0)
1461 {
5861739f
PJ
1462 if ((ret = bgp_open_option_parse (peer, optlen, &capability)) < 0)
1463 {
1464 bgp_notify_send (peer,
1465 BGP_NOTIFY_OPEN_ERR,
1466 BGP_NOTIFY_OPEN_UNACEP_HOLDTIME);
1467 return ret;
1468 }
718e3744 1469 }
1470 else
1471 {
1472 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1473 zlog_debug ("%s rcvd OPEN w/ OPTION parameter len: 0",
718e3744 1474 peer->host);
1475 }
1476
1477 /* Override capability. */
1478 if (! capability || CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
1479 {
1480 peer->afc_nego[AFI_IP][SAFI_UNICAST] = peer->afc[AFI_IP][SAFI_UNICAST];
1481 peer->afc_nego[AFI_IP][SAFI_MULTICAST] = peer->afc[AFI_IP][SAFI_MULTICAST];
1482 peer->afc_nego[AFI_IP6][SAFI_UNICAST] = peer->afc[AFI_IP6][SAFI_UNICAST];
1483 peer->afc_nego[AFI_IP6][SAFI_MULTICAST] = peer->afc[AFI_IP6][SAFI_MULTICAST];
1484 }
1485
1486 /* Get sockname. */
1487 bgp_getsockname (peer);
1488
1489 BGP_EVENT_ADD (peer, Receive_OPEN_message);
1490
1491 peer->packet_size = 0;
1492 if (peer->ibuf)
1493 stream_reset (peer->ibuf);
1494
1495 return 0;
1496}
1497
1498/* Parse BGP Update packet and make attribute object. */
94f2b392 1499static int
718e3744 1500bgp_update_receive (struct peer *peer, bgp_size_t size)
1501{
1502 int ret;
1503 u_char *end;
1504 struct stream *s;
1505 struct attr attr;
1506 bgp_size_t attribute_len;
1507 bgp_size_t update_len;
1508 bgp_size_t withdraw_len;
1509 struct bgp_nlri update;
1510 struct bgp_nlri withdraw;
1511 struct bgp_nlri mp_update;
1512 struct bgp_nlri mp_withdraw;
e01f9cbb 1513 char attrstr[BUFSIZ] = "";
718e3744 1514
1515 /* Status must be Established. */
1516 if (peer->status != Established)
1517 {
1518 zlog_err ("%s [FSM] Update packet received under status %s",
1519 peer->host, LOOKUP (bgp_status_msg, peer->status));
1520 bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
1521 return -1;
1522 }
1523
1524 /* Set initial values. */
1525 memset (&attr, 0, sizeof (struct attr));
1526 memset (&update, 0, sizeof (struct bgp_nlri));
1527 memset (&withdraw, 0, sizeof (struct bgp_nlri));
1528 memset (&mp_update, 0, sizeof (struct bgp_nlri));
1529 memset (&mp_withdraw, 0, sizeof (struct bgp_nlri));
1530
1531 s = peer->ibuf;
1532 end = stream_pnt (s) + size;
1533
1534 /* RFC1771 6.3 If the Unfeasible Routes Length or Total Attribute
1535 Length is too large (i.e., if Unfeasible Routes Length + Total
1536 Attribute Length + 23 exceeds the message Length), then the Error
1537 Subcode is set to Malformed Attribute List. */
1538 if (stream_pnt (s) + 2 > end)
1539 {
1540 zlog_err ("%s [Error] Update packet error"
1541 " (packet length is short for unfeasible length)",
1542 peer->host);
1543 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1544 BGP_NOTIFY_UPDATE_MAL_ATTR);
1545 return -1;
1546 }
1547
1548 /* Unfeasible Route Length. */
1549 withdraw_len = stream_getw (s);
1550
1551 /* Unfeasible Route Length check. */
1552 if (stream_pnt (s) + withdraw_len > end)
1553 {
1554 zlog_err ("%s [Error] Update packet error"
1555 " (packet unfeasible length overflow %d)",
1556 peer->host, withdraw_len);
1557 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1558 BGP_NOTIFY_UPDATE_MAL_ATTR);
1559 return -1;
1560 }
1561
1562 /* Unfeasible Route packet format check. */
1563 if (withdraw_len > 0)
1564 {
1565 ret = bgp_nlri_sanity_check (peer, AFI_IP, stream_pnt (s), withdraw_len);
1566 if (ret < 0)
1567 return -1;
1568
1569 if (BGP_DEBUG (packet, PACKET_RECV))
6b51474d 1570 zlog_debug ("%s [Update:RECV] Unfeasible NLRI received", peer->host);
718e3744 1571
1572 withdraw.afi = AFI_IP;
1573 withdraw.safi = SAFI_UNICAST;
1574 withdraw.nlri = stream_pnt (s);
1575 withdraw.length = withdraw_len;
9985f83c 1576 stream_forward_getp (s, withdraw_len);
718e3744 1577 }
1578
1579 /* Attribute total length check. */
1580 if (stream_pnt (s) + 2 > end)
1581 {
1582 zlog_warn ("%s [Error] Packet Error"
1583 " (update packet is short for attribute length)",
1584 peer->host);
1585 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1586 BGP_NOTIFY_UPDATE_MAL_ATTR);
1587 return -1;
1588 }
1589
1590 /* Fetch attribute total length. */
1591 attribute_len = stream_getw (s);
1592
1593 /* Attribute length check. */
1594 if (stream_pnt (s) + attribute_len > end)
1595 {
1596 zlog_warn ("%s [Error] Packet Error"
1597 " (update packet attribute length overflow %d)",
1598 peer->host, attribute_len);
1599 bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
1600 BGP_NOTIFY_UPDATE_MAL_ATTR);
1601 return -1;
1602 }
b881c707
PJ
1603
1604 /* Certain attribute parsing errors should not be considered bad enough
1605 * to reset the session for, most particularly any partial/optional
1606 * attributes that have 'tunneled' over speakers that don't understand
1607 * them. Instead we withdraw only the prefix concerned.
1608 *
1609 * Complicates the flow a little though..
1610 */
1611 bgp_attr_parse_ret_t attr_parse_ret = BGP_ATTR_PARSE_PROCEED;
1612 /* This define morphs the update case into a withdraw when lower levels
1613 * have signalled an error condition where this is best.
1614 */
1615#define NLRI_ATTR_ARG (attr_parse_ret != BGP_ATTR_PARSE_WITHDRAW ? &attr : NULL)
718e3744 1616
1617 /* Parse attribute when it exists. */
1618 if (attribute_len)
1619 {
b881c707 1620 attr_parse_ret = bgp_attr_parse (peer, &attr, attribute_len,
718e3744 1621 &mp_update, &mp_withdraw);
b881c707 1622 if (attr_parse_ret == BGP_ATTR_PARSE_ERROR)
718e3744 1623 return -1;
1624 }
b881c707 1625
718e3744 1626 /* Logging the attribute. */
b881c707
PJ
1627 if (attr_parse_ret == BGP_ATTR_PARSE_WITHDRAW
1628 || BGP_DEBUG (update, UPDATE_IN))
718e3744 1629 {
e01f9cbb 1630 ret= bgp_dump_attr (peer, &attr, attrstr, BUFSIZ);
b881c707
PJ
1631 int lvl = (attr_parse_ret == BGP_ATTR_PARSE_WITHDRAW)
1632 ? LOG_ERR : LOG_DEBUG;
1633
1634 if (attr_parse_ret == BGP_ATTR_PARSE_WITHDRAW)
1635 zlog (peer->log, LOG_ERR,
1636 "%s rcvd UPDATE with errors in attr(s)!! Withdrawing route.",
1637 peer->host);
e01f9cbb 1638
1639 if (ret)
b881c707 1640 zlog (peer->log, lvl, "%s rcvd UPDATE w/ attr: %s",
e01f9cbb 1641 peer->host, attrstr);
718e3744 1642 }
b881c707 1643
718e3744 1644 /* Network Layer Reachability Information. */
1645 update_len = end - stream_pnt (s);
1646
1647 if (update_len)
1648 {
1649 /* Check NLRI packet format and prefix length. */
1650 ret = bgp_nlri_sanity_check (peer, AFI_IP, stream_pnt (s), update_len);
1651 if (ret < 0)
b881c707
PJ
1652 {
1653 bgp_attr_unintern_sub (&attr);
1654 if (attr.extra)
1655 bgp_attr_extra_free (&attr);
1656 return -1;
1657 }
718e3744 1658
1659 /* Set NLRI portion to structure. */
1660 update.afi = AFI_IP;
1661 update.safi = SAFI_UNICAST;
1662 update.nlri = stream_pnt (s);
1663 update.length = update_len;
9985f83c 1664 stream_forward_getp (s, update_len);
718e3744 1665 }
1666
1667 /* NLRI is processed only when the peer is configured specific
1668 Address Family and Subsequent Address Family. */
1669 if (peer->afc[AFI_IP][SAFI_UNICAST])
1670 {
1671 if (withdraw.length)
1672 bgp_nlri_parse (peer, NULL, &withdraw);
1673
1674 if (update.length)
1675 {
1676 /* We check well-known attribute only for IPv4 unicast
1677 update. */
1678 ret = bgp_attr_check (peer, &attr);
1679 if (ret < 0)
b881c707
PJ
1680 {
1681 bgp_attr_unintern_sub (&attr);
1682 if (attr.extra)
1683 bgp_attr_extra_free (&attr);
1684 return -1;
1685 }
718e3744 1686
b881c707 1687 bgp_nlri_parse (peer, NLRI_ATTR_ARG, &update);
718e3744 1688 }
e01f9cbb 1689
f418446b 1690 if (mp_update.length
1691 && mp_update.afi == AFI_IP
1692 && mp_update.safi == SAFI_UNICAST)
b881c707 1693 bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
f418446b 1694
1695 if (mp_withdraw.length
1696 && mp_withdraw.afi == AFI_IP
1697 && mp_withdraw.safi == SAFI_UNICAST)
1698 bgp_nlri_parse (peer, NULL, &mp_withdraw);
1699
e01f9cbb 1700 if (! attribute_len && ! withdraw_len)
1701 {
1702 /* End-of-RIB received */
93406d87 1703 SET_FLAG (peer->af_sflags[AFI_IP][SAFI_UNICAST],
1704 PEER_STATUS_EOR_RECEIVED);
e01f9cbb 1705
93406d87 1706 /* NSF delete stale route */
1707 if (peer->nsf[AFI_IP][SAFI_UNICAST])
1708 bgp_clear_stale_route (peer, AFI_IP, SAFI_UNICAST);
1709
1710 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1711 zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv4 Unicast from %s",
e01f9cbb 1712 peer->host);
1713 }
718e3744 1714 }
1715 if (peer->afc[AFI_IP][SAFI_MULTICAST])
1716 {
1717 if (mp_update.length
1718 && mp_update.afi == AFI_IP
1719 && mp_update.safi == SAFI_MULTICAST)
b881c707 1720 bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
718e3744 1721
1722 if (mp_withdraw.length
1723 && mp_withdraw.afi == AFI_IP
1724 && mp_withdraw.safi == SAFI_MULTICAST)
1725 bgp_nlri_parse (peer, NULL, &mp_withdraw);
e01f9cbb 1726
93406d87 1727 if (! withdraw_len
e01f9cbb 1728 && mp_withdraw.afi == AFI_IP
1729 && mp_withdraw.safi == SAFI_MULTICAST
1730 && mp_withdraw.length == 0)
1731 {
1732 /* End-of-RIB received */
93406d87 1733 SET_FLAG (peer->af_sflags[AFI_IP][SAFI_MULTICAST],
1734 PEER_STATUS_EOR_RECEIVED);
e01f9cbb 1735
93406d87 1736 /* NSF delete stale route */
1737 if (peer->nsf[AFI_IP][SAFI_MULTICAST])
1738 bgp_clear_stale_route (peer, AFI_IP, SAFI_MULTICAST);
1739
1740 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1741 zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv4 Multicast from %s",
e01f9cbb 1742 peer->host);
1743 }
718e3744 1744 }
1745 if (peer->afc[AFI_IP6][SAFI_UNICAST])
1746 {
1747 if (mp_update.length
1748 && mp_update.afi == AFI_IP6
1749 && mp_update.safi == SAFI_UNICAST)
b881c707 1750 bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
718e3744 1751
1752 if (mp_withdraw.length
1753 && mp_withdraw.afi == AFI_IP6
1754 && mp_withdraw.safi == SAFI_UNICAST)
1755 bgp_nlri_parse (peer, NULL, &mp_withdraw);
e01f9cbb 1756
93406d87 1757 if (! withdraw_len
e01f9cbb 1758 && mp_withdraw.afi == AFI_IP6
1759 && mp_withdraw.safi == SAFI_UNICAST
1760 && mp_withdraw.length == 0)
1761 {
1762 /* End-of-RIB received */
93406d87 1763 SET_FLAG (peer->af_sflags[AFI_IP6][SAFI_UNICAST], PEER_STATUS_EOR_RECEIVED);
e01f9cbb 1764
93406d87 1765 /* NSF delete stale route */
1766 if (peer->nsf[AFI_IP6][SAFI_UNICAST])
1767 bgp_clear_stale_route (peer, AFI_IP6, SAFI_UNICAST);
1768
1769 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1770 zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv6 Unicast from %s",
e01f9cbb 1771 peer->host);
1772 }
718e3744 1773 }
1774 if (peer->afc[AFI_IP6][SAFI_MULTICAST])
1775 {
1776 if (mp_update.length
1777 && mp_update.afi == AFI_IP6
1778 && mp_update.safi == SAFI_MULTICAST)
b881c707 1779 bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
718e3744 1780
1781 if (mp_withdraw.length
1782 && mp_withdraw.afi == AFI_IP6
1783 && mp_withdraw.safi == SAFI_MULTICAST)
1784 bgp_nlri_parse (peer, NULL, &mp_withdraw);
e01f9cbb 1785
93406d87 1786 if (! withdraw_len
e01f9cbb 1787 && mp_withdraw.afi == AFI_IP6
1788 && mp_withdraw.safi == SAFI_MULTICAST
1789 && mp_withdraw.length == 0)
1790 {
1791 /* End-of-RIB received */
1792
93406d87 1793 /* NSF delete stale route */
1794 if (peer->nsf[AFI_IP6][SAFI_MULTICAST])
1795 bgp_clear_stale_route (peer, AFI_IP6, SAFI_MULTICAST);
1796
e01f9cbb 1797 if (BGP_DEBUG (update, UPDATE_IN))
6b51474d 1798 zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv6 Multicast from %s",
e01f9cbb 1799 peer->host);
1800 }
718e3744 1801 }
1802 if (peer->afc[AFI_IP][SAFI_MPLS_VPN])
1803 {
1804 if (mp_update.length
1805 && mp_update.afi == AFI_IP
42e6d745 1806 && mp_update.safi == SAFI_MPLS_LABELED_VPN)
b881c707 1807 bgp_nlri_parse_vpnv4 (peer, NLRI_ATTR_ARG, &mp_update);
718e3744 1808
1809 if (mp_withdraw.length
1810 && mp_withdraw.afi == AFI_IP
42e6d745 1811 && mp_withdraw.safi == SAFI_MPLS_LABELED_VPN)
718e3744 1812 bgp_nlri_parse_vpnv4 (peer, NULL, &mp_withdraw);
e01f9cbb 1813
93406d87 1814 if (! withdraw_len
e01f9cbb 1815 && mp_withdraw.afi == AFI_IP
42e6d745 1816 && mp_withdraw.safi == SAFI_MPLS_LABELED_VPN
e01f9cbb 1817 && mp_withdraw.length == 0)
1818 {
1819 /* End-of-RIB received */
1820
1821 if (BGP_DEBUG (update, UPDATE_IN))
6b51474d 1822 zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for VPNv4 Unicast from %s",
e01f9cbb 1823 peer->host);
1824 }
718e3744 1825 }
1826
1827 /* Everything is done. We unintern temporary structures which
1828 interned in bgp_attr_parse(). */
b881c707 1829 bgp_attr_unintern_sub (&attr);
fb982c25 1830 if (attr.extra)
b881c707
PJ
1831 bgp_attr_extra_free (&attr);
1832
718e3744 1833 /* If peering is stopped due to some reason, do not generate BGP
1834 event. */
1835 if (peer->status != Established)
1836 return 0;
1837
1838 /* Increment packet counter. */
1839 peer->update_in++;
65957886 1840 peer->update_time = bgp_clock ();
718e3744 1841
1842 /* Generate BGP event. */
1843 BGP_EVENT_ADD (peer, Receive_UPDATE_message);
1844
1845 return 0;
1846}
1847
1848/* Notify message treatment function. */
94f2b392 1849static void
718e3744 1850bgp_notify_receive (struct peer *peer, bgp_size_t size)
1851{
1852 struct bgp_notify bgp_notify;
1853
1854 if (peer->notify.data)
1855 {
1856 XFREE (MTYPE_TMP, peer->notify.data);
1857 peer->notify.data = NULL;
1858 peer->notify.length = 0;
1859 }
1860
1861 bgp_notify.code = stream_getc (peer->ibuf);
1862 bgp_notify.subcode = stream_getc (peer->ibuf);
1863 bgp_notify.length = size - 2;
1864 bgp_notify.data = NULL;
1865
1866 /* Preserv notify code and sub code. */
1867 peer->notify.code = bgp_notify.code;
1868 peer->notify.subcode = bgp_notify.subcode;
1869 /* For further diagnostic record returned Data. */
1870 if (bgp_notify.length)
1871 {
1872 peer->notify.length = size - 2;
1873 peer->notify.data = XMALLOC (MTYPE_TMP, size - 2);
1874 memcpy (peer->notify.data, stream_pnt (peer->ibuf), size - 2);
1875 }
1876
1877 /* For debug */
1878 {
1879 int i;
1880 int first = 0;
1881 char c[4];
1882
1883 if (bgp_notify.length)
1884 {
1885 bgp_notify.data = XMALLOC (MTYPE_TMP, bgp_notify.length * 3);
1886 for (i = 0; i < bgp_notify.length; i++)
1887 if (first)
1888 {
1889 sprintf (c, " %02x", stream_getc (peer->ibuf));
1890 strcat (bgp_notify.data, c);
1891 }
1892 else
1893 {
1894 first = 1;
1895 sprintf (c, "%02x", stream_getc (peer->ibuf));
1896 strcpy (bgp_notify.data, c);
1897 }
1898 }
1899
1900 bgp_notify_print(peer, &bgp_notify, "received");
1901 if (bgp_notify.data)
1902 XFREE (MTYPE_TMP, bgp_notify.data);
1903 }
1904
1905 /* peer count update */
1906 peer->notify_in++;
1907
e0701b79 1908 if (peer->status == Established)
1909 peer->last_reset = PEER_DOWN_NOTIFY_RECEIVED;
1910
718e3744 1911 /* We have to check for Notify with Unsupported Optional Parameter.
1912 in that case we fallback to open without the capability option.
1913 But this done in bgp_stop. We just mark it here to avoid changing
1914 the fsm tables. */
1915 if (bgp_notify.code == BGP_NOTIFY_OPEN_ERR &&
1916 bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_PARAM )
1917 UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
1918
718e3744 1919 BGP_EVENT_ADD (peer, Receive_NOTIFICATION_message);
1920}
1921
1922/* Keepalive treatment function -- get keepalive send keepalive */
94f2b392 1923static void
718e3744 1924bgp_keepalive_receive (struct peer *peer, bgp_size_t size)
1925{
1926 if (BGP_DEBUG (keepalive, KEEPALIVE))
6b51474d 1927 zlog_debug ("%s KEEPALIVE rcvd", peer->host);
718e3744 1928
1929 BGP_EVENT_ADD (peer, Receive_KEEPALIVE_message);
1930}
1931
1932/* Route refresh message is received. */
94f2b392 1933static void
718e3744 1934bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
1935{
1936 afi_t afi;
1937 safi_t safi;
1938 u_char reserved;
1939 struct stream *s;
1940
1941 /* If peer does not have the capability, send notification. */
1942 if (! CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_ADV))
1943 {
1944 plog_err (peer->log, "%s [Error] BGP route refresh is not enabled",
1945 peer->host);
1946 bgp_notify_send (peer,
1947 BGP_NOTIFY_HEADER_ERR,
1948 BGP_NOTIFY_HEADER_BAD_MESTYPE);
1949 return;
1950 }
1951
1952 /* Status must be Established. */
1953 if (peer->status != Established)
1954 {
1955 plog_err (peer->log,
1956 "%s [Error] Route refresh packet received under status %s",
1957 peer->host, LOOKUP (bgp_status_msg, peer->status));
1958 bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
1959 return;
1960 }
1961
1962 s = peer->ibuf;
1963
1964 /* Parse packet. */
1965 afi = stream_getw (s);
1966 reserved = stream_getc (s);
1967 safi = stream_getc (s);
1968
1969 if (BGP_DEBUG (normal, NORMAL))
6b51474d 1970 zlog_debug ("%s rcvd REFRESH_REQ for afi/safi: %d/%d",
718e3744 1971 peer->host, afi, safi);
1972
1973 /* Check AFI and SAFI. */
1974 if ((afi != AFI_IP && afi != AFI_IP6)
1975 || (safi != SAFI_UNICAST && safi != SAFI_MULTICAST
42e6d745 1976 && safi != SAFI_MPLS_LABELED_VPN))
718e3744 1977 {
1978 if (BGP_DEBUG (normal, NORMAL))
1979 {
6b51474d 1980 zlog_debug ("%s REFRESH_REQ for unrecognized afi/safi: %d/%d - ignored",
718e3744 1981 peer->host, afi, safi);
1982 }
1983 return;
1984 }
1985
1986 /* Adjust safi code. */
42e6d745 1987 if (safi == SAFI_MPLS_LABELED_VPN)
718e3744 1988 safi = SAFI_MPLS_VPN;
1989
1990 if (size != BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE)
1991 {
1992 u_char *end;
1993 u_char when_to_refresh;
1994 u_char orf_type;
1995 u_int16_t orf_len;
1996
1997 if (size - (BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE) < 5)
1998 {
1999 zlog_info ("%s ORF route refresh length error", peer->host);
2000 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
2001 return;
2002 }
2003
2004 when_to_refresh = stream_getc (s);
2005 end = stream_pnt (s) + (size - 5);
2006
370b64a2 2007 while ((stream_pnt (s) + 2) < end)
718e3744 2008 {
2009 orf_type = stream_getc (s);
2010 orf_len = stream_getw (s);
370b64a2
PJ
2011
2012 /* orf_len in bounds? */
2013 if ((stream_pnt (s) + orf_len) > end)
2014 break; /* XXX: Notify instead?? */
718e3744 2015 if (orf_type == ORF_TYPE_PREFIX
2016 || orf_type == ORF_TYPE_PREFIX_OLD)
2017 {
2018 u_char *p_pnt = stream_pnt (s);
2019 u_char *p_end = stream_pnt (s) + orf_len;
2020 struct orf_prefix orfp;
2021 u_char common = 0;
2022 u_int32_t seq;
2023 int psize;
2024 char name[BUFSIZ];
2025 char buf[BUFSIZ];
2026 int ret;
2027
2028 if (BGP_DEBUG (normal, NORMAL))
2029 {
6b51474d 2030 zlog_debug ("%s rcvd Prefixlist ORF(%d) length %d",
718e3744 2031 peer->host, orf_type, orf_len);
2032 }
2033
370b64a2
PJ
2034 /* we're going to read at least 1 byte of common ORF header,
2035 * and 7 bytes of ORF Address-filter entry from the stream
2036 */
2037 if (orf_len < 7)
2038 break;
2039
718e3744 2040 /* ORF prefix-list name */
2041 sprintf (name, "%s.%d.%d", peer->host, afi, safi);
2042
2043 while (p_pnt < p_end)
2044 {
d64379e8
CH
2045 /* If the ORF entry is malformed, want to read as much of it
2046 * as possible without going beyond the bounds of the entry,
2047 * to maximise debug information.
2048 */
fdbc8e77 2049 int ok;
718e3744 2050 memset (&orfp, 0, sizeof (struct orf_prefix));
2051 common = *p_pnt++;
d64379e8 2052 /* after ++: p_pnt <= p_end */
718e3744 2053 if (common & ORF_COMMON_PART_REMOVE_ALL)
2054 {
2055 if (BGP_DEBUG (normal, NORMAL))
6b51474d 2056 zlog_debug ("%s rcvd Remove-All pfxlist ORF request", peer->host);
718e3744 2057 prefix_bgp_orf_remove_all (name);
2058 break;
2059 }
d64379e8 2060 ok = ((p_end - p_pnt) >= sizeof(u_int32_t)) ;
bb915f5f 2061 if (ok)
d64379e8 2062 {
fdbc8e77
PJ
2063 memcpy (&seq, p_pnt, sizeof (u_int32_t));
2064 p_pnt += sizeof (u_int32_t);
2065 orfp.seq = ntohl (seq);
d64379e8
CH
2066 }
2067 else
2068 p_pnt = p_end ;
2069
2070 if ((ok = (p_pnt < p_end)))
2071 orfp.ge = *p_pnt++ ; /* value checked in prefix_bgp_orf_set() */
2072 if ((ok = (p_pnt < p_end)))
2073 orfp.le = *p_pnt++ ; /* value checked in prefix_bgp_orf_set() */
2074 if ((ok = (p_pnt < p_end)))
2075 orfp.p.prefixlen = *p_pnt++ ;
2076 orfp.p.family = afi2family (afi); /* afi checked already */
2077
2078 psize = PSIZE (orfp.p.prefixlen); /* 0 if not ok */
2079 if (psize > prefix_blen(&orfp.p)) /* valid for family ? */
2080 {
2081 ok = 0 ;
2082 psize = prefix_blen(&orfp.p) ;
2083 }
2084 if (psize > (p_end - p_pnt)) /* valid for packet ? */
2085 {
2086 ok = 0 ;
2087 psize = p_end - p_pnt ;
2088 }
2089
2090 if (psize > 0)
2091 memcpy (&orfp.p.u.prefix, p_pnt, psize);
718e3744 2092 p_pnt += psize;
2093
2094 if (BGP_DEBUG (normal, NORMAL))
d64379e8 2095 zlog_debug ("%s rcvd %s %s seq %u %s/%d ge %d le %d%s",
718e3744 2096 peer->host,
2097 (common & ORF_COMMON_PART_REMOVE ? "Remove" : "Add"),
2098 (common & ORF_COMMON_PART_DENY ? "deny" : "permit"),
2099 orfp.seq,
2100 inet_ntop (orfp.p.family, &orfp.p.u.prefix, buf, BUFSIZ),
d64379e8
CH
2101 orfp.p.prefixlen, orfp.ge, orfp.le,
2102 ok ? "" : " MALFORMED");
fdbc8e77 2103
d64379e8 2104 if (ok)
fdbc8e77
PJ
2105 ret = prefix_bgp_orf_set (name, afi, &orfp,
2106 (common & ORF_COMMON_PART_DENY ? 0 : 1 ),
2107 (common & ORF_COMMON_PART_REMOVE ? 0 : 1));
718e3744 2108
d64379e8 2109 if (!ok || (ret != CMD_SUCCESS))
718e3744 2110 {
2111 if (BGP_DEBUG (normal, NORMAL))
fdbc8e77
PJ
2112 zlog_debug ("%s Received misformatted prefixlist ORF."
2113 " Remove All pfxlist", peer->host);
718e3744 2114 prefix_bgp_orf_remove_all (name);
2115 break;
2116 }
2117 }
2118 peer->orf_plist[afi][safi] =
2119 prefix_list_lookup (AFI_ORF_PREFIX, name);
2120 }
9985f83c 2121 stream_forward_getp (s, orf_len);
718e3744 2122 }
2123 if (BGP_DEBUG (normal, NORMAL))
6b51474d 2124 zlog_debug ("%s rcvd Refresh %s ORF request", peer->host,
718e3744 2125 when_to_refresh == REFRESH_DEFER ? "Defer" : "Immediate");
2126 if (when_to_refresh == REFRESH_DEFER)
2127 return;
2128 }
2129
2130 /* First update is deferred until ORF or ROUTE-REFRESH is received */
2131 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
2132 UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH);
2133
2134 /* Perform route refreshment to the peer */
2135 bgp_announce_route (peer, afi, safi);
2136}
2137
94f2b392 2138static int
718e3744 2139bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length)
2140{
2141 u_char *end;
6d58272b
PJ
2142 struct capability_mp_data mpc;
2143 struct capability_header *hdr;
718e3744 2144 u_char action;
2145 struct bgp *bgp;
2146 afi_t afi;
2147 safi_t safi;
2148
2149 bgp = peer->bgp;
2150 end = pnt + length;
2151
2152 while (pnt < end)
6d58272b 2153 {
718e3744 2154 /* We need at least action, capability code and capability length. */
2155 if (pnt + 3 > end)
2156 {
2157 zlog_info ("%s Capability length error", peer->host);
2158 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
2159 return -1;
2160 }
718e3744 2161 action = *pnt;
6d58272b
PJ
2162 hdr = (struct capability_header *)(pnt + 1);
2163
718e3744 2164 /* Action value check. */
2165 if (action != CAPABILITY_ACTION_SET
2166 && action != CAPABILITY_ACTION_UNSET)
2167 {
2168 zlog_info ("%s Capability Action Value error %d",
2169 peer->host, action);
2170 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
2171 return -1;
2172 }
2173
2174 if (BGP_DEBUG (normal, NORMAL))
6b51474d 2175 zlog_debug ("%s CAPABILITY has action: %d, code: %u, length %u",
6d58272b 2176 peer->host, action, hdr->code, hdr->length);
718e3744 2177
2178 /* Capability length check. */
6d58272b 2179 if ((pnt + hdr->length + 3) > end)
718e3744 2180 {
2181 zlog_info ("%s Capability length error", peer->host);
2182 bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
2183 return -1;
2184 }
2185
6d58272b
PJ
2186 /* Fetch structure to the byte stream. */
2187 memcpy (&mpc, pnt + 3, sizeof (struct capability_mp_data));
2188
718e3744 2189 /* We know MP Capability Code. */
6d58272b 2190 if (hdr->code == CAPABILITY_CODE_MP)
718e3744 2191 {
6d58272b
PJ
2192 afi = ntohs (mpc.afi);
2193 safi = mpc.safi;
718e3744 2194
2195 /* Ignore capability when override-capability is set. */
2196 if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
2197 continue;
6d58272b
PJ
2198
2199 if (!bgp_afi_safi_valid_indices (afi, &safi))
2200 {
2201 if (BGP_DEBUG (normal, NORMAL))
0b2aa3a0
PJ
2202 zlog_debug ("%s Dynamic Capability MP_EXT afi/safi invalid "
2203 "(%u/%u)", peer->host, afi, safi);
6d58272b
PJ
2204 continue;
2205 }
2206
718e3744 2207 /* Address family check. */
6d58272b
PJ
2208 if (BGP_DEBUG (normal, NORMAL))
2209 zlog_debug ("%s CAPABILITY has %s MP_EXT CAP for afi/safi: %u/%u",
2210 peer->host,
2211 action == CAPABILITY_ACTION_SET
2212 ? "Advertising" : "Removing",
2213 ntohs(mpc.afi) , mpc.safi);
2214
2215 if (action == CAPABILITY_ACTION_SET)
2216 {
2217 peer->afc_recv[afi][safi] = 1;
2218 if (peer->afc[afi][safi])
2219 {
2220 peer->afc_nego[afi][safi] = 1;
2221 bgp_announce_route (peer, afi, safi);
2222 }
2223 }
2224 else
2225 {
2226 peer->afc_recv[afi][safi] = 0;
2227 peer->afc_nego[afi][safi] = 0;
2228
2229 if (peer_active_nego (peer))
228da428 2230 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
6d58272b
PJ
2231 else
2232 BGP_EVENT_ADD (peer, BGP_Stop);
2233 }
718e3744 2234 }
718e3744 2235 else
2236 {
2237 zlog_warn ("%s unrecognized capability code: %d - ignored",
6d58272b 2238 peer->host, hdr->code);
718e3744 2239 }
6d58272b 2240 pnt += hdr->length + 3;
718e3744 2241 }
2242 return 0;
2243}
2244
01b7ce2d
PJ
2245/* Dynamic Capability is received.
2246 *
2247 * This is exported for unit-test purposes
2248 */
6d58272b 2249int
718e3744 2250bgp_capability_receive (struct peer *peer, bgp_size_t size)
2251{
2252 u_char *pnt;
718e3744 2253
2254 /* Fetch pointer. */
2255 pnt = stream_pnt (peer->ibuf);
2256
2257 if (BGP_DEBUG (normal, NORMAL))
6b51474d 2258 zlog_debug ("%s rcv CAPABILITY", peer->host);
718e3744 2259
2260 /* If peer does not have the capability, send notification. */
2261 if (! CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV))
2262 {
2263 plog_err (peer->log, "%s [Error] BGP dynamic capability is not enabled",
2264 peer->host);
2265 bgp_notify_send (peer,
2266 BGP_NOTIFY_HEADER_ERR,
2267 BGP_NOTIFY_HEADER_BAD_MESTYPE);
0b2aa3a0 2268 return -1;
718e3744 2269 }
2270
2271 /* Status must be Established. */
2272 if (peer->status != Established)
2273 {
2274 plog_err (peer->log,
2275 "%s [Error] Dynamic capability packet received under status %s", peer->host, LOOKUP (bgp_status_msg, peer->status));
2276 bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
0b2aa3a0 2277 return -1;
718e3744 2278 }
2279
2280 /* Parse packet. */
6d58272b 2281 return bgp_capability_msg_parse (peer, pnt, size);
718e3744 2282}
2283\f
2284/* BGP read utility function. */
94f2b392 2285static int
718e3744 2286bgp_read_packet (struct peer *peer)
2287{
2288 int nbytes;
2289 int readsize;
2290
9985f83c 2291 readsize = peer->packet_size - stream_get_endp (peer->ibuf);
718e3744 2292
2293 /* If size is zero then return. */
2294 if (! readsize)
2295 return 0;
2296
2297 /* Read packet from fd. */
35398589 2298 nbytes = stream_read_try (peer->ibuf, peer->fd, readsize);
718e3744 2299
2300 /* If read byte is smaller than zero then error occured. */
2301 if (nbytes < 0)
2302 {
35398589
SH
2303 /* Transient error should retry */
2304 if (nbytes == -2)
718e3744 2305 return -1;
2306
2307 plog_err (peer->log, "%s [Error] bgp_read_packet error: %s",
6099b3b5 2308 peer->host, safe_strerror (errno));
93406d87 2309
2310 if (peer->status == Established)
2311 {
2312 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_MODE))
2313 {
2314 peer->last_reset = PEER_DOWN_NSF_CLOSE_SESSION;
2315 SET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
2316 }
2317 else
2318 peer->last_reset = PEER_DOWN_CLOSE_SESSION;
2319 }
2320
718e3744 2321 BGP_EVENT_ADD (peer, TCP_fatal_error);
2322 return -1;
2323 }
2324
2325 /* When read byte is zero : clear bgp peer and return */
2326 if (nbytes == 0)
2327 {
2328 if (BGP_DEBUG (events, EVENTS))
6b51474d 2329 plog_debug (peer->log, "%s [Event] BGP connection closed fd %d",
eb821189 2330 peer->host, peer->fd);
e0701b79 2331
2332 if (peer->status == Established)
93406d87 2333 {
2334 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_MODE))
2335 {
2336 peer->last_reset = PEER_DOWN_NSF_CLOSE_SESSION;
2337 SET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
2338 }
2339 else
2340 peer->last_reset = PEER_DOWN_CLOSE_SESSION;
2341 }
e0701b79 2342
718e3744 2343 BGP_EVENT_ADD (peer, TCP_connection_closed);
2344 return -1;
2345 }
2346
2347 /* We read partial packet. */
9985f83c 2348 if (stream_get_endp (peer->ibuf) != peer->packet_size)
718e3744 2349 return -1;
2350
2351 return 0;
2352}
2353
2354/* Marker check. */
94f2b392 2355static int
718e3744 2356bgp_marker_all_one (struct stream *s, int length)
2357{
2358 int i;
2359
2360 for (i = 0; i < length; i++)
2361 if (s->data[i] != 0xff)
2362 return 0;
2363
2364 return 1;
2365}
2366
2367/* Starting point of packet process function. */
2368int
2369bgp_read (struct thread *thread)
2370{
2371 int ret;
2372 u_char type = 0;
2373 struct peer *peer;
2374 bgp_size_t size;
2375 char notify_data_length[2];
2376
2377 /* Yes first of all get peer pointer. */
2378 peer = THREAD_ARG (thread);
2379 peer->t_read = NULL;
2380
2381 /* For non-blocking IO check. */
2382 if (peer->status == Connect)
2383 {
2384 bgp_connect_check (peer);
2385 goto done;
2386 }
2387 else
2388 {
eb821189 2389 if (peer->fd < 0)
718e3744 2390 {
eb821189 2391 zlog_err ("bgp_read peer's fd is negative value %d", peer->fd);
718e3744 2392 return -1;
2393 }
eb821189 2394 BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
718e3744 2395 }
2396
2397 /* Read packet header to determine type of the packet */
2398 if (peer->packet_size == 0)
2399 peer->packet_size = BGP_HEADER_SIZE;
2400
9985f83c 2401 if (stream_get_endp (peer->ibuf) < BGP_HEADER_SIZE)
718e3744 2402 {
2403 ret = bgp_read_packet (peer);
2404
2405 /* Header read error or partial read packet. */
2406 if (ret < 0)
2407 goto done;
2408
2409 /* Get size and type. */
9985f83c 2410 stream_forward_getp (peer->ibuf, BGP_MARKER_SIZE);
718e3744 2411 memcpy (notify_data_length, stream_pnt (peer->ibuf), 2);
2412 size = stream_getw (peer->ibuf);
2413 type = stream_getc (peer->ibuf);
2414
2415 if (BGP_DEBUG (normal, NORMAL) && type != 2 && type != 0)
6b51474d 2416 zlog_debug ("%s rcv message type %d, length (excl. header) %d",
718e3744 2417 peer->host, type, size - BGP_HEADER_SIZE);
2418
2419 /* Marker check */
f5ba3874 2420 if (((type == BGP_MSG_OPEN) || (type == BGP_MSG_KEEPALIVE))
718e3744 2421 && ! bgp_marker_all_one (peer->ibuf, BGP_MARKER_SIZE))
2422 {
2423 bgp_notify_send (peer,
2424 BGP_NOTIFY_HEADER_ERR,
2425 BGP_NOTIFY_HEADER_NOT_SYNC);
2426 goto done;
2427 }
2428
2429 /* BGP type check. */
2430 if (type != BGP_MSG_OPEN && type != BGP_MSG_UPDATE
2431 && type != BGP_MSG_NOTIFY && type != BGP_MSG_KEEPALIVE
2432 && type != BGP_MSG_ROUTE_REFRESH_NEW
2433 && type != BGP_MSG_ROUTE_REFRESH_OLD
2434 && type != BGP_MSG_CAPABILITY)
2435 {
2436 if (BGP_DEBUG (normal, NORMAL))
6b51474d 2437 plog_debug (peer->log,
718e3744 2438 "%s unknown message type 0x%02x",
2439 peer->host, type);
2440 bgp_notify_send_with_data (peer,
2441 BGP_NOTIFY_HEADER_ERR,
2442 BGP_NOTIFY_HEADER_BAD_MESTYPE,
2443 &type, 1);
2444 goto done;
2445 }
2446 /* Mimimum packet length check. */
2447 if ((size < BGP_HEADER_SIZE)
2448 || (size > BGP_MAX_PACKET_SIZE)
2449 || (type == BGP_MSG_OPEN && size < BGP_MSG_OPEN_MIN_SIZE)
2450 || (type == BGP_MSG_UPDATE && size < BGP_MSG_UPDATE_MIN_SIZE)
2451 || (type == BGP_MSG_NOTIFY && size < BGP_MSG_NOTIFY_MIN_SIZE)
2452 || (type == BGP_MSG_KEEPALIVE && size != BGP_MSG_KEEPALIVE_MIN_SIZE)
2453 || (type == BGP_MSG_ROUTE_REFRESH_NEW && size < BGP_MSG_ROUTE_REFRESH_MIN_SIZE)
2454 || (type == BGP_MSG_ROUTE_REFRESH_OLD && size < BGP_MSG_ROUTE_REFRESH_MIN_SIZE)
2455 || (type == BGP_MSG_CAPABILITY && size < BGP_MSG_CAPABILITY_MIN_SIZE))
2456 {
2457 if (BGP_DEBUG (normal, NORMAL))
6b51474d 2458 plog_debug (peer->log,
718e3744 2459 "%s bad message length - %d for %s",
2460 peer->host, size,
2461 type == 128 ? "ROUTE-REFRESH" :
2462 bgp_type_str[(int) type]);
2463 bgp_notify_send_with_data (peer,
2464 BGP_NOTIFY_HEADER_ERR,
2465 BGP_NOTIFY_HEADER_BAD_MESLEN,
c9e52be3 2466 (u_char *) notify_data_length, 2);
718e3744 2467 goto done;
2468 }
2469
2470 /* Adjust size to message length. */
2471 peer->packet_size = size;
2472 }
2473
2474 ret = bgp_read_packet (peer);
2475 if (ret < 0)
2476 goto done;
2477
2478 /* Get size and type again. */
2479 size = stream_getw_from (peer->ibuf, BGP_MARKER_SIZE);
2480 type = stream_getc_from (peer->ibuf, BGP_MARKER_SIZE + 2);
2481
2482 /* BGP packet dump function. */
2483 bgp_dump_packet (peer, type, peer->ibuf);
2484
2485 size = (peer->packet_size - BGP_HEADER_SIZE);
2486
2487 /* Read rest of the packet and call each sort of packet routine */
2488 switch (type)
2489 {
2490 case BGP_MSG_OPEN:
2491 peer->open_in++;
f5ba3874 2492 bgp_open_receive (peer, size); /* XXX return value ignored! */
718e3744 2493 break;
2494 case BGP_MSG_UPDATE:
2495 peer->readtime = time(NULL); /* Last read timer reset */
2496 bgp_update_receive (peer, size);
2497 break;
2498 case BGP_MSG_NOTIFY:
2499 bgp_notify_receive (peer, size);
2500 break;
2501 case BGP_MSG_KEEPALIVE:
2502 peer->readtime = time(NULL); /* Last read timer reset */
2503 bgp_keepalive_receive (peer, size);
2504 break;
2505 case BGP_MSG_ROUTE_REFRESH_NEW:
2506 case BGP_MSG_ROUTE_REFRESH_OLD:
2507 peer->refresh_in++;
2508 bgp_route_refresh_receive (peer, size);
2509 break;
2510 case BGP_MSG_CAPABILITY:
2511 peer->dynamic_cap_in++;
2512 bgp_capability_receive (peer, size);
2513 break;
2514 }
2515
2516 /* Clear input buffer. */
2517 peer->packet_size = 0;
2518 if (peer->ibuf)
2519 stream_reset (peer->ibuf);
2520
2521 done:
2522 if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
2523 {
2524 if (BGP_DEBUG (events, EVENTS))
6b51474d 2525 zlog_debug ("%s [Event] Accepting BGP peer delete", peer->host);
718e3744 2526 peer_delete (peer);
2527 }
2528 return 0;
2529}