From f8809249906811683e7e8d2a7b8cdcccde86742a Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 1 Apr 2000 09:17:33 +0000 Subject: [PATCH] BGP now handles incoming routes (IPv4 only). --- nest/config.Y | 1 + proto/bgp/bgp.c | 1 + proto/bgp/packets.c | 19 +++++++++++-------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/nest/config.Y b/nest/config.Y index f4e8cdd7..24223dba 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 e95e3344..9bef2e58 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 7764999e..2d95f9b7 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