New version. Less duplication and a nice feature as bonus.
With softreconfig in enabled the looped prefixes are accepted
into the Adj-RIB-In.

This means that I can tell if my neighbor AS is using
a path via myself. Either I'm tired or that is cool.

router-02# bgpctl show rib 192.168.0.0     
flags: * = Valid, > = Selected, I = via IBGP, A = Announced
origin: i = IGP, e = EGP, ? = Incomplete

flags destination         gateway          lpref   med aspath origin
*>    192.168.0.0/16      192.168.100.5      100     0 65100 i
*     192.168.0.0/16      172.17.1.1         100     0 65200 65100 i
*     192.168.0.0/16      172.17.1.5         100     0 65200 65200 65200 65200 
65100 i
router-02# 

I now kill the peering that 65200 has to 65100, removing their
direct path to 192.168.0.0/16.

router-02# bgpctl show rib 192.168.0.0 
flags: * = Valid, > = Selected, I = via IBGP, A = Announced
origin: i = IGP, e = EGP, ? = Incomplete

flags destination         gateway          lpref   med aspath origin
*>    192.168.0.0/16      192.168.100.5      100     0 65100 i
router-02# 

Sweet, the looping issue is gone.
Here is the bonus:

router-02# bgpctl show rib neigh 172.17.1.5 in  | grep 65300
*     172.17.0.2/32       172.17.1.5         100     0 65200 65300 i
*     192.168.0.0/16      172.17.1.5         100     0 65200 65300 65100 i
*     192.168.100.4/30    172.17.1.5         100     0 65200 65300 i
router-02# 

I now see the paths that the peer uses my network to access.
Note that this depends a bit on remote implementation.
I think this works agains a cisco router.

/Tony


Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.228
diff -u -r1.228 rde.c
--- rde.c       16 Sep 2007 15:20:50 -0000      1.228
+++ rde.c       6 Nov 2007 17:08:50 -0000
@@ -919,12 +919,6 @@
        /* shift to NLRI information */
        p += 2 + attrpath_len;
 
-       /* aspath needs to be loop free nota bene this is not a hard error */
-       if (peer->conf.ebgp && !aspath_loopfree(asp->aspath, conf->as)) {
-               error = 0;
-               goto done;
-       }
-
        /* parse nlri prefix */
        while (nlri_len > 0) {
                if ((pos = rde_update_get_prefix(p, nlri_len, &prefix,
@@ -977,10 +971,18 @@
                if (fasp == NULL)
                        fasp = asp;
 
-               rde_update_log("update", peer, &fasp->nexthop->exit_nexthop,
-                   &prefix, prefixlen);
-               path_update(peer, fasp, &prefix, prefixlen, F_LOCAL);
-
+               rde_update_log("update", peer,
+                   &fasp->nexthop->exit_nexthop,&prefix,
+                   prefixlen);
+               /* handle an update with loop as a withdraw */
+               if (peer->conf.ebgp && !aspath_loopfree(asp->aspath,
+                   conf->as))
+                       prefix_remove(peer, &prefix, prefixlen,
+                           F_LOCAL);
+               else 
+                       path_update(peer, fasp, &prefix, prefixlen,
+                           F_LOCAL);
+               
                /* free modified aspath */
                if (fasp != asp)
                        path_put(fasp);
@@ -1075,9 +1077,15 @@
 
                                rde_update_log("update", peer,
                                    &asp->nexthop->exit_nexthop,
-                                   &prefix, prefixlen);
-                               path_update(peer, fasp, &prefix, prefixlen,
-                                   F_LOCAL);
+                                   &prefix, prefixlen);
+                               /* handle an update with loop as a withdraw */
+                               if (peer->conf.ebgp &&
+                                   !aspath_loopfree(asp->aspath,conf->as))
+                                       prefix_remove(peer, &prefix,
+                                           prefixlen,F_LOCAL);
+                               else 
+                                       path_update(peer, fasp, &prefix,
+                                           prefixlen,F_LOCAL);
 
                                /* free modified aspath */
                                if (fasp != asp)
-- 
---
Tony Sarendal - [EMAIL PROTECTED]
IP/Unix
        -= The scorpion replied,
                "I couldn't help it, it's my nature" =-

Reply via email to