Go to file
Sarita Patra 6c4d8732e9 bgpd: Fix BGP session stuck in OpenConfirm state
Issue:
1. Initially BGP start listening to socket.
2. Start timer expires and BGP tries to connect to peer and moved
   to Idle->connect (lets say peer datastructre X)
3. Connect for X succeeds and hence moved from idle ->connect with
   FD-x.
4. A incoming connection is accepted and a new peer datastructure Y
   is created with FD-y moves from idle->Active state.
5. Peer datastercture Y FD-y sends out OPEN and moves to
   Active->Opensent state.
6. Peer datastrcture Y FD-y receives OPEN and moved from Opensent->
   Openconfirm state.
7. Meanwhile on peer datastrcture X FD-x sends out a OPEN message
   and moved from connect->Opensent.
8. For peer datastrcture Y FD-y keep alive is received and it is
   moved from OpenConfirm->Established.
9. In this case peer datastructure Y FD-y is a accepted connection
   so we try to copy all its parameter to peer datastructure X and
   delete Y.
10. During this process TCP connection for the accepted connection
    (FD-y) goes down and hence get remote address and port fails.
11. With this failure bgp_stop function for both peer datastrure X
    and peer datastructure Y is called.
12. By this time all the parameters include state for datastrcture
    for X and Y are exchanged. Peer Y FD-y when it entered this
    function had state OpenConfirm still which has been moved to peer
    datastrcture X.
13. In bgp_stop it will stop all the timers and take action only if
    peer is in established state. Now that peer datastrcture X and Y
    are not in established state (in this function) it will simply
    close all timers and close the socket and assigns socket for both
    the peer datastrcture to -1.
14. Peer datastrcture Y will be deleted as it is a datastrcture created
    due to accept of connection where as peer datastrcture X will be held
    as it is created with configuration.
15. Now peer datastrcture X now holds a state of OpenConfirm without any
    timers running.
16. With this any new incoming connection will never be able to establish
    as there is config connection X which is stuck in OpenConfirm.

Fix:
 While transferring the peer datastructure Y FD-y (accepted connection)
 to the peer datastructure X, if TCP connection for FD-y goes down, then
 1. Call fsm event bgp_stop for X (do cleanup with bgp_stop and move the
    state to Idle) and
 2. Call fsm event bgp_stop for Y (do cleanup with bgp_stop and gets deleted
    since it is an accept connection).

Signed-off-by: Sarita Patra <saritap@vmware.com>
2020-08-20 23:36:22 -07:00
.github .github: move pr template to subdir 2019-03-29 16:51:58 +00:00
alpine alpine: enable multi-arch builds 2020-06-24 16:33:18 -04:00
babeld *: un-split strings across lines 2020-07-14 10:37:25 +02:00
bfdd bfdd: Allow it to work when V6 is completely turned off 2020-08-14 09:20:09 -04:00
bgpd bgpd: Fix BGP session stuck in OpenConfirm state 2020-08-20 23:36:22 -07:00
debian debian: Add missing daemons to logrotation knowledge 2020-06-25 07:13:50 -04:00
doc Merge pull request #6899 from opensourcerouting/bfd-knobs 2020-08-14 08:54:36 -04:00
docker docker: don't fail on chown /etc/frr 2020-06-10 00:20:04 -04:00
eigrpd *: introduce DEFPY_YANG & friends 2020-08-03 15:17:03 -03:00
fpm *: Replace sizeof something to sizeof(something) 2020-03-08 21:44:53 +02:00
gdb bgpd: Convert binfo to path 2018-10-09 14:26:30 -04:00
grpc lib: don't ignore error messages generated during the commit apply phase 2020-08-14 21:37:14 -03:00
include linux: UAPI for MAC sync 2020-08-05 06:46:12 -07:00
isisd isisd : Transformational changes to support different VRFs. 2020-08-14 13:46:22 -07:00
ldpd ldpd: ldp-oc withdraw fix 2020-08-05 16:01:52 -04:00
lib lib: adapt plugin to use new Sysrepo version 2020-08-20 11:53:46 -03:00
m4 build: find all future minor versions of python3 2020-07-09 06:47:31 +02:00
mlag zebra: Do not build mlag protobuf support if version 3 is not avail 2019-12-15 09:37:51 -05:00
nhrpd nhrpd: ignore zebra updates about our routes being deleted/added 2020-07-31 13:50:57 +02:00
ospf6d Merge pull request #6732 from opensourcerouting/printfrr-prep 2020-07-29 14:29:34 -04:00
ospfclient *: Replace s_addr 0 => INADDR_ANY 2020-02-06 09:00:12 +02:00
ospfd ospfd: send ARP requests using zebra 2020-08-12 23:20:52 +02:00
pbrd Merge pull request #6730 from wesleycoakley/pbrd-dscp-ecn 2020-07-23 12:08:38 -04:00
pimd pimd: Allow multiple secondary addresses to work 2020-08-10 10:32:17 -04:00
pkgsrc *: cleanup .gitignore files 2018-09-08 21:30:42 +02:00
python build: fix Makefile rule redefinition 2020-07-17 05:54:54 +02:00
qpb build: add LLVM bitcode targets 2020-05-05 14:39:12 +02:00
redhat redhat: Update logrotate to have knowledge of all daemons 2020-06-25 07:12:59 -04:00
ripd *: introduce DEFPY_YANG & friends 2020-08-03 15:17:03 -03:00
ripngd *: introduce DEFPY_YANG & friends 2020-08-03 15:17:03 -03:00
sharpd sharpd: add a command to send ARP/NDP requests 2020-08-12 23:20:04 +02:00
snapcraft snapcraft: Add vrrpd to the snapcraft package 2019-11-19 10:46:33 +01:00
solaris doc: rename man pages to frr-* 2020-01-15 14:05:11 +01:00
staticd staticd: fix warning when creating routes without SR-TE colors 2020-08-19 20:07:01 -03:00
tests isisd : Transformational changes to support different VRFs. 2020-08-14 13:46:22 -07:00
tools Merge pull request #6738 from deastoe/frr-reload-log-level 2020-08-20 13:42:34 +00:00
vrrpd Merge pull request #6908 from qlyoung/vrrp-add-vrf-module 2020-08-13 11:10:03 -03:00
vtysh Merge pull request #6809 from opensourcerouting/staticd-disable-acl 2020-08-04 14:01:26 -04:00
watchfrr watchfrr: add (network) namespace support 2020-07-22 12:56:04 +02:00
yang Merge pull request #5702 from vishaldhingra/bgp_nb 2020-08-18 11:50:09 -04:00
zebra Merge pull request #6951 from donaldsharp/zebra_table 2020-08-20 14:25:14 +00:00
.clang-format clang-format: add FOREACH_SAFI to the ForEachMacros list 2020-08-03 12:18:24 -03:00
.dir-locals.el tools: fix emacs configuration file 2019-11-04 11:45:52 -03:00
.dockerignore docker: Make docker image on CentOS 7 2019-11-26 19:29:30 +00:00
.git-blame-ignore-revs *: Give git a clue about our whitespace changes 2020-08-18 07:54:07 -04:00
.gitignore python: add graphviz callgraphs 2020-05-05 14:39:12 +02:00
bootstrap.sh autoreconf -i 2007-02-06 19:28:28 +00:00
buildtest.sh config: switch a few references to say FRR 2017-07-12 11:25:33 -05:00
changelog-auto.in debian: cleanly split off from dist tarball 2019-02-19 21:31:18 +01:00
config.version.in build: carry --with-pkg-extra-version into tarballs 2018-10-24 15:11:50 +02:00
configure.ac build: Allow removal of build configs from version string 2020-06-19 11:15:43 -05:00
COPYING *: make consistent & update GPLv2 file headers 2017-05-15 16:37:41 +02:00
COPYING-LGPLv2.1 build: remove LGPL v2.0, add LGPL v2.1 2016-11-15 17:19:38 +09:00
Makefile.am python: add graphviz callgraphs 2020-05-05 14:39:12 +02:00
README.md README.md: Add FRR Icon 2019-10-29 12:42:06 -04:00
stamp-h.in Initial revision 2002-12-13 20:15:29 +00:00

Icon

FRRouting

FRR is free software that implements and manages various IPv4 and IPv6 routing protocols. It runs on nearly all distributions of Linux and BSD as well as Solaris and supports all modern CPU architectures.

FRR currently supports the following protocols:

  • BGP
  • OSPFv2
  • OSPFv3
  • RIPv1
  • RIPv2
  • RIPng
  • IS-IS
  • PIM-SM/MSDP
  • LDP
  • BFD
  • Babel
  • PBR
  • OpenFabric
  • VRRP
  • EIGRP (alpha)
  • NHRP (alpha)

Installation & Use

For source tarballs, see the releases page.

For Debian and its derivatives, use the APT repository at https://deb.frrouting.org/.

Instructions on building and installing from source for supported platforms may be found in the developer docs.

Once installed, please refer to the user guide for instructions on use.

Community

The FRRouting email list server is located here and offers the following public lists:

Topic List
Development dev@lists.frrouting.org
Users & Operators frog@lists.frrouting.org
Announcements announce@lists.frrouting.org

For chat, we currently use Slack. You can join by clicking the "Slack" link under the Participate section of our website.

Contributing

FRR maintains developer's documentation which contains the project workflow and expectations for contributors. Some technical documentation on project internals is also available.

We welcome and appreciate all contributions, no matter how small!

Security

To report security issues, please use our security mailing list:

security [at] lists.frrouting.org