summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/ChangeLog9
-rw-r--r--bgpd/bgp_fsm.c3
-rw-r--r--bgpd/bgp_vty.c26
-rw-r--r--bgpd/bgpd.c9
-rw-r--r--bgpd/bgpd.h1
5 files changed, 47 insertions, 1 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog
index 6fe2b0f5..e92a72a9 100644
--- a/bgpd/ChangeLog
+++ b/bgpd/ChangeLog
@@ -292,6 +292,15 @@
* bgp_debug.c: (community_str,community_com2str) Check com
pointer before dereferencing.
+2007-08-31 Paul Jakma <paul.jakma@sun.com>
+
+ * (general) Add 'bgp open-accept' option, to allow bgpd to send OPEN
+ on accepted connections, i.e. to not wait till after
+ collision-detect to send OPEN, which appears to be allowed in
+ RFC4271. This may help speed up establishing sessions, or help
+ avoid FSM problems with sessions to certain peers. Not enabled by
+ default though.
+
2007-08-27 Paul Jakma <paul.jakma@sun.com>
* bgp_route.c: (bgp_announce_check) Fix bug #398, slight
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index 15bd8a6c..df1cfb7b 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -616,7 +616,8 @@ bgp_connect_success (struct peer *peer)
zlog_debug ("%s passive open", peer->host);
}
- if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
+ if (!CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER)
+ || bgp_option_check (BGP_OPT_ALWAYS_OPEN))
bgp_open_send (peer);
return 0;
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 54f11701..90867373 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -279,6 +279,28 @@ DEFUN (no_bgp_config_type,
return CMD_SUCCESS;
}
+DEFUN_HIDDEN (bgp_open_accept,
+ bgp_open_accept_cmd,
+ "bgp open-accept",
+ BGP_STR
+ "Send OPEN immediately on accepted connections\n")
+{
+ bgp_option_set (BGP_OPT_ALWAYS_OPEN);
+ return CMD_SUCCESS;
+}
+
+DEFUN_HIDDEN (no_bgp_open_accept,
+ no_bgp_open_accept_cmd,
+ "no bgp open-accept",
+ NO_STR
+ BGP_STR
+ "Send OPEN immediately on accepted connections\n")
+
+{
+ bgp_option_unset (BGP_OPT_ALWAYS_OPEN);
+ return CMD_SUCCESS;
+}
+
DEFUN (no_synchronization,
no_synchronization_cmd,
"no synchronization",
@@ -8820,6 +8842,10 @@ bgp_vty_init (void)
install_element (CONFIG_NODE, &bgp_config_type_cmd);
install_element (CONFIG_NODE, &no_bgp_config_type_cmd);
+ /* "bgp open-all" commands. */
+ install_element (CONFIG_NODE, &bgp_open_accept_cmd);
+ install_element (CONFIG_NODE, &no_bgp_open_accept_cmd);
+
/* Dummy commands (Currently not supported) */
install_element (BGP_NODE, &no_synchronization_cmd);
install_element (BGP_NODE, &no_auto_summary_cmd);
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 8eb0d2e4..bda35ae5 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -81,6 +81,7 @@ bgp_option_set (int flag)
case BGP_OPT_NO_FIB:
case BGP_OPT_MULTIPLE_INSTANCE:
case BGP_OPT_CONFIG_CISCO:
+ case BGP_OPT_ALWAYS_OPEN:
SET_FLAG (bm->options, flag);
break;
default:
@@ -100,6 +101,7 @@ bgp_option_unset (int flag)
/* Fall through. */
case BGP_OPT_NO_FIB:
case BGP_OPT_CONFIG_CISCO:
+ case BGP_OPT_ALWAYS_OPEN:
UNSET_FLAG (bm->options, flag);
break;
default:
@@ -4910,6 +4912,13 @@ bgp_config_write (struct vty *vty)
write++;
}
+ /* BGP Open-Always */
+ if (bgp_option_check (BGP_OPT_ALWAYS_OPEN))
+ {
+ vty_out (vty, "bgp open-accept%s", VTY_NEWLINE);
+ write++;
+ }
+
/* BGP configuration. */
for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
{
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index afe06635..89dde8f1 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -59,6 +59,7 @@ struct bgp_master
#define BGP_OPT_NO_FIB (1 << 0)
#define BGP_OPT_MULTIPLE_INSTANCE (1 << 1)
#define BGP_OPT_CONFIG_CISCO (1 << 2)
+#define BGP_OPT_ALWAYS_OPEN (1 << 3)
};
/* BGP instance structure. */