[bgpd] Add 'bgp open-accept' option, to send OPEN immediately on accepted conns

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.
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog
index 6fe2b0f..e92a72a 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 15bd8a6..df1cfb7 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -616,7 +616,8 @@
 	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 54f1170..9086737 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -279,6 +279,28 @@
   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 @@
   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 8eb0d2e..bda35ae 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -81,6 +81,7 @@
     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 @@
       /* 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 @@
       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 afe0663..89dde8f 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -59,6 +59,7 @@
 #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.  */