On Mon, Mar 31, 2008 at 04:01:49PM +0200, Christian wrote:
> Hi Claudio & Co.,
>
> I am running 4.3-current. I am using a very basic bgpd config file that 
> worked for 4.2 very well. Unfortunatelly, with -current my router does not 
> want to announce our prefix anymore.
>
> Any ideas?
>
> Thanks,
> - Christian
>
> Details: (my as: 303, transit: 304)
>
> I am able to receive prefixes from my transit provider.
> bgpctl shows the following (77.X.Y.0/21 being our prefix):
>
> # bgpctl show rib 77.X.Y.0
> flags: * = Valid, > = Selected, I = via IBGP, A = Announced
> origin: i = IGP, e = EGP, ? = Incomplete
>
> flags destination         gateway          lpref   med aspath origin
>       77.X.Y.0/21       A.B.C.D 105     0 304 [SOMEAS] 303 i
> I*    77.X.Y.0/21       77.X.Y.2           100     0 i
> AI    77.X.Y.0/21       0.0.0.0            100     0 i
>
> So there are two funny things:
>
> - I get my own prefix (announced by our other router, 77.X.Y.2) via the 
> transit provider.
> - The line with my announced prefix ("AI") is missing the "*".
>

The missing * in tha AI output is an error when composing the control
message to bgpctl. The problem with the looped AS path is a bit more evil.
In the decision process the wrong flags field was inspected and because of
that loops remained undetected.
Having the loop in the table with a higher lpref will result in missing
anouncements. That's why your own route is not selected (missing ">").

I hope the attached diff fixes all your issues. At least it seems to work
for me.
-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.230
diff -u -p -r1.230 rde.c
--- rde.c       26 Feb 2008 19:58:51 -0000      1.230
+++ rde.c       16 Apr 2008 14:04:10 -0000
@@ -1717,7 +1717,7 @@ rde_dump_rib_as(struct prefix *p, struct
                rib.flags |= F_RIB_INTERNAL;
        if (asp->flags & F_PREFIX_ANNOUNCED)
                rib.flags |= F_RIB_ANNOUNCE;
-       if (asp->nexthop != NULL && asp->nexthop->state == NEXTHOP_REACH)
+       if (asp->nexthop == NULL || asp->nexthop->state == NEXTHOP_REACH)
                rib.flags |= F_RIB_ELIGIBLE;
        if (asp->flags & F_ATTR_LOOP)
                rib.flags &= ~F_RIB_ELIGIBLE;
@@ -2846,4 +2846,3 @@ sa_cmp(struct bgpd_addr *a, struct socka
 
        return (0);
 }
-
Index: rde_decide.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_decide.c,v
retrieving revision 1.49
diff -u -p -r1.49 rde_decide.c
--- rde_decide.c        27 Nov 2007 01:13:54 -0000      1.49
+++ rde_decide.c        16 Apr 2008 14:43:48 -0000
@@ -121,14 +121,14 @@ prefix_cmp(struct prefix *p1, struct pre
        if (!(p2->flags & F_LOCAL))
                return (1);
  
+       asp1 = p1->aspath;
+       asp2 = p2->aspath;
+
        /* only loop free pathes are eligible */
-       if (p1->flags & F_ATTR_LOOP)
+       if (asp1->flags & F_ATTR_LOOP)
                return (-1);
-       if (p2->flags & F_ATTR_LOOP)
+       if (asp2->flags & F_ATTR_LOOP)
                return (1);
-
-       asp1 = p1->aspath;
-       asp2 = p2->aspath;
 
        /* 1. check if prefix is eligible a.k.a reachable */
        if (asp2->nexthop != NULL && asp2->nexthop->state != NEXTHOP_REACH)

Reply via email to