summaryrefslogtreecommitdiffstats
path: root/proto
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2010-05-31 11:35:29 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2010-05-31 11:35:29 +0200
commita34b09349e809a6d8f696fb0897c0bfdc3b66159 (patch)
tree97a09bd8adc208676e466c7dacbaf21fbcf2f0f4 /proto
parent9b061f7ea5933f70c200bb3b3a7be5a2e472e805 (diff)
downloadbird-a34b09349e809a6d8f696fb0897c0bfdc3b66159.tar
bird-a34b09349e809a6d8f696fb0897c0bfdc3b66159.zip
Disable BGP protocol when cannot open listening socket.
Diffstat (limited to 'proto')
-rw-r--r--proto/bgp/bgp.c17
-rw-r--r--proto/bgp/bgp.h1
2 files changed, 14 insertions, 4 deletions
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 253322c..932c8aa 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -97,6 +97,15 @@ bgp_open(struct bgp_proto *p)
if (!bgp_listen_sk)
bgp_listen_sk = bgp_setup_listen_sk(cfg->listen_bgp_addr, cfg->listen_bgp_port, cfg->listen_bgp_flags);
+ if (!bgp_listen_sk)
+ {
+ bgp_counter--;
+ p->p.disabled = 1;
+ bgp_store_error(p, NULL, BE_MISC, BEM_NO_SOCKET);
+ proto_notify_state(&p->p, PS_DOWN);
+ return -1;
+ }
+
if (!bgp_linpool)
bgp_linpool = lp_new(&root_pool, 4080);
@@ -630,14 +639,14 @@ bgp_listen_sock_err(sock *sk UNUSED, int err)
if (err == ECONNABORTED)
log(L_WARN "BGP: Incoming connection aborted");
else
- log(L_ERR "BGP: Error on incoming socket: %M", err);
+ log(L_ERR "BGP: Error on listening socket: %M", err);
}
static sock *
bgp_setup_listen_sk(ip_addr addr, unsigned port, u32 flags)
{
sock *s = sk_new(&root_pool);
- DBG("BGP: Creating incoming socket\n");
+ DBG("BGP: Creating listening socket\n");
s->type = SK_TCP_PASSIVE;
s->saddr = addr;
s->sport = port ? port : BGP_PORT;
@@ -649,7 +658,7 @@ bgp_setup_listen_sk(ip_addr addr, unsigned port, u32 flags)
s->err_hook = bgp_listen_sock_err;
if (sk_open(s))
{
- log(L_ERR "BGP: Unable to open incoming socket");
+ log(L_ERR "BGP: Unable to open listening socket");
rfree(s);
return NULL;
}
@@ -937,7 +946,7 @@ bgp_check(struct bgp_config *c)
static char *bgp_state_names[] = { "Idle", "Connect", "Active", "OpenSent", "OpenConfirm", "Established", "Close" };
static char *bgp_err_classes[] = { "", "Error: ", "Socket: ", "Received: ", "BGP Error: ", "Automatic shutdown: ", ""};
-static char *bgp_misc_errors[] = { "", "Neighbor lost", "Invalid next hop", "Kernel MD5 auth failed" };
+static char *bgp_misc_errors[] = { "", "Neighbor lost", "Invalid next hop", "Kernel MD5 auth failed", "No listening socket" };
static char *bgp_auto_errors[] = { "", "Route limit exceeded"};
static const char *
diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h
index 39a87a6..c81fe62 100644
--- a/proto/bgp/bgp.h
+++ b/proto/bgp/bgp.h
@@ -275,6 +275,7 @@ void bgp_log_error(struct bgp_proto *p, u8 class, char *msg, unsigned code, unsi
#define BEM_NEIGHBOR_LOST 1
#define BEM_INVALID_NEXT_HOP 2
#define BEM_INVALID_MD5 3 /* MD5 authentication kernel request failed (possibly not supported) */
+#define BEM_NO_SOCKET 4
/* Automatic shutdown error codes */