1 /* BGP packet management routine.
2 Copyright (C) 1999 Kunihiro Ishiguro
4 This file is part of GNU Zebra.
6 GNU Zebra is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 GNU Zebra is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
30 #include "sockunion.h" /* for inet_ntop () */
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 #include "bgpd/bgp_vty.h"
51 int stream_put_prefix (struct stream
*, struct prefix
*);
53 /* Set up BGP packet marker and packet type. */
55 bgp_packet_set_marker (struct stream
*s
, u_char type
)
60 for (i
= 0; i
< BGP_MARKER_SIZE
; i
++)
61 stream_putc (s
, 0xff);
63 /* Dummy total length. This field is should be filled in later on. */
66 /* BGP packet type. */
67 stream_putc (s
, type
);
69 /* Return current stream size. */
70 return stream_get_endp (s
);
73 /* Set BGP packet header size entry. If size is zero then use current
76 bgp_packet_set_size (struct stream
*s
)
80 /* Preserve current pointer. */
81 cp
= stream_get_endp (s
);
82 stream_putw_at (s
, BGP_MARKER_SIZE
, cp
);
87 /* Add new packet to the peer. */
89 bgp_packet_add (struct peer
*peer
, struct stream
*s
)
91 /* Add packet to the end of list. */
92 stream_fifo_push (peer
->obuf
, s
);
95 /* Free first packet. */
97 bgp_packet_delete (struct peer
*peer
)
99 stream_free (stream_fifo_pop (peer
->obuf
));
102 /* Check file descriptor whether connect is established. */
104 bgp_connect_check (struct peer
*peer
)
110 /* Anyway I have to reset read and write thread. */
111 BGP_READ_OFF (peer
->t_read
);
112 BGP_WRITE_OFF (peer
->t_write
);
114 /* Check file descriptor. */
115 slen
= sizeof (status
);
116 ret
= getsockopt(peer
->fd
, SOL_SOCKET
, SO_ERROR
, (void *) &status
, &slen
);
118 /* If getsockopt is fail, this is fatal error. */
121 zlog (peer
->log
, LOG_INFO
, "can't get sockopt for nonblocking connect");
122 BGP_EVENT_ADD (peer
, TCP_fatal_error
);
126 /* When status is 0 then TCP connection is established. */
129 BGP_EVENT_ADD (peer
, TCP_connection_open
);
133 if (BGP_DEBUG (events
, EVENTS
))
134 plog_debug (peer
->log
, "%s [Event] Connect failed (%s)",
135 peer
->host
, safe_strerror (errno
));
136 BGP_EVENT_ADD (peer
, TCP_connection_open_failed
);
140 /* Make BGP update packet. */
141 static struct stream
*
142 bgp_update_packet (struct peer
*peer
, afi_t afi
, safi_t safi
)
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;
153 struct prefix_rd
*prd
= NULL
;
159 adv
= FIFO_HEAD (&peer
->sync
[afi
][safi
]->update
);
170 prd
= (struct prefix_rd
*) &rn
->prn
->p
;
173 #endif /* MPLS_VPN */
175 /* When remaining space can't include NLRI and it's length. */
176 if (rn
&& STREAM_REMAIN (s
) <= BGP_NLRI_LENGTH
+ PSIZE (rn
->p
.prefixlen
))
179 /* If packet is empty, set attribute. */
180 if (stream_empty (s
))
182 bgp_packet_set_marker (s
, BGP_MSG_UPDATE
);
184 pos
= stream_get_endp (s
);
186 total_attr_len
= bgp_packet_attribute (NULL
, peer
, s
,
189 binfo
->peer
, prd
, tag
);
190 stream_putw_at (s
, pos
, total_attr_len
);
193 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
194 stream_put_prefix (s
, &rn
->p
);
196 if (BGP_DEBUG (update
, UPDATE_OUT
))
197 zlog (peer
->log
, LOG_DEBUG
, "%s send UPDATE %s/%d",
199 inet_ntop (rn
->p
.family
, &(rn
->p
.u
.prefix
), buf
, BUFSIZ
),
202 /* Synchnorize attribute. */
204 bgp_attr_unintern (adj
->attr
);
206 peer
->scount
[afi
][safi
]++;
208 adj
->attr
= bgp_attr_intern (adv
->baa
->attr
);
210 adv
= bgp_advertise_clean (peer
, adj
, afi
, safi
);
212 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
216 if (! stream_empty (s
))
218 bgp_packet_set_size (s
);
219 packet
= stream_dup (s
);
220 bgp_packet_add (peer
, packet
);
221 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
228 static struct stream
*
229 bgp_update_packet_eor (struct peer
*peer
, afi_t afi
, safi_t safi
)
232 struct stream
*packet
;
234 #ifdef DISABLE_BGP_ANNOUNCE
236 #endif /* DISABLE_BGP_ANNOUNCE */
238 if (BGP_DEBUG (normal
, NORMAL
))
239 zlog_debug ("send End-of-RIB for %s to %s", afi_safi_print (afi
, safi
), peer
->host
);
241 s
= stream_new (BGP_MAX_PACKET_SIZE
);
243 /* Make BGP update packet. */
244 bgp_packet_set_marker (s
, BGP_MSG_UPDATE
);
246 /* Unfeasible Routes Length */
249 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
251 /* Total Path Attribute Length */
256 /* Total Path Attribute Length */
258 stream_putc (s
, BGP_ATTR_FLAG_OPTIONAL
);
259 stream_putc (s
, BGP_ATTR_MP_UNREACH_NLRI
);
261 stream_putw (s
, afi
);
262 stream_putc (s
, safi
);
265 bgp_packet_set_size (s
);
266 packet
= stream_dup (s
);
267 bgp_packet_add (peer
, packet
);
272 /* Make BGP withdraw packet. */
273 static struct stream
*
274 bgp_withdraw_packet (struct peer
*peer
, afi_t afi
, safi_t safi
)
277 struct stream
*packet
;
278 struct bgp_adj_out
*adj
;
279 struct bgp_advertise
*adv
;
282 bgp_size_t unfeasible_len
;
283 bgp_size_t total_attr_len
;
285 struct prefix_rd
*prd
= NULL
;
290 while ((adv
= FIFO_HEAD (&peer
->sync
[afi
][safi
]->withdraw
)) != NULL
)
295 prd
= (struct prefix_rd
*) &rn
->prn
->p
;
296 #endif /* MPLS_VPN */
298 if (STREAM_REMAIN (s
)
299 < (BGP_NLRI_LENGTH
+ BGP_TOTAL_ATTR_LEN
+ PSIZE (rn
->p
.prefixlen
)))
302 if (stream_empty (s
))
304 bgp_packet_set_marker (s
, BGP_MSG_UPDATE
);
308 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
309 stream_put_prefix (s
, &rn
->p
);
312 pos
= stream_get_endp (s
);
315 = bgp_packet_withdraw (peer
, s
, &rn
->p
, afi
, safi
, prd
, NULL
);
317 /* Set total path attribute length. */
318 stream_putw_at (s
, pos
, total_attr_len
);
321 if (BGP_DEBUG (update
, UPDATE_OUT
))
322 zlog (peer
->log
, LOG_DEBUG
, "%s send UPDATE %s/%d -- unreachable",
324 inet_ntop (rn
->p
.family
, &(rn
->p
.u
.prefix
), buf
, BUFSIZ
),
327 peer
->scount
[afi
][safi
]--;
329 bgp_adj_out_remove (rn
, adj
, peer
, afi
, safi
);
330 bgp_unlock_node (rn
);
332 if (! (afi
== AFI_IP
&& safi
== SAFI_UNICAST
))
336 if (! stream_empty (s
))
338 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
341 = stream_get_endp (s
) - BGP_HEADER_SIZE
- BGP_UNFEASIBLE_LEN
;
342 stream_putw_at (s
, BGP_HEADER_SIZE
, unfeasible_len
);
345 bgp_packet_set_size (s
);
346 packet
= stream_dup (s
);
347 bgp_packet_add (peer
, packet
);
356 bgp_default_update_send (struct peer
*peer
, struct attr
*attr
,
357 afi_t afi
, safi_t safi
, struct peer
*from
)
360 struct stream
*packet
;
363 bgp_size_t total_attr_len
;
364 char attrstr
[BUFSIZ
];
367 #ifdef DISABLE_BGP_ANNOUNCE
369 #endif /* DISABLE_BGP_ANNOUNCE */
372 str2prefix ("0.0.0.0/0", &p
);
375 str2prefix ("::/0", &p
);
376 #endif /* HAVE_IPV6 */
378 /* Logging the attribute. */
379 if (BGP_DEBUG (update
, UPDATE_OUT
))
381 bgp_dump_attr (peer
, attr
, attrstr
, BUFSIZ
);
382 zlog (peer
->log
, LOG_DEBUG
, "%s send UPDATE %s/%d %s",
383 peer
->host
, inet_ntop(p
.family
, &(p
.u
.prefix
), buf
, BUFSIZ
),
384 p
.prefixlen
, attrstr
);
387 s
= stream_new (BGP_MAX_PACKET_SIZE
);
389 /* Make BGP update packet. */
390 bgp_packet_set_marker (s
, BGP_MSG_UPDATE
);
392 /* Unfeasible Routes Length. */
395 /* Make place for total attribute length. */
396 pos
= stream_get_endp (s
);
398 total_attr_len
= bgp_packet_attribute (NULL
, peer
, s
, attr
, &p
, afi
, safi
, from
, NULL
, NULL
);
400 /* Set Total Path Attribute Length. */
401 stream_putw_at (s
, pos
, total_attr_len
);
404 if (p
.family
== AF_INET
&& safi
== SAFI_UNICAST
)
405 stream_put_prefix (s
, &p
);
408 bgp_packet_set_size (s
);
410 packet
= stream_dup (s
);
413 /* Dump packet if debug option is set. */
415 /* bgp_packet_dump (packet); */
418 /* Add packet to the peer. */
419 bgp_packet_add (peer
, packet
);
421 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
425 bgp_default_withdraw_send (struct peer
*peer
, afi_t afi
, safi_t safi
)
428 struct stream
*packet
;
432 bgp_size_t unfeasible_len
;
433 bgp_size_t total_attr_len
;
436 #ifdef DISABLE_BGP_ANNOUNCE
438 #endif /* DISABLE_BGP_ANNOUNCE */
441 str2prefix ("0.0.0.0/0", &p
);
444 str2prefix ("::/0", &p
);
445 #endif /* HAVE_IPV6 */
450 if (BGP_DEBUG (update
, UPDATE_OUT
))
451 zlog (peer
->log
, LOG_DEBUG
, "%s send UPDATE %s/%d -- unreachable",
452 peer
->host
, inet_ntop(p
.family
, &(p
.u
.prefix
), buf
, BUFSIZ
),
455 s
= stream_new (BGP_MAX_PACKET_SIZE
);
457 /* Make BGP update packet. */
458 bgp_packet_set_marker (s
, BGP_MSG_UPDATE
);
460 /* Unfeasible Routes Length. */;
461 cp
= stream_get_endp (s
);
464 /* Withdrawn Routes. */
465 if (p
.family
== AF_INET
&& safi
== SAFI_UNICAST
)
467 stream_put_prefix (s
, &p
);
469 unfeasible_len
= stream_get_endp (s
) - cp
- 2;
471 /* Set unfeasible len. */
472 stream_putw_at (s
, cp
, unfeasible_len
);
474 /* Set total path attribute length. */
479 pos
= stream_get_endp (s
);
481 total_attr_len
= bgp_packet_withdraw (peer
, s
, &p
, afi
, safi
, NULL
, NULL
);
483 /* Set total path attribute length. */
484 stream_putw_at (s
, pos
, total_attr_len
);
487 bgp_packet_set_size (s
);
489 packet
= stream_dup (s
);
492 /* Add packet to the peer. */
493 bgp_packet_add (peer
, packet
);
495 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
498 /* Get next packet to be written. */
499 static struct stream
*
500 bgp_write_packet (struct peer
*peer
)
504 struct stream
*s
= NULL
;
505 struct bgp_advertise
*adv
;
507 s
= stream_fifo_head (peer
->obuf
);
511 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
512 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
514 adv
= FIFO_HEAD (&peer
->sync
[afi
][safi
]->withdraw
);
517 s
= bgp_withdraw_packet (peer
, afi
, safi
);
523 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
524 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
526 adv
= FIFO_HEAD (&peer
->sync
[afi
][safi
]->update
);
529 if (adv
->binfo
&& adv
->binfo
->uptime
< peer
->synctime
)
531 if (CHECK_FLAG (adv
->binfo
->peer
->cap
, PEER_CAP_RESTART_RCV
)
532 && CHECK_FLAG (adv
->binfo
->peer
->cap
, PEER_CAP_RESTART_ADV
)
533 && ! CHECK_FLAG (adv
->binfo
->flags
, BGP_INFO_STALE
)
534 && safi
!= SAFI_MPLS_VPN
)
536 if (CHECK_FLAG (adv
->binfo
->peer
->af_sflags
[afi
][safi
],
537 PEER_STATUS_EOR_RECEIVED
))
538 s
= bgp_update_packet (peer
, afi
, safi
);
541 s
= bgp_update_packet (peer
, afi
, safi
);
548 if (CHECK_FLAG (peer
->cap
, PEER_CAP_RESTART_RCV
))
550 if (peer
->afc_nego
[afi
][safi
] && peer
->synctime
551 && ! CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_EOR_SEND
)
552 && safi
!= SAFI_MPLS_VPN
)
554 SET_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_EOR_SEND
);
555 return bgp_update_packet_eor (peer
, afi
, safi
);
563 /* Is there partially written packet or updates we can send right
566 bgp_write_proceed (struct peer
*peer
)
570 struct bgp_advertise
*adv
;
572 if (stream_fifo_head (peer
->obuf
))
575 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
576 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
577 if (FIFO_HEAD (&peer
->sync
[afi
][safi
]->withdraw
))
580 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
581 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
582 if ((adv
= FIFO_HEAD (&peer
->sync
[afi
][safi
]->update
)) != NULL
)
583 if (adv
->binfo
->uptime
< peer
->synctime
)
589 /* Write packet to the peer. */
591 bgp_write (struct thread
*thread
)
597 unsigned int count
= 0;
600 /* Yes first of all get peer pointer. */
601 peer
= THREAD_ARG (thread
);
602 peer
->t_write
= NULL
;
604 /* For non-blocking IO check. */
605 if (peer
->status
== Connect
)
607 bgp_connect_check (peer
);
611 /* Nonblocking write until TCP output buffer is full. */
617 s
= bgp_write_packet (peer
);
621 /* XXX: FIXME, the socket should be NONBLOCK from the start
622 * status shouldnt need to be toggled on each write
624 val
= fcntl (peer
->fd
, F_GETFL
, 0);
625 fcntl (peer
->fd
, F_SETFL
, val
|O_NONBLOCK
);
627 /* Number of bytes to be sent. */
628 writenum
= stream_get_endp (s
) - stream_get_getp (s
);
630 /* Call write() system call. */
631 num
= write (peer
->fd
, STREAM_PNT (s
), writenum
);
633 fcntl (peer
->fd
, F_SETFL
, val
);
637 if (write_errno
== EWOULDBLOCK
|| write_errno
== EAGAIN
)
640 BGP_EVENT_ADD (peer
, BGP_Stop
);
642 bgp_timer_set (peer
);
647 stream_forward_getp (s
, num
);
649 if (write_errno
== EAGAIN
)
655 /* Retrieve BGP packet type. */
656 stream_set_getp (s
, BGP_MARKER_SIZE
+ 2);
657 type
= stream_getc (s
);
669 /* Double start timer. */
672 /* Overflow check. */
673 if (peer
->v_start
>= (60 * 2))
674 peer
->v_start
= (60 * 2);
676 BGP_EVENT_ADD (peer
, BGP_Stop
);
679 bgp_timer_set (peer
);
682 case BGP_MSG_KEEPALIVE
:
683 peer
->keepalive_out
++;
685 case BGP_MSG_ROUTE_REFRESH_NEW
:
686 case BGP_MSG_ROUTE_REFRESH_OLD
:
689 case BGP_MSG_CAPABILITY
:
690 peer
->dynamic_cap_out
++;
694 /* OK we send packet so delete it. */
695 bgp_packet_delete (peer
);
697 if (++count
>= BGP_WRITE_PACKET_MAX
)
701 if (bgp_write_proceed (peer
))
702 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
707 /* This is only for sending NOTIFICATION message to neighbor. */
709 bgp_write_notify (struct peer
*peer
)
715 /* There should be at least one packet. */
716 s
= stream_fifo_head (peer
->obuf
);
719 assert (stream_get_endp (s
) >= BGP_HEADER_SIZE
);
721 /* I'm not sure fd is writable. */
722 ret
= writen (peer
->fd
, STREAM_DATA (s
), stream_get_endp (s
));
725 BGP_EVENT_ADD (peer
, BGP_Stop
);
727 bgp_timer_set (peer
);
731 /* Retrieve BGP packet type. */
732 stream_set_getp (s
, BGP_MARKER_SIZE
+ 2);
733 type
= stream_getc (s
);
735 assert (type
== BGP_MSG_NOTIFY
);
737 /* Type should be notify. */
740 /* Double start timer. */
743 /* Overflow check. */
744 if (peer
->v_start
>= (60 * 2))
745 peer
->v_start
= (60 * 2);
747 /* We don't call event manager at here for avoiding other events. */
750 bgp_timer_set (peer
);
755 /* Make keepalive packet and send it to the peer. */
757 bgp_keepalive_send (struct peer
*peer
)
762 s
= stream_new (BGP_MAX_PACKET_SIZE
);
764 /* Make keepalive packet. */
765 bgp_packet_set_marker (s
, BGP_MSG_KEEPALIVE
);
767 /* Set packet size. */
768 length
= bgp_packet_set_size (s
);
770 /* Dump packet if debug option is set. */
771 /* bgp_packet_dump (s); */
773 if (BGP_DEBUG (keepalive
, KEEPALIVE
))
774 zlog_debug ("%s sending KEEPALIVE", peer
->host
);
775 if (BGP_DEBUG (normal
, NORMAL
))
776 zlog_debug ("%s send message type %d, length (incl. header) %d",
777 peer
->host
, BGP_MSG_KEEPALIVE
, length
);
779 /* Add packet to the peer. */
780 bgp_packet_add (peer
, s
);
782 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
785 /* Make open packet and send it to the peer. */
787 bgp_open_send (struct peer
*peer
)
791 u_int16_t send_holdtime
;
794 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
))
795 send_holdtime
= peer
->holdtime
;
797 send_holdtime
= peer
->bgp
->default_holdtime
;
799 /* local-as Change */
800 if (peer
->change_local_as
)
801 local_as
= peer
->change_local_as
;
803 local_as
= peer
->local_as
;
805 s
= stream_new (BGP_MAX_PACKET_SIZE
);
807 /* Make open packet. */
808 bgp_packet_set_marker (s
, BGP_MSG_OPEN
);
810 /* Set open packet values. */
811 stream_putc (s
, BGP_VERSION_4
); /* BGP version */
812 stream_putw (s
, local_as
); /* My Autonomous System*/
813 stream_putw (s
, send_holdtime
); /* Hold Time */
814 stream_put_in_addr (s
, &peer
->local_id
); /* BGP Identifier */
816 /* Set capability code. */
817 bgp_open_capability (s
, peer
);
819 /* Set BGP packet length. */
820 length
= bgp_packet_set_size (s
);
822 if (BGP_DEBUG (normal
, NORMAL
))
823 zlog_debug ("%s sending OPEN, version %d, my as %d, holdtime %d, id %s",
824 peer
->host
, BGP_VERSION_4
, local_as
,
825 send_holdtime
, inet_ntoa (peer
->local_id
));
827 if (BGP_DEBUG (normal
, NORMAL
))
828 zlog_debug ("%s send message type %d, length (incl. header) %d",
829 peer
->host
, BGP_MSG_OPEN
, length
);
831 /* Dump packet if debug option is set. */
832 /* bgp_packet_dump (s); */
834 /* Add packet to the peer. */
835 bgp_packet_add (peer
, s
);
837 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
840 /* Send BGP notify packet with data potion. */
842 bgp_notify_send_with_data (struct peer
*peer
, u_char code
, u_char sub_code
,
843 u_char
*data
, size_t datalen
)
848 /* Allocate new stream. */
849 s
= stream_new (BGP_MAX_PACKET_SIZE
);
851 /* Make nitify packet. */
852 bgp_packet_set_marker (s
, BGP_MSG_NOTIFY
);
854 /* Set notify packet values. */
855 stream_putc (s
, code
); /* BGP notify code */
856 stream_putc (s
, sub_code
); /* BGP notify sub_code */
858 /* If notify data is present. */
860 stream_write (s
, data
, datalen
);
862 /* Set BGP packet length. */
863 length
= bgp_packet_set_size (s
);
865 /* Add packet to the peer. */
866 stream_fifo_clean (peer
->obuf
);
867 bgp_packet_add (peer
, s
);
871 struct bgp_notify bgp_notify
;
876 bgp_notify
.code
= code
;
877 bgp_notify
.subcode
= sub_code
;
878 bgp_notify
.data
= NULL
;
879 bgp_notify
.length
= length
- BGP_MSG_NOTIFY_MIN_SIZE
;
881 if (bgp_notify
.length
)
883 bgp_notify
.data
= XMALLOC (MTYPE_TMP
, bgp_notify
.length
* 3);
884 for (i
= 0; i
< bgp_notify
.length
; i
++)
887 sprintf (c
, " %02x", data
[i
]);
888 strcat (bgp_notify
.data
, c
);
893 sprintf (c
, "%02x", data
[i
]);
894 strcpy (bgp_notify
.data
, c
);
897 bgp_notify_print (peer
, &bgp_notify
, "sending");
899 XFREE (MTYPE_TMP
, bgp_notify
.data
);
902 if (BGP_DEBUG (normal
, NORMAL
))
903 zlog_debug ("%s send message type %d, length (incl. header) %d",
904 peer
->host
, BGP_MSG_NOTIFY
, length
);
906 /* peer reset cause */
907 if (sub_code
!= BGP_NOTIFY_CEASE_CONFIG_CHANGE
)
909 if (sub_code
== BGP_NOTIFY_CEASE_ADMIN_RESET
)
910 peer
->last_reset
= PEER_DOWN_USER_RESET
;
911 else if (sub_code
== BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
)
912 peer
->last_reset
= PEER_DOWN_USER_SHUTDOWN
;
914 peer
->last_reset
= PEER_DOWN_NOTIFY_SEND
;
917 /* Call imidiately. */
918 BGP_WRITE_OFF (peer
->t_write
);
920 bgp_write_notify (peer
);
923 /* Send BGP notify packet. */
925 bgp_notify_send (struct peer
*peer
, u_char code
, u_char sub_code
)
927 bgp_notify_send_with_data (peer
, code
, sub_code
, NULL
, 0);
935 else if (afi
== AFI_IP6
)
938 return "Unknown AFI";
942 safi2str (safi_t safi
)
944 if (safi
== SAFI_UNICAST
)
945 return "SAFI_UNICAST";
946 else if (safi
== SAFI_MULTICAST
)
947 return "SAFI_MULTICAST";
948 else if (safi
== SAFI_MPLS_VPN
|| safi
== BGP_SAFI_VPNV4
)
949 return "SAFI_MPLS_VPN";
951 return "Unknown SAFI";
954 /* Send route refresh message to the peer. */
956 bgp_route_refresh_send (struct peer
*peer
, afi_t afi
, safi_t safi
,
957 u_char orf_type
, u_char when_to_refresh
, int remove
)
960 struct stream
*packet
;
962 struct bgp_filter
*filter
;
965 #ifdef DISABLE_BGP_ANNOUNCE
967 #endif /* DISABLE_BGP_ANNOUNCE */
969 filter
= &peer
->filter
[afi
][safi
];
971 /* Adjust safi code. */
972 if (safi
== SAFI_MPLS_VPN
)
973 safi
= BGP_SAFI_VPNV4
;
975 s
= stream_new (BGP_MAX_PACKET_SIZE
);
977 /* Make BGP update packet. */
978 if (CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
979 bgp_packet_set_marker (s
, BGP_MSG_ROUTE_REFRESH_NEW
);
981 bgp_packet_set_marker (s
, BGP_MSG_ROUTE_REFRESH_OLD
);
983 /* Encode Route Refresh message. */
984 stream_putw (s
, afi
);
986 stream_putc (s
, safi
);
988 if (orf_type
== ORF_TYPE_PREFIX
989 || orf_type
== ORF_TYPE_PREFIX_OLD
)
990 if (remove
|| filter
->plist
[FILTER_IN
].plist
)
996 stream_putc (s
, when_to_refresh
);
997 stream_putc (s
, orf_type
);
998 orfp
= stream_get_endp (s
);
1003 UNSET_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
);
1004 stream_putc (s
, ORF_COMMON_PART_REMOVE_ALL
);
1005 if (BGP_DEBUG (normal
, NORMAL
))
1006 zlog_debug ("%s sending REFRESH_REQ to remove ORF(%d) (%s) for afi/safi: %d/%d",
1007 peer
->host
, orf_type
,
1008 (when_to_refresh
== REFRESH_DEFER
? "defer" : "immediate"),
1013 SET_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
);
1014 prefix_bgp_orf_entry (s
, filter
->plist
[FILTER_IN
].plist
,
1015 ORF_COMMON_PART_ADD
, ORF_COMMON_PART_PERMIT
,
1016 ORF_COMMON_PART_DENY
);
1017 if (BGP_DEBUG (normal
, NORMAL
))
1018 zlog_debug ("%s sending REFRESH_REQ with pfxlist ORF(%d) (%s) for afi/safi: %d/%d",
1019 peer
->host
, orf_type
,
1020 (when_to_refresh
== REFRESH_DEFER
? "defer" : "immediate"),
1024 /* Total ORF Entry Len. */
1025 orf_len
= stream_get_endp (s
) - orfp
- 2;
1026 stream_putw_at (s
, orfp
, orf_len
);
1029 /* Set packet size. */
1030 length
= bgp_packet_set_size (s
);
1032 if (BGP_DEBUG (normal
, NORMAL
))
1035 zlog_debug ("%s sending REFRESH_REQ for afi/safi: %d/%d",
1036 peer
->host
, afi
, safi
);
1037 zlog_debug ("%s send message type %d, length (incl. header) %d",
1038 peer
->host
, CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_NEW_RCV
) ?
1039 BGP_MSG_ROUTE_REFRESH_NEW
: BGP_MSG_ROUTE_REFRESH_OLD
, length
);
1042 /* Make real packet. */
1043 packet
= stream_dup (s
);
1046 /* Add packet to the peer. */
1047 bgp_packet_add (peer
, packet
);
1049 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
1052 /* Send capability message to the peer. */
1054 bgp_capability_send (struct peer
*peer
, afi_t afi
, safi_t safi
,
1055 int capability_code
, int action
)
1058 struct stream
*packet
;
1061 /* Adjust safi code. */
1062 if (safi
== SAFI_MPLS_VPN
)
1063 safi
= BGP_SAFI_VPNV4
;
1065 s
= stream_new (BGP_MAX_PACKET_SIZE
);
1067 /* Make BGP update packet. */
1068 bgp_packet_set_marker (s
, BGP_MSG_CAPABILITY
);
1070 /* Encode MP_EXT capability. */
1071 if (capability_code
== CAPABILITY_CODE_MP
)
1073 stream_putc (s
, action
);
1074 stream_putc (s
, CAPABILITY_CODE_MP
);
1075 stream_putc (s
, CAPABILITY_CODE_MP_LEN
);
1076 stream_putw (s
, afi
);
1078 stream_putc (s
, safi
);
1080 if (BGP_DEBUG (normal
, NORMAL
))
1081 zlog_debug ("%s sending CAPABILITY has %s MP_EXT CAP for afi/safi: %d/%d",
1082 peer
->host
, action
== CAPABILITY_ACTION_SET
?
1083 "Advertising" : "Removing", afi
, safi
);
1086 /* Set packet size. */
1087 length
= bgp_packet_set_size (s
);
1089 /* Make real packet. */
1090 packet
= stream_dup (s
);
1093 /* Add packet to the peer. */
1094 bgp_packet_add (peer
, packet
);
1096 if (BGP_DEBUG (normal
, NORMAL
))
1097 zlog_debug ("%s send message type %d, length (incl. header) %d",
1098 peer
->host
, BGP_MSG_CAPABILITY
, length
);
1100 BGP_WRITE_ON (peer
->t_write
, bgp_write
, peer
->fd
);
1103 /* RFC1771 6.8 Connection collision detection. */
1105 bgp_collision_detect (struct peer
*new, struct in_addr remote_id
)
1108 struct listnode
*node
, *nnode
;
1111 bgp
= bgp_get_default ();
1115 /* Upon receipt of an OPEN message, the local system must examine
1116 all of its connections that are in the OpenConfirm state. A BGP
1117 speaker may also examine connections in an OpenSent state if it
1118 knows the BGP Identifier of the peer by means outside of the
1119 protocol. If among these connections there is a connection to a
1120 remote BGP speaker whose BGP Identifier equals the one in the
1121 OPEN message, then the local system performs the following
1122 collision resolution procedure: */
1124 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
1126 /* Under OpenConfirm status, local peer structure already hold
1127 remote router ID. */
1130 && (peer
->status
== OpenConfirm
|| peer
->status
== OpenSent
)
1131 && sockunion_same (&peer
->su
, &new->su
))
1133 /* 1. The BGP Identifier of the local system is compared to
1134 the BGP Identifier of the remote system (as specified in
1135 the OPEN message). */
1137 if (ntohl (peer
->local_id
.s_addr
) < ntohl (remote_id
.s_addr
))
1139 /* 2. If the value of the local BGP Identifier is less
1140 than the remote one, the local system closes BGP
1141 connection that already exists (the one that is
1142 already in the OpenConfirm state), and accepts BGP
1143 connection initiated by the remote system. */
1146 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, BGP_NOTIFY_CEASE_COLLISION_RESOLUTION
);
1151 /* 3. Otherwise, the local system closes newly created
1152 BGP connection (the one associated with the newly
1153 received OPEN message), and continues to use the
1154 existing one (the one that is already in the
1155 OpenConfirm state). */
1158 bgp_notify_send (new, BGP_NOTIFY_CEASE
,
1159 BGP_NOTIFY_CEASE_COLLISION_RESOLUTION
);
1168 bgp_open_receive (struct peer
*peer
, bgp_size_t size
)
1174 u_int16_t send_holdtime
;
1176 struct peer
*realpeer
;
1177 struct in_addr remote_id
;
1179 u_int8_t notify_data_remote_as
[2];
1180 u_int8_t notify_data_remote_id
[4];
1184 /* Parse open packet. */
1185 version
= stream_getc (peer
->ibuf
);
1186 memcpy (notify_data_remote_as
, stream_pnt (peer
->ibuf
), 2);
1187 remote_as
= stream_getw (peer
->ibuf
);
1188 holdtime
= stream_getw (peer
->ibuf
);
1189 memcpy (notify_data_remote_id
, stream_pnt (peer
->ibuf
), 4);
1190 remote_id
.s_addr
= stream_get_ipv4 (peer
->ibuf
);
1192 /* Receive OPEN message log */
1193 if (BGP_DEBUG (normal
, NORMAL
))
1194 zlog_debug ("%s rcv OPEN, version %d, remote-as %d, holdtime %d, id %s",
1195 peer
->host
, version
, remote_as
, holdtime
,
1196 inet_ntoa (remote_id
));
1198 /* Lookup peer from Open packet. */
1199 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1203 realpeer
= peer_lookup_with_open (&peer
->su
, remote_as
, &remote_id
, &as
);
1207 /* Peer's source IP address is check in bgp_accept(), so this
1208 must be AS number mismatch or remote-id configuration
1212 if (BGP_DEBUG (normal
, NORMAL
))
1213 zlog_debug ("%s bad OPEN, wrong router identifier %s",
1214 peer
->host
, inet_ntoa (remote_id
));
1215 bgp_notify_send_with_data (peer
, BGP_NOTIFY_OPEN_ERR
,
1216 BGP_NOTIFY_OPEN_BAD_BGP_IDENT
,
1217 notify_data_remote_id
, 4);
1221 if (BGP_DEBUG (normal
, NORMAL
))
1222 zlog_debug ("%s bad OPEN, remote AS is %d, expected %d",
1223 peer
->host
, remote_as
, peer
->as
);
1224 bgp_notify_send_with_data (peer
, BGP_NOTIFY_OPEN_ERR
,
1225 BGP_NOTIFY_OPEN_BAD_PEER_AS
,
1226 notify_data_remote_as
, 2);
1232 /* When collision is detected and this peer is closed. Retrun
1234 ret
= bgp_collision_detect (peer
, remote_id
);
1239 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
1241 if (realpeer
->status
== Established
1242 && CHECK_FLAG (realpeer
->sflags
, PEER_STATUS_NSF_MODE
))
1244 realpeer
->last_reset
= PEER_DOWN_NSF_CLOSE_SESSION
;
1245 SET_FLAG (realpeer
->sflags
, PEER_STATUS_NSF_WAIT
);
1247 else if (ret
== 0 && realpeer
->status
!= Active
1248 && realpeer
->status
!= OpenSent
1249 && realpeer
->status
!= OpenConfirm
)
1252 if (BGP_DEBUG (events
, EVENTS
))
1253 zlog_debug ("%s peer status is %s close connection",
1254 realpeer
->host
, LOOKUP (bgp_status_msg
,
1256 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
1257 BGP_NOTIFY_CEASE_CONNECT_REJECT
);
1262 if (BGP_DEBUG (events
, EVENTS
))
1263 zlog_debug ("%s [Event] Transfer temporary BGP peer to existing one",
1266 bgp_stop (realpeer
);
1268 /* Transfer file descriptor. */
1269 realpeer
->fd
= peer
->fd
;
1272 /* Transfer input buffer. */
1273 stream_free (realpeer
->ibuf
);
1274 realpeer
->ibuf
= peer
->ibuf
;
1275 realpeer
->packet_size
= peer
->packet_size
;
1278 /* Transfer status. */
1279 realpeer
->status
= peer
->status
;
1282 /* peer pointer change. Open packet send to neighbor. */
1284 bgp_open_send (peer
);
1287 zlog_err ("bgp_open_receive peer's fd is negative value %d",
1291 BGP_READ_ON (peer
->t_read
, bgp_read
, peer
->fd
);
1294 /* remote router-id check. */
1295 if (remote_id
.s_addr
== 0
1296 || ntohl (remote_id
.s_addr
) >= 0xe0000000
1297 || ntohl (peer
->local_id
.s_addr
) == ntohl (remote_id
.s_addr
))
1299 if (BGP_DEBUG (normal
, NORMAL
))
1300 zlog_debug ("%s bad OPEN, wrong router identifier %s",
1301 peer
->host
, inet_ntoa (remote_id
));
1302 bgp_notify_send_with_data (peer
,
1303 BGP_NOTIFY_OPEN_ERR
,
1304 BGP_NOTIFY_OPEN_BAD_BGP_IDENT
,
1305 notify_data_remote_id
, 4);
1309 /* Set remote router-id */
1310 peer
->remote_id
= remote_id
;
1312 /* Peer BGP version check. */
1313 if (version
!= BGP_VERSION_4
)
1315 u_int8_t maxver
= BGP_VERSION_4
;
1316 if (BGP_DEBUG (normal
, NORMAL
))
1317 zlog_debug ("%s bad protocol version, remote requested %d, local request %d",
1318 peer
->host
, version
, BGP_VERSION_4
);
1319 bgp_notify_send_with_data (peer
,
1320 BGP_NOTIFY_OPEN_ERR
,
1321 BGP_NOTIFY_OPEN_UNSUP_VERSION
,
1326 /* Check neighbor as number. */
1327 if (remote_as
!= peer
->as
)
1329 if (BGP_DEBUG (normal
, NORMAL
))
1330 zlog_debug ("%s bad OPEN, remote AS is %d, expected %d",
1331 peer
->host
, remote_as
, peer
->as
);
1332 bgp_notify_send_with_data (peer
,
1333 BGP_NOTIFY_OPEN_ERR
,
1334 BGP_NOTIFY_OPEN_BAD_PEER_AS
,
1335 notify_data_remote_as
, 2);
1339 /* From the rfc: Upon receipt of an OPEN message, a BGP speaker MUST
1340 calculate the value of the Hold Timer by using the smaller of its
1341 configured Hold Time and the Hold Time received in the OPEN message.
1342 The Hold Time MUST be either zero or at least three seconds. An
1343 implementation may reject connections on the basis of the Hold Time. */
1345 if (holdtime
< 3 && holdtime
!= 0)
1347 bgp_notify_send (peer
,
1348 BGP_NOTIFY_OPEN_ERR
,
1349 BGP_NOTIFY_OPEN_UNACEP_HOLDTIME
);
1353 /* From the rfc: A reasonable maximum time between KEEPALIVE messages
1354 would be one third of the Hold Time interval. KEEPALIVE messages
1355 MUST NOT be sent more frequently than one per second. An
1356 implementation MAY adjust the rate at which it sends KEEPALIVE
1357 messages as a function of the Hold Time interval. */
1359 if (CHECK_FLAG (peer
->config
, PEER_CONFIG_TIMER
))
1360 send_holdtime
= peer
->holdtime
;
1362 send_holdtime
= peer
->bgp
->default_holdtime
;
1364 if (holdtime
< send_holdtime
)
1365 peer
->v_holdtime
= holdtime
;
1367 peer
->v_holdtime
= send_holdtime
;
1369 peer
->v_keepalive
= peer
->v_holdtime
/ 3;
1371 /* Open option part parse. */
1373 optlen
= stream_getc (peer
->ibuf
);
1376 ret
= bgp_open_option_parse (peer
, optlen
, &capability
);
1380 stream_forward_getp (peer
->ibuf
, optlen
);
1384 if (BGP_DEBUG (normal
, NORMAL
))
1385 zlog_debug ("%s rcvd OPEN w/ OPTION parameter len: 0",
1389 /* Override capability. */
1390 if (! capability
|| CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
1392 peer
->afc_nego
[AFI_IP
][SAFI_UNICAST
] = peer
->afc
[AFI_IP
][SAFI_UNICAST
];
1393 peer
->afc_nego
[AFI_IP
][SAFI_MULTICAST
] = peer
->afc
[AFI_IP
][SAFI_MULTICAST
];
1394 peer
->afc_nego
[AFI_IP6
][SAFI_UNICAST
] = peer
->afc
[AFI_IP6
][SAFI_UNICAST
];
1395 peer
->afc_nego
[AFI_IP6
][SAFI_MULTICAST
] = peer
->afc
[AFI_IP6
][SAFI_MULTICAST
];
1399 bgp_getsockname (peer
);
1401 BGP_EVENT_ADD (peer
, Receive_OPEN_message
);
1403 peer
->packet_size
= 0;
1405 stream_reset (peer
->ibuf
);
1410 /* Parse BGP Update packet and make attribute object. */
1412 bgp_update_receive (struct peer
*peer
, bgp_size_t size
)
1418 bgp_size_t attribute_len
;
1419 bgp_size_t update_len
;
1420 bgp_size_t withdraw_len
;
1421 struct bgp_nlri update
;
1422 struct bgp_nlri withdraw
;
1423 struct bgp_nlri mp_update
;
1424 struct bgp_nlri mp_withdraw
;
1425 char attrstr
[BUFSIZ
] = "";
1427 /* Status must be Established. */
1428 if (peer
->status
!= Established
)
1430 zlog_err ("%s [FSM] Update packet received under status %s",
1431 peer
->host
, LOOKUP (bgp_status_msg
, peer
->status
));
1432 bgp_notify_send (peer
, BGP_NOTIFY_FSM_ERR
, 0);
1436 /* Set initial values. */
1437 memset (&attr
, 0, sizeof (struct attr
));
1438 memset (&update
, 0, sizeof (struct bgp_nlri
));
1439 memset (&withdraw
, 0, sizeof (struct bgp_nlri
));
1440 memset (&mp_update
, 0, sizeof (struct bgp_nlri
));
1441 memset (&mp_withdraw
, 0, sizeof (struct bgp_nlri
));
1444 end
= stream_pnt (s
) + size
;
1446 /* RFC1771 6.3 If the Unfeasible Routes Length or Total Attribute
1447 Length is too large (i.e., if Unfeasible Routes Length + Total
1448 Attribute Length + 23 exceeds the message Length), then the Error
1449 Subcode is set to Malformed Attribute List. */
1450 if (stream_pnt (s
) + 2 > end
)
1452 zlog_err ("%s [Error] Update packet error"
1453 " (packet length is short for unfeasible length)",
1455 bgp_notify_send (peer
, BGP_NOTIFY_UPDATE_ERR
,
1456 BGP_NOTIFY_UPDATE_MAL_ATTR
);
1460 /* Unfeasible Route Length. */
1461 withdraw_len
= stream_getw (s
);
1463 /* Unfeasible Route Length check. */
1464 if (stream_pnt (s
) + withdraw_len
> end
)
1466 zlog_err ("%s [Error] Update packet error"
1467 " (packet unfeasible length overflow %d)",
1468 peer
->host
, withdraw_len
);
1469 bgp_notify_send (peer
, BGP_NOTIFY_UPDATE_ERR
,
1470 BGP_NOTIFY_UPDATE_MAL_ATTR
);
1474 /* Unfeasible Route packet format check. */
1475 if (withdraw_len
> 0)
1477 ret
= bgp_nlri_sanity_check (peer
, AFI_IP
, stream_pnt (s
), withdraw_len
);
1481 if (BGP_DEBUG (packet
, PACKET_RECV
))
1482 zlog_debug ("%s [Update:RECV] Unfeasible NLRI received", peer
->host
);
1484 withdraw
.afi
= AFI_IP
;
1485 withdraw
.safi
= SAFI_UNICAST
;
1486 withdraw
.nlri
= stream_pnt (s
);
1487 withdraw
.length
= withdraw_len
;
1488 stream_forward_getp (s
, withdraw_len
);
1491 /* Attribute total length check. */
1492 if (stream_pnt (s
) + 2 > end
)
1494 zlog_warn ("%s [Error] Packet Error"
1495 " (update packet is short for attribute length)",
1497 bgp_notify_send (peer
, BGP_NOTIFY_UPDATE_ERR
,
1498 BGP_NOTIFY_UPDATE_MAL_ATTR
);
1502 /* Fetch attribute total length. */
1503 attribute_len
= stream_getw (s
);
1505 /* Attribute length check. */
1506 if (stream_pnt (s
) + attribute_len
> end
)
1508 zlog_warn ("%s [Error] Packet Error"
1509 " (update packet attribute length overflow %d)",
1510 peer
->host
, attribute_len
);
1511 bgp_notify_send (peer
, BGP_NOTIFY_UPDATE_ERR
,
1512 BGP_NOTIFY_UPDATE_MAL_ATTR
);
1516 /* Parse attribute when it exists. */
1519 ret
= bgp_attr_parse (peer
, &attr
, attribute_len
,
1520 &mp_update
, &mp_withdraw
);
1525 /* Logging the attribute. */
1526 if (BGP_DEBUG (update
, UPDATE_IN
))
1528 ret
= bgp_dump_attr (peer
, &attr
, attrstr
, BUFSIZ
);
1531 zlog (peer
->log
, LOG_DEBUG
, "%s rcvd UPDATE w/ attr: %s",
1532 peer
->host
, attrstr
);
1535 /* Network Layer Reachability Information. */
1536 update_len
= end
- stream_pnt (s
);
1540 /* Check NLRI packet format and prefix length. */
1541 ret
= bgp_nlri_sanity_check (peer
, AFI_IP
, stream_pnt (s
), update_len
);
1545 /* Set NLRI portion to structure. */
1546 update
.afi
= AFI_IP
;
1547 update
.safi
= SAFI_UNICAST
;
1548 update
.nlri
= stream_pnt (s
);
1549 update
.length
= update_len
;
1550 stream_forward_getp (s
, update_len
);
1553 /* NLRI is processed only when the peer is configured specific
1554 Address Family and Subsequent Address Family. */
1555 if (peer
->afc
[AFI_IP
][SAFI_UNICAST
])
1557 if (withdraw
.length
)
1558 bgp_nlri_parse (peer
, NULL
, &withdraw
);
1562 /* We check well-known attribute only for IPv4 unicast
1564 ret
= bgp_attr_check (peer
, &attr
);
1568 bgp_nlri_parse (peer
, &attr
, &update
);
1571 if (mp_update
.length
1572 && mp_update
.afi
== AFI_IP
1573 && mp_update
.safi
== SAFI_UNICAST
)
1574 bgp_nlri_parse (peer
, &attr
, &mp_update
);
1576 if (mp_withdraw
.length
1577 && mp_withdraw
.afi
== AFI_IP
1578 && mp_withdraw
.safi
== SAFI_UNICAST
)
1579 bgp_nlri_parse (peer
, NULL
, &mp_withdraw
);
1581 if (! attribute_len
&& ! withdraw_len
)
1583 /* End-of-RIB received */
1584 SET_FLAG (peer
->af_sflags
[AFI_IP
][SAFI_UNICAST
],
1585 PEER_STATUS_EOR_RECEIVED
);
1587 /* NSF delete stale route */
1588 if (peer
->nsf
[AFI_IP
][SAFI_UNICAST
])
1589 bgp_clear_stale_route (peer
, AFI_IP
, SAFI_UNICAST
);
1591 if (BGP_DEBUG (normal
, NORMAL
))
1592 zlog (peer
->log
, LOG_DEBUG
, "rcvd End-of-RIB for IPv4 Unicast from %s",
1596 if (peer
->afc
[AFI_IP
][SAFI_MULTICAST
])
1598 if (mp_update
.length
1599 && mp_update
.afi
== AFI_IP
1600 && mp_update
.safi
== SAFI_MULTICAST
)
1601 bgp_nlri_parse (peer
, &attr
, &mp_update
);
1603 if (mp_withdraw
.length
1604 && mp_withdraw
.afi
== AFI_IP
1605 && mp_withdraw
.safi
== SAFI_MULTICAST
)
1606 bgp_nlri_parse (peer
, NULL
, &mp_withdraw
);
1609 && mp_withdraw
.afi
== AFI_IP
1610 && mp_withdraw
.safi
== SAFI_MULTICAST
1611 && mp_withdraw
.length
== 0)
1613 /* End-of-RIB received */
1614 SET_FLAG (peer
->af_sflags
[AFI_IP
][SAFI_MULTICAST
],
1615 PEER_STATUS_EOR_RECEIVED
);
1617 /* NSF delete stale route */
1618 if (peer
->nsf
[AFI_IP
][SAFI_MULTICAST
])
1619 bgp_clear_stale_route (peer
, AFI_IP
, SAFI_MULTICAST
);
1621 if (BGP_DEBUG (normal
, NORMAL
))
1622 zlog (peer
->log
, LOG_DEBUG
, "rcvd End-of-RIB for IPv4 Multicast from %s",
1626 if (peer
->afc
[AFI_IP6
][SAFI_UNICAST
])
1628 if (mp_update
.length
1629 && mp_update
.afi
== AFI_IP6
1630 && mp_update
.safi
== SAFI_UNICAST
)
1631 bgp_nlri_parse (peer
, &attr
, &mp_update
);
1633 if (mp_withdraw
.length
1634 && mp_withdraw
.afi
== AFI_IP6
1635 && mp_withdraw
.safi
== SAFI_UNICAST
)
1636 bgp_nlri_parse (peer
, NULL
, &mp_withdraw
);
1639 && mp_withdraw
.afi
== AFI_IP6
1640 && mp_withdraw
.safi
== SAFI_UNICAST
1641 && mp_withdraw
.length
== 0)
1643 /* End-of-RIB received */
1644 SET_FLAG (peer
->af_sflags
[AFI_IP6
][SAFI_UNICAST
], PEER_STATUS_EOR_RECEIVED
);
1646 /* NSF delete stale route */
1647 if (peer
->nsf
[AFI_IP6
][SAFI_UNICAST
])
1648 bgp_clear_stale_route (peer
, AFI_IP6
, SAFI_UNICAST
);
1650 if (BGP_DEBUG (normal
, NORMAL
))
1651 zlog (peer
->log
, LOG_DEBUG
, "rcvd End-of-RIB for IPv6 Unicast from %s",
1655 if (peer
->afc
[AFI_IP6
][SAFI_MULTICAST
])
1657 if (mp_update
.length
1658 && mp_update
.afi
== AFI_IP6
1659 && mp_update
.safi
== SAFI_MULTICAST
)
1660 bgp_nlri_parse (peer
, &attr
, &mp_update
);
1662 if (mp_withdraw
.length
1663 && mp_withdraw
.afi
== AFI_IP6
1664 && mp_withdraw
.safi
== SAFI_MULTICAST
)
1665 bgp_nlri_parse (peer
, NULL
, &mp_withdraw
);
1668 && mp_withdraw
.afi
== AFI_IP6
1669 && mp_withdraw
.safi
== SAFI_MULTICAST
1670 && mp_withdraw
.length
== 0)
1672 /* End-of-RIB received */
1674 /* NSF delete stale route */
1675 if (peer
->nsf
[AFI_IP6
][SAFI_MULTICAST
])
1676 bgp_clear_stale_route (peer
, AFI_IP6
, SAFI_MULTICAST
);
1678 if (BGP_DEBUG (update
, UPDATE_IN
))
1679 zlog (peer
->log
, LOG_DEBUG
, "rcvd End-of-RIB for IPv6 Multicast from %s",
1683 if (peer
->afc
[AFI_IP
][SAFI_MPLS_VPN
])
1685 if (mp_update
.length
1686 && mp_update
.afi
== AFI_IP
1687 && mp_update
.safi
== BGP_SAFI_VPNV4
)
1688 bgp_nlri_parse_vpnv4 (peer
, &attr
, &mp_update
);
1690 if (mp_withdraw
.length
1691 && mp_withdraw
.afi
== AFI_IP
1692 && mp_withdraw
.safi
== BGP_SAFI_VPNV4
)
1693 bgp_nlri_parse_vpnv4 (peer
, NULL
, &mp_withdraw
);
1696 && mp_withdraw
.afi
== AFI_IP
1697 && mp_withdraw
.safi
== BGP_SAFI_VPNV4
1698 && mp_withdraw
.length
== 0)
1700 /* End-of-RIB received */
1702 if (BGP_DEBUG (update
, UPDATE_IN
))
1703 zlog (peer
->log
, LOG_DEBUG
, "rcvd End-of-RIB for VPNv4 Unicast from %s",
1708 /* Everything is done. We unintern temporary structures which
1709 interned in bgp_attr_parse(). */
1711 aspath_unintern (attr
.aspath
);
1713 community_unintern (attr
.community
);
1714 if (attr
.ecommunity
)
1715 ecommunity_unintern (attr
.ecommunity
);
1717 cluster_unintern (attr
.cluster
);
1719 transit_unintern (attr
.transit
);
1721 /* If peering is stopped due to some reason, do not generate BGP
1723 if (peer
->status
!= Established
)
1726 /* Increment packet counter. */
1728 peer
->update_time
= time (NULL
);
1730 /* Generate BGP event. */
1731 BGP_EVENT_ADD (peer
, Receive_UPDATE_message
);
1736 /* Notify message treatment function. */
1738 bgp_notify_receive (struct peer
*peer
, bgp_size_t size
)
1740 struct bgp_notify bgp_notify
;
1742 if (peer
->notify
.data
)
1744 XFREE (MTYPE_TMP
, peer
->notify
.data
);
1745 peer
->notify
.data
= NULL
;
1746 peer
->notify
.length
= 0;
1749 bgp_notify
.code
= stream_getc (peer
->ibuf
);
1750 bgp_notify
.subcode
= stream_getc (peer
->ibuf
);
1751 bgp_notify
.length
= size
- 2;
1752 bgp_notify
.data
= NULL
;
1754 /* Preserv notify code and sub code. */
1755 peer
->notify
.code
= bgp_notify
.code
;
1756 peer
->notify
.subcode
= bgp_notify
.subcode
;
1757 /* For further diagnostic record returned Data. */
1758 if (bgp_notify
.length
)
1760 peer
->notify
.length
= size
- 2;
1761 peer
->notify
.data
= XMALLOC (MTYPE_TMP
, size
- 2);
1762 memcpy (peer
->notify
.data
, stream_pnt (peer
->ibuf
), size
- 2);
1771 if (bgp_notify
.length
)
1773 bgp_notify
.data
= XMALLOC (MTYPE_TMP
, bgp_notify
.length
* 3);
1774 for (i
= 0; i
< bgp_notify
.length
; i
++)
1777 sprintf (c
, " %02x", stream_getc (peer
->ibuf
));
1778 strcat (bgp_notify
.data
, c
);
1783 sprintf (c
, "%02x", stream_getc (peer
->ibuf
));
1784 strcpy (bgp_notify
.data
, c
);
1788 bgp_notify_print(peer
, &bgp_notify
, "received");
1789 if (bgp_notify
.data
)
1790 XFREE (MTYPE_TMP
, bgp_notify
.data
);
1793 /* peer count update */
1796 if (peer
->status
== Established
)
1797 peer
->last_reset
= PEER_DOWN_NOTIFY_RECEIVED
;
1799 /* We have to check for Notify with Unsupported Optional Parameter.
1800 in that case we fallback to open without the capability option.
1801 But this done in bgp_stop. We just mark it here to avoid changing
1803 if (bgp_notify
.code
== BGP_NOTIFY_OPEN_ERR
&&
1804 bgp_notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_PARAM
)
1805 UNSET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1807 /* Also apply to Unsupported Capability until remote router support
1809 if (bgp_notify
.code
== BGP_NOTIFY_OPEN_ERR
&&
1810 bgp_notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
1811 UNSET_FLAG (peer
->sflags
, PEER_STATUS_CAPABILITY_OPEN
);
1813 BGP_EVENT_ADD (peer
, Receive_NOTIFICATION_message
);
1816 /* Keepalive treatment function -- get keepalive send keepalive */
1818 bgp_keepalive_receive (struct peer
*peer
, bgp_size_t size
)
1820 if (BGP_DEBUG (keepalive
, KEEPALIVE
))
1821 zlog_debug ("%s KEEPALIVE rcvd", peer
->host
);
1823 BGP_EVENT_ADD (peer
, Receive_KEEPALIVE_message
);
1826 /* Route refresh message is received. */
1828 bgp_route_refresh_receive (struct peer
*peer
, bgp_size_t size
)
1835 /* If peer does not have the capability, send notification. */
1836 if (! CHECK_FLAG (peer
->cap
, PEER_CAP_REFRESH_ADV
))
1838 plog_err (peer
->log
, "%s [Error] BGP route refresh is not enabled",
1840 bgp_notify_send (peer
,
1841 BGP_NOTIFY_HEADER_ERR
,
1842 BGP_NOTIFY_HEADER_BAD_MESTYPE
);
1846 /* Status must be Established. */
1847 if (peer
->status
!= Established
)
1849 plog_err (peer
->log
,
1850 "%s [Error] Route refresh packet received under status %s",
1851 peer
->host
, LOOKUP (bgp_status_msg
, peer
->status
));
1852 bgp_notify_send (peer
, BGP_NOTIFY_FSM_ERR
, 0);
1859 afi
= stream_getw (s
);
1860 reserved
= stream_getc (s
);
1861 safi
= stream_getc (s
);
1863 if (BGP_DEBUG (normal
, NORMAL
))
1864 zlog_debug ("%s rcvd REFRESH_REQ for afi/safi: %d/%d",
1865 peer
->host
, afi
, safi
);
1867 /* Check AFI and SAFI. */
1868 if ((afi
!= AFI_IP
&& afi
!= AFI_IP6
)
1869 || (safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
1870 && safi
!= BGP_SAFI_VPNV4
))
1872 if (BGP_DEBUG (normal
, NORMAL
))
1874 zlog_debug ("%s REFRESH_REQ for unrecognized afi/safi: %d/%d - ignored",
1875 peer
->host
, afi
, safi
);
1880 /* Adjust safi code. */
1881 if (safi
== BGP_SAFI_VPNV4
)
1882 safi
= SAFI_MPLS_VPN
;
1884 if (size
!= BGP_MSG_ROUTE_REFRESH_MIN_SIZE
- BGP_HEADER_SIZE
)
1887 u_char when_to_refresh
;
1891 if (size
- (BGP_MSG_ROUTE_REFRESH_MIN_SIZE
- BGP_HEADER_SIZE
) < 5)
1893 zlog_info ("%s ORF route refresh length error", peer
->host
);
1894 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
1898 when_to_refresh
= stream_getc (s
);
1899 end
= stream_pnt (s
) + (size
- 5);
1901 while (stream_pnt (s
) < end
)
1903 orf_type
= stream_getc (s
);
1904 orf_len
= stream_getw (s
);
1906 if (orf_type
== ORF_TYPE_PREFIX
1907 || orf_type
== ORF_TYPE_PREFIX_OLD
)
1909 u_char
*p_pnt
= stream_pnt (s
);
1910 u_char
*p_end
= stream_pnt (s
) + orf_len
;
1911 struct orf_prefix orfp
;
1919 if (BGP_DEBUG (normal
, NORMAL
))
1921 zlog_debug ("%s rcvd Prefixlist ORF(%d) length %d",
1922 peer
->host
, orf_type
, orf_len
);
1925 /* ORF prefix-list name */
1926 sprintf (name
, "%s.%d.%d", peer
->host
, afi
, safi
);
1928 while (p_pnt
< p_end
)
1930 memset (&orfp
, 0, sizeof (struct orf_prefix
));
1932 if (common
& ORF_COMMON_PART_REMOVE_ALL
)
1934 if (BGP_DEBUG (normal
, NORMAL
))
1935 zlog_debug ("%s rcvd Remove-All pfxlist ORF request", peer
->host
);
1936 prefix_bgp_orf_remove_all (name
);
1939 memcpy (&seq
, p_pnt
, sizeof (u_int32_t
));
1940 p_pnt
+= sizeof (u_int32_t
);
1941 orfp
.seq
= ntohl (seq
);
1944 orfp
.p
.prefixlen
= *p_pnt
++;
1945 orfp
.p
.family
= afi2family (afi
);
1946 psize
= PSIZE (orfp
.p
.prefixlen
);
1947 memcpy (&orfp
.p
.u
.prefix
, p_pnt
, psize
);
1950 if (BGP_DEBUG (normal
, NORMAL
))
1951 zlog_debug ("%s rcvd %s %s seq %u %s/%d ge %d le %d",
1953 (common
& ORF_COMMON_PART_REMOVE
? "Remove" : "Add"),
1954 (common
& ORF_COMMON_PART_DENY
? "deny" : "permit"),
1956 inet_ntop (orfp
.p
.family
, &orfp
.p
.u
.prefix
, buf
, BUFSIZ
),
1957 orfp
.p
.prefixlen
, orfp
.ge
, orfp
.le
);
1959 ret
= prefix_bgp_orf_set (name
, afi
, &orfp
,
1960 (common
& ORF_COMMON_PART_DENY
? 0 : 1 ),
1961 (common
& ORF_COMMON_PART_REMOVE
? 0 : 1));
1963 if (ret
!= CMD_SUCCESS
)
1965 if (BGP_DEBUG (normal
, NORMAL
))
1966 zlog_debug ("%s Received misformatted prefixlist ORF. Remove All pfxlist", peer
->host
);
1967 prefix_bgp_orf_remove_all (name
);
1971 peer
->orf_plist
[afi
][safi
] =
1972 prefix_list_lookup (AFI_ORF_PREFIX
, name
);
1974 stream_forward_getp (s
, orf_len
);
1976 if (BGP_DEBUG (normal
, NORMAL
))
1977 zlog_debug ("%s rcvd Refresh %s ORF request", peer
->host
,
1978 when_to_refresh
== REFRESH_DEFER
? "Defer" : "Immediate");
1979 if (when_to_refresh
== REFRESH_DEFER
)
1983 /* First update is deferred until ORF or ROUTE-REFRESH is received */
1984 if (CHECK_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_WAIT_REFRESH
))
1985 UNSET_FLAG (peer
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_WAIT_REFRESH
);
1987 /* Perform route refreshment to the peer */
1988 bgp_announce_route (peer
, afi
, safi
);
1992 bgp_capability_msg_parse (struct peer
*peer
, u_char
*pnt
, bgp_size_t length
)
1995 struct capability cap
;
2006 /* We need at least action, capability code and capability length. */
2009 zlog_info ("%s Capability length error", peer
->host
);
2010 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
2016 /* Fetch structure to the byte stream. */
2017 memcpy (&cap
, pnt
+ 1, sizeof (struct capability
));
2019 /* Action value check. */
2020 if (action
!= CAPABILITY_ACTION_SET
2021 && action
!= CAPABILITY_ACTION_UNSET
)
2023 zlog_info ("%s Capability Action Value error %d",
2024 peer
->host
, action
);
2025 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
2029 if (BGP_DEBUG (normal
, NORMAL
))
2030 zlog_debug ("%s CAPABILITY has action: %d, code: %u, length %u",
2031 peer
->host
, action
, cap
.code
, cap
.length
);
2033 /* Capability length check. */
2034 if (pnt
+ (cap
.length
+ 3) > end
)
2036 zlog_info ("%s Capability length error", peer
->host
);
2037 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
, 0);
2041 /* We know MP Capability Code. */
2042 if (cap
.code
== CAPABILITY_CODE_MP
)
2044 afi
= ntohs (cap
.mpc
.afi
);
2045 safi
= cap
.mpc
.safi
;
2047 /* Ignore capability when override-capability is set. */
2048 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_OVERRIDE_CAPABILITY
))
2051 /* Address family check. */
2054 && (safi
== SAFI_UNICAST
2055 || safi
== SAFI_MULTICAST
2056 || safi
== BGP_SAFI_VPNV4
))
2058 if (BGP_DEBUG (normal
, NORMAL
))
2059 zlog_debug ("%s CAPABILITY has %s MP_EXT CAP for afi/safi: %u/%u",
2061 action
== CAPABILITY_ACTION_SET
2062 ? "Advertising" : "Removing",
2063 ntohs(cap
.mpc
.afi
) , cap
.mpc
.safi
);
2065 /* Adjust safi code. */
2066 if (safi
== BGP_SAFI_VPNV4
)
2067 safi
= SAFI_MPLS_VPN
;
2069 if (action
== CAPABILITY_ACTION_SET
)
2071 peer
->afc_recv
[afi
][safi
] = 1;
2072 if (peer
->afc
[afi
][safi
])
2074 peer
->afc_nego
[afi
][safi
] = 1;
2075 bgp_announce_route (peer
, afi
, safi
);
2080 peer
->afc_recv
[afi
][safi
] = 0;
2081 peer
->afc_nego
[afi
][safi
] = 0;
2083 if (peer_active_nego (peer
))
2084 bgp_clear_route (peer
, afi
, safi
);
2086 BGP_EVENT_ADD (peer
, BGP_Stop
);
2092 zlog_warn ("%s unrecognized capability code: %d - ignored",
2093 peer
->host
, cap
.code
);
2095 pnt
+= cap
.length
+ 3;
2100 /* Dynamic Capability is received. */
2102 bgp_capability_receive (struct peer
*peer
, bgp_size_t size
)
2107 /* Fetch pointer. */
2108 pnt
= stream_pnt (peer
->ibuf
);
2110 if (BGP_DEBUG (normal
, NORMAL
))
2111 zlog_debug ("%s rcv CAPABILITY", peer
->host
);
2113 /* If peer does not have the capability, send notification. */
2114 if (! CHECK_FLAG (peer
->cap
, PEER_CAP_DYNAMIC_ADV
))
2116 plog_err (peer
->log
, "%s [Error] BGP dynamic capability is not enabled",
2118 bgp_notify_send (peer
,
2119 BGP_NOTIFY_HEADER_ERR
,
2120 BGP_NOTIFY_HEADER_BAD_MESTYPE
);
2124 /* Status must be Established. */
2125 if (peer
->status
!= Established
)
2127 plog_err (peer
->log
,
2128 "%s [Error] Dynamic capability packet received under status %s", peer
->host
, LOOKUP (bgp_status_msg
, peer
->status
));
2129 bgp_notify_send (peer
, BGP_NOTIFY_FSM_ERR
, 0);
2134 ret
= bgp_capability_msg_parse (peer
, pnt
, size
);
2137 /* BGP read utility function. */
2139 bgp_read_packet (struct peer
*peer
)
2144 readsize
= peer
->packet_size
- stream_get_endp (peer
->ibuf
);
2146 /* If size is zero then return. */
2150 /* Read packet from fd. */
2151 nbytes
= stream_read_unblock (peer
->ibuf
, peer
->fd
, readsize
);
2153 /* If read byte is smaller than zero then error occured. */
2156 if (errno
== EAGAIN
)
2159 plog_err (peer
->log
, "%s [Error] bgp_read_packet error: %s",
2160 peer
->host
, safe_strerror (errno
));
2162 if (peer
->status
== Established
)
2164 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
))
2166 peer
->last_reset
= PEER_DOWN_NSF_CLOSE_SESSION
;
2167 SET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
2170 peer
->last_reset
= PEER_DOWN_CLOSE_SESSION
;
2173 BGP_EVENT_ADD (peer
, TCP_fatal_error
);
2177 /* When read byte is zero : clear bgp peer and return */
2180 if (BGP_DEBUG (events
, EVENTS
))
2181 plog_debug (peer
->log
, "%s [Event] BGP connection closed fd %d",
2182 peer
->host
, peer
->fd
);
2184 if (peer
->status
== Established
)
2186 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_NSF_MODE
))
2188 peer
->last_reset
= PEER_DOWN_NSF_CLOSE_SESSION
;
2189 SET_FLAG (peer
->sflags
, PEER_STATUS_NSF_WAIT
);
2192 peer
->last_reset
= PEER_DOWN_CLOSE_SESSION
;
2195 BGP_EVENT_ADD (peer
, TCP_connection_closed
);
2199 /* We read partial packet. */
2200 if (stream_get_endp (peer
->ibuf
) != peer
->packet_size
)
2208 bgp_marker_all_one (struct stream
*s
, int length
)
2212 for (i
= 0; i
< length
; i
++)
2213 if (s
->data
[i
] != 0xff)
2219 /* Starting point of packet process function. */
2221 bgp_read (struct thread
*thread
)
2227 char notify_data_length
[2];
2229 /* Yes first of all get peer pointer. */
2230 peer
= THREAD_ARG (thread
);
2231 peer
->t_read
= NULL
;
2233 /* For non-blocking IO check. */
2234 if (peer
->status
== Connect
)
2236 bgp_connect_check (peer
);
2243 zlog_err ("bgp_read peer's fd is negative value %d", peer
->fd
);
2246 BGP_READ_ON (peer
->t_read
, bgp_read
, peer
->fd
);
2249 /* Read packet header to determine type of the packet */
2250 if (peer
->packet_size
== 0)
2251 peer
->packet_size
= BGP_HEADER_SIZE
;
2253 if (stream_get_endp (peer
->ibuf
) < BGP_HEADER_SIZE
)
2255 ret
= bgp_read_packet (peer
);
2257 /* Header read error or partial read packet. */
2261 /* Get size and type. */
2262 stream_forward_getp (peer
->ibuf
, BGP_MARKER_SIZE
);
2263 memcpy (notify_data_length
, stream_pnt (peer
->ibuf
), 2);
2264 size
= stream_getw (peer
->ibuf
);
2265 type
= stream_getc (peer
->ibuf
);
2267 if (BGP_DEBUG (normal
, NORMAL
) && type
!= 2 && type
!= 0)
2268 zlog_debug ("%s rcv message type %d, length (excl. header) %d",
2269 peer
->host
, type
, size
- BGP_HEADER_SIZE
);
2272 if (((type
== BGP_MSG_OPEN
) || (type
== BGP_MSG_KEEPALIVE
))
2273 && ! bgp_marker_all_one (peer
->ibuf
, BGP_MARKER_SIZE
))
2275 bgp_notify_send (peer
,
2276 BGP_NOTIFY_HEADER_ERR
,
2277 BGP_NOTIFY_HEADER_NOT_SYNC
);
2281 /* BGP type check. */
2282 if (type
!= BGP_MSG_OPEN
&& type
!= BGP_MSG_UPDATE
2283 && type
!= BGP_MSG_NOTIFY
&& type
!= BGP_MSG_KEEPALIVE
2284 && type
!= BGP_MSG_ROUTE_REFRESH_NEW
2285 && type
!= BGP_MSG_ROUTE_REFRESH_OLD
2286 && type
!= BGP_MSG_CAPABILITY
)
2288 if (BGP_DEBUG (normal
, NORMAL
))
2289 plog_debug (peer
->log
,
2290 "%s unknown message type 0x%02x",
2292 bgp_notify_send_with_data (peer
,
2293 BGP_NOTIFY_HEADER_ERR
,
2294 BGP_NOTIFY_HEADER_BAD_MESTYPE
,
2298 /* Mimimum packet length check. */
2299 if ((size
< BGP_HEADER_SIZE
)
2300 || (size
> BGP_MAX_PACKET_SIZE
)
2301 || (type
== BGP_MSG_OPEN
&& size
< BGP_MSG_OPEN_MIN_SIZE
)
2302 || (type
== BGP_MSG_UPDATE
&& size
< BGP_MSG_UPDATE_MIN_SIZE
)
2303 || (type
== BGP_MSG_NOTIFY
&& size
< BGP_MSG_NOTIFY_MIN_SIZE
)
2304 || (type
== BGP_MSG_KEEPALIVE
&& size
!= BGP_MSG_KEEPALIVE_MIN_SIZE
)
2305 || (type
== BGP_MSG_ROUTE_REFRESH_NEW
&& size
< BGP_MSG_ROUTE_REFRESH_MIN_SIZE
)
2306 || (type
== BGP_MSG_ROUTE_REFRESH_OLD
&& size
< BGP_MSG_ROUTE_REFRESH_MIN_SIZE
)
2307 || (type
== BGP_MSG_CAPABILITY
&& size
< BGP_MSG_CAPABILITY_MIN_SIZE
))
2309 if (BGP_DEBUG (normal
, NORMAL
))
2310 plog_debug (peer
->log
,
2311 "%s bad message length - %d for %s",
2313 type
== 128 ? "ROUTE-REFRESH" :
2314 bgp_type_str
[(int) type
]);
2315 bgp_notify_send_with_data (peer
,
2316 BGP_NOTIFY_HEADER_ERR
,
2317 BGP_NOTIFY_HEADER_BAD_MESLEN
,
2318 (u_char
*) notify_data_length
, 2);
2322 /* Adjust size to message length. */
2323 peer
->packet_size
= size
;
2326 ret
= bgp_read_packet (peer
);
2330 /* Get size and type again. */
2331 size
= stream_getw_from (peer
->ibuf
, BGP_MARKER_SIZE
);
2332 type
= stream_getc_from (peer
->ibuf
, BGP_MARKER_SIZE
+ 2);
2334 /* BGP packet dump function. */
2335 bgp_dump_packet (peer
, type
, peer
->ibuf
);
2337 size
= (peer
->packet_size
- BGP_HEADER_SIZE
);
2339 /* Read rest of the packet and call each sort of packet routine */
2344 bgp_open_receive (peer
, size
); /* XXX return value ignored! */
2346 case BGP_MSG_UPDATE
:
2347 peer
->readtime
= time(NULL
); /* Last read timer reset */
2348 bgp_update_receive (peer
, size
);
2350 case BGP_MSG_NOTIFY
:
2351 bgp_notify_receive (peer
, size
);
2353 case BGP_MSG_KEEPALIVE
:
2354 peer
->readtime
= time(NULL
); /* Last read timer reset */
2355 bgp_keepalive_receive (peer
, size
);
2357 case BGP_MSG_ROUTE_REFRESH_NEW
:
2358 case BGP_MSG_ROUTE_REFRESH_OLD
:
2360 bgp_route_refresh_receive (peer
, size
);
2362 case BGP_MSG_CAPABILITY
:
2363 peer
->dynamic_cap_in
++;
2364 bgp_capability_receive (peer
, size
);
2368 /* Clear input buffer. */
2369 peer
->packet_size
= 0;
2371 stream_reset (peer
->ibuf
);
2374 if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_ACCEPT_PEER
))
2376 if (BGP_DEBUG (events
, EVENTS
))
2377 zlog_debug ("%s [Event] Accepting BGP peer delete", peer
->host
);
2379 /* we've lost track of a reference to ACCEPT_PEER somehow. It doesnt
2380 * _seem_ to be the 'update realpeer with accept peer' hack, yet it
2381 * *must* be.. Very very odd, but I give up trying to
2382 * root cause this - ACCEPT_PEER is a dirty hack, it should be fixed
2383 * instead, which would make root-causing this a moot point..
2384 * A hack because of a hack, appropriate.
2386 peer_unlock (peer
); /* god knows what reference... ACCEPT_PEER sucks */