diff -u version.

/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 10:38:23 -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,
@@ -954,9 +948,17 @@
 
                peer->prefix_rcvd_update++;
                /* add original path to the Adj-RIB-In */
-               if (peer->conf.softreconfig_in)
-                       path_update(peer, asp, &prefix, prefixlen, F_ORIGINAL);
-
+               if (peer->conf.softreconfig_in) {
+                       /* handle an update with loop as a withdraw */
+                       if (peer->conf.ebgp && !aspath_loopfree(asp->aspath,
+                           conf->as))
+                               prefix_remove(peer, &prefix, prefixlen,
+                                   F_ORIGINAL);
+                       else
+                               path_update(peer, asp, &prefix, prefixlen,
+                                   F_ORIGINAL);
+                       
+               }
                /* input filter */
                if (rde_filter(&fasp, rules_l, peer, asp, &prefix, prefixlen,
                    peer, DIR_IN) == ACTION_DENY) {
@@ -977,10 +979,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);
@@ -1047,10 +1057,16 @@
 
                                peer->prefix_rcvd_update++;
                                /* add original path to the Adj-RIB-In */
-                               if (peer->conf.softreconfig_in)
-                                       path_update(peer, asp, &prefix,
-                                           prefixlen, F_ORIGINAL);
-
+                               if (peer->conf.softreconfig_in) {
+                               /* handle an update with loop as a withdraw */
+                                       if (peer->conf.ebgp &&
+                                           
!aspath_loopfree(asp->aspath,conf->as))
+                                               prefix_remove(peer, &prefix,
+                                                   prefixlen,F_ORIGINAL);
+                                       else
+                                               path_update(peer, asp, &prefix,
+                                                   prefixlen, F_ORIGINAL);
+                               }
                                /* input filter */
                                if (rde_filter(&fasp, rules_l, peer, asp,
                                    &prefix, prefixlen, peer, DIR_IN) ==
@@ -1075,9 +1091,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)

Reply via email to