summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-09-24 22:12:11 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2009-09-24 22:12:11 +0200
commitbe6e39ebbf7ed107abde6fc1a18e8827ca47a7c1 (patch)
treea832ae3fd3377930b0f7703e14d3452f9ae3f0fc
parent2d507e64b7d7029906aac30dbea317795b5339de (diff)
downloadbird-be6e39ebbf7ed107abde6fc1a18e8827ca47a7c1.tar
bird-be6e39ebbf7ed107abde6fc1a18e8827ca47a7c1.zip
Passive option.
-rw-r--r--doc/bird.sgml5
-rw-r--r--proto/bgp/bgp.c7
-rw-r--r--proto/bgp/bgp.h1
-rw-r--r--proto/bgp/config.Y4
4 files changed, 13 insertions, 4 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml
index 258b842..ceff31d 100644
--- a/doc/bird.sgml
+++ b/doc/bird.sgml
@@ -868,6 +868,11 @@ for each neighbor using the following configuration parameters:
of BGP sessions. Default: no authentication. Password has to be set by
external utility (e.g. setkey(8)) on BSD systems.
+ <tag>passive <m/switch/</tag> Standard BGP behavior is both
+ initiating outgoing connections and accepting incoming
+ connections. In passive mode, outgoing connections are not
+ initiated. Default: off.
+
<tag>rr client</tag> Be a route reflector and treat the neighbor as
a route reflection client. Default: disabled.
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 0c8ee6d..af5dbfc 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -120,7 +120,9 @@ bgp_startup(struct bgp_proto *p)
{
BGP_TRACE(D_EVENTS, "Started");
p->start_state = p->cf->capabilities ? BSS_CONNECT : BSS_CONNECT_NOCAP;
- bgp_active(p);
+
+ if (!p->cf->passive)
+ bgp_active(p);
}
static void
@@ -292,7 +294,8 @@ bgp_decision(void *vp)
DBG("BGP: Decision start\n");
if ((p->p.proto_state == PS_START)
- && (p->outgoing_conn.state == BS_IDLE))
+ && (p->outgoing_conn.state == BS_IDLE)
+ && (!p->cf->passive))
bgp_active(p);
if ((p->p.proto_state == PS_STOP)
diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h
index 092c3b3..0a82be2 100644
--- a/proto/bgp/bgp.h
+++ b/proto/bgp/bgp.h
@@ -33,6 +33,7 @@ struct bgp_config {
int rs_client; /* Whether neighbor is RS client of me */
int advertise_ipv4; /* Whether we should add IPv4 capability advertisement to OPEN message */
u32 route_limit; /* Number of routes that may be imported, 0 means disable limit */
+ int passive; /* Do not initiate outgoing connection */
unsigned connect_retry_time;
unsigned hold_time, initial_hold_time;
unsigned keepalive_time;
diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y
index 872fb27..7360820 100644
--- a/proto/bgp/config.Y
+++ b/proto/bgp/config.Y
@@ -22,7 +22,7 @@ CF_KEYWORDS(BGP, LOCAL, NEIGHBOR, AS, HOLD, TIME, CONNECT, RETRY, KEEPALIVE,
BGP_PATH, BGP_LOCAL_PREF, BGP_MED, BGP_ORIGIN, BGP_NEXT_HOP,
BGP_ATOMIC_AGGR, BGP_AGGREGATOR, BGP_COMMUNITY, SOURCE, ADDRESS,
PASSWORD, RR, RS, CLIENT, CLUSTER, ID, AS4, ADVERTISE, IPV4,
- CAPABILITIES, LIMIT)
+ CAPABILITIES, LIMIT, PASSIVE)
CF_GRAMMAR
@@ -34,7 +34,6 @@ bgp_proto_start: proto_start BGP {
BGP_CFG->hold_time = 240;
BGP_CFG->connect_retry_time = 120;
BGP_CFG->initial_hold_time = 240;
- BGP_CFG->default_med = 0;
BGP_CFG->compare_path_lengths = 1;
BGP_CFG->start_delay_time = 5;
BGP_CFG->error_amnesia_time = 300;
@@ -78,6 +77,7 @@ bgp_proto:
| bgp_proto ADVERTISE IPV4 bool ';' { BGP_CFG->advertise_ipv4 = $4; }
| bgp_proto PASSWORD TEXT ';' { BGP_CFG->password = $3; }
| bgp_proto ROUTE LIMIT expr ';' { BGP_CFG->route_limit = $4; }
+ | bgp_proto PASSIVE bool ';' { BGP_CFG->passive = $3; }
;
CF_ADDTO(dynamic_attr, BGP_PATH