]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP now handles incoming routes (IPv4 only).
authorMartin Mares <mj@ucw.cz>
Sat, 1 Apr 2000 09:17:33 +0000 (09:17 +0000)
committerMartin Mares <mj@ucw.cz>
Sat, 1 Apr 2000 09:17:33 +0000 (09:17 +0000)
nest/config.Y
proto/bgp/bgp.c
proto/bgp/packets.c

index f4e8cdd7448df6b118ef74a185d3d1055de9d463..24223dba733d3b470c412ab845baf17189ed187e 100644 (file)
@@ -99,6 +99,7 @@ proto_item:
 
 imexport:
    FILTER filter { $$ = $2; }
+ | where_filter
  | ALL { $$ = FILTER_ACCEPT; }
  | NONE { $$ = FILTER_REJECT; }
  ;
index e95e3344f110e11759d8e73a3993d86b419c864b..9bef2e58b25abb6d245b6440ece75dba932f3eac 100644 (file)
@@ -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 *
index 7764999e46ad25a12a16119365520e24b76ab0e4..2d95f9b77b4e3becfb1425197a78f2e23c930aff 100644 (file)
@@ -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