summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2019-03-15 20:54:01 +0100
committerOndrej Zajicek (work) <santiago@crfreenet.org>2019-03-18 14:29:12 +0100
commit7e5f769d91319b4130f7d611dd14252806892ace (patch)
tree232259b8897f8222e638e509871b5bddd06420ec /proto
parent5d511948cddee415c2f0f1103bda0468a193f2d6 (diff)
BGP: Handle case where capabilites are not used
If peer does not announce capabilities at all, or when we have capabilities disabled, handle that as implicit IPv4 unicast.
Diffstat (limited to 'proto')
-rw-r--r--proto/bgp/bgp.c8
-rw-r--r--proto/bgp/bgp.h1
-rw-r--r--proto/bgp/packets.c5
3 files changed, 14 insertions, 0 deletions
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 8dedde9f..56401a08 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -491,6 +491,7 @@ bgp_conn_enter_openconfirm_state(struct bgp_conn *conn)
}
static const struct bgp_af_caps dummy_af_caps = { };
+static const struct bgp_af_caps basic_af_caps = { .ready = 1 };
void
bgp_conn_enter_established_state(struct bgp_conn *conn)
@@ -541,6 +542,13 @@ bgp_conn_enter_established_state(struct bgp_conn *conn)
const struct bgp_af_caps *loc = bgp_find_af_caps(local, c->afi);
const struct bgp_af_caps *rem = bgp_find_af_caps(peer, c->afi);
+ /* Use default if capabilities were not announced */
+ if (!local->length && (c->afi == BGP_AF_IPV4))
+ loc = &basic_af_caps;
+
+ if (!peer->length && (c->afi == BGP_AF_IPV4))
+ rem = &basic_af_caps;
+
/* Ignore AFIs that were not announced in multiprotocol capability */
if (!loc || !loc->ready)
loc = &dummy_af_caps;
diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h
index cfc88d8e..56dbf485 100644
--- a/proto/bgp/bgp.h
+++ b/proto/bgp/bgp.h
@@ -215,6 +215,7 @@ struct bgp_caps {
u8 llgr_aware; /* Long-lived GR capability, RFC draft */
u16 af_count; /* Number of af_data items */
+ u16 length; /* Length of capabilities in OPEN msg */
struct bgp_af_caps af_data[0]; /* Per-AF capability data */
};
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index 26716573..4ae6c5cf 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -217,6 +217,7 @@ bgp_write_capabilities(struct bgp_conn *conn, byte *buf)
struct bgp_af_caps *ac;
uint any_ext_next_hop = 0;
uint any_add_path = 0;
+ byte *buf_head = buf;
byte *data;
/* Prepare bgp_caps structure */
@@ -394,6 +395,8 @@ bgp_write_capabilities(struct bgp_conn *conn, byte *buf)
data[-1] = buf - data;
}
+ caps->length = buf - buf_head;
+
return buf;
}
@@ -405,6 +408,8 @@ bgp_read_capabilities(struct bgp_conn *conn, struct bgp_caps *caps, byte *pos, i
int i, cl;
u32 af;
+ caps->length += len;
+
while (len > 0)
{
if (len < 2 || len < (2 + pos[1]))