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" =-