summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-04-01 11:17:33 +0200
committerMartin Mares <mj@ucw.cz>2000-04-01 11:17:33 +0200
commitf8809249906811683e7e8d2a7b8cdcccde86742a (patch)
treef0aff2f9cedd220e062f81e9b68c6e6aaf4fcdd8
parent85810613993913831822b84ab7a9792a88fc7a8f (diff)
downloadbird-f8809249906811683e7e8d2a7b8cdcccde86742a.tar
bird-f8809249906811683e7e8d2a7b8cdcccde86742a.zip
BGP now handles incoming routes (IPv4 only).
-rw-r--r--nest/config.Y1
-rw-r--r--proto/bgp/bgp.c1
-rw-r--r--proto/bgp/packets.c19
3 files changed, 13 insertions, 8 deletions
diff --git a/nest/config.Y b/nest/config.Y
index f4e8cdd..24223db 100644
--- a/nest/config.Y
+++ b/nest/config.Y
@@ -99,6 +99,7 @@ proto_item:
imexport:
FILTER filter { $$ = $2; }
+ | where_filter
| ALL { $$ = FILTER_ACCEPT; }
| NONE { $$ = FILTER_REJECT; }
;
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index e95e334..9bef2e5 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -31,6 +31,7 @@ static void bgp_setup_sk(struct bgp_proto *p, struct bgp_conn *conn, sock *s);
static void
bgp_rt_notify(struct proto *P, net *n, rte *new, rte *old, ea_list *tmpa)
{
+ DBG("BGP: Got route %I/%d\n", n->n.prefix, n->n.pxlen);
}
static struct proto *
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index 7764999..2d95f9b 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -239,6 +239,7 @@ bgp_rx_update(struct bgp_conn *conn, byte *pkt, int len)
int withdrawn_len, attr_len, nlri_len, pxlen;
net *n;
rte e;
+ rta *a = NULL;
DBG("BGP: UPDATE\n");
if (conn->state != BS_ESTABLISHED)
@@ -254,11 +255,7 @@ bgp_rx_update(struct bgp_conn *conn, byte *pkt, int len)
withdrawn = pkt + 21;
withdrawn_len = get_u16(pkt + 19);
if (withdrawn_len + 23 > len)
- {
- malformed:
- bgp_error(conn, 3, 1, len, 0);
- return;
- }
+ goto malformed;
attrs = withdrawn + withdrawn_len + 2;
attr_len = get_u16(attrs - 2);
if (withdrawn_len + attr_len + 23 > len)
@@ -280,15 +277,15 @@ bgp_rx_update(struct bgp_conn *conn, byte *pkt, int len)
if (nlri_len)
{
- rta *a = bgp_decode_attrs(conn, attrs, attr_len, bgp_linpool);
+ a = bgp_decode_attrs(conn, attrs, attr_len, bgp_linpool);
if (!a)
return;
while (nlri_len)
{
rte *e;
- DECODE_PREFIX(nlri, nlri_len); /* FIXME: Uncache rta ! */
+ DECODE_PREFIX(nlri, nlri_len);
DBG("Add %I/%d\n", prefix, pxlen);
- e = rte_get_temp(a);
+ e = rte_get_temp(rta_clone(a));
n = net_get(bgp->p.table, prefix, pxlen);
e->net = n;
e->pflags = 0;
@@ -297,6 +294,12 @@ bgp_rx_update(struct bgp_conn *conn, byte *pkt, int len)
lp_flush(bgp_linpool);
rta_free(a);
}
+ return;
+
+malformed:
+ if (a)
+ rta_free(a);
+ bgp_error(conn, 3, 1, len, 0);
}
static void