On Wed, Apr 05, 2006 at 01:19:44PM +0100, tony sarendal wrote:
> On 05/04/06, Claudio Jeker <[EMAIL PROTECTED]> wrote:
> >
> > On Wed, Apr 05, 2006 at 12:30:56PM +0100, tony sarendal wrote:
> > > On 05/04/06, tony sarendal <[EMAIL PROTECTED]> wrote:
> >
> > ...
> >
> > > > On a side note, at this stage I did:
> > > >
> > > > cr211-FRA# bgpctl reload
> > > > reload request sent.
> > > > cr211-FRA#
> > > >
> > > > on the neighbor cr212-FRA I get this:
> > > >
> > > > Apr  5 13:13:39 cr212-FRA bgpd[2618]: neighbor 172.16.1.21: received
> > > > notification: Cease, unknown subcode 0
> > > > Apr  5 13:13:39 cr212-FRA bgpd[2618]: neighbor 172.16.1.21: state
> > change
> > > > Established -> Idle, reason: NOTIFICATION received
> > > > Apr  5 13:13:39 cr212-FRA bgpd[16469]: neighbor 10.1.1.29 (AS65000)
> > > > withdraw 10.0.0.6/32
> > > > Apr  5 13:13:39 cr212-FRA bgpd[16469]: neighbor 10.1.1.29 (AS65000)
> > > > withdraw 10.1.1.20/30
> > > > Apr  5 13:13:39 cr212-FRA bgpd[16469]: fatal in RDE: attr_diff: equal
> > > > attributes encountered
> > > > Apr  5 13:13:39 cr212-FRA bgpd[3196]: Lost child: route decision
> > engine
> > > > exited
> > > > Apr  5 13:13:39 cr212-FRA bgpd[2618]: fatal in SE:
> > session_dispatch_imsg:
> > > > pipe closed: Connection refused
> > > > Apr  5 13:13:39 cr212-FRA bgpd[3196]: kernel routing table decoupled
> > > > Apr  5 13:13:39 cr212-FRA bgpd[3196]: Terminating
> > > >
> > > Doh, sent to early, rde in ar213-FRA also shutdown when doing the bgpctl
> > > reload:
> > >
> > > Apr  5 12:52:46 ar213-FRA bgpd[4507]: neighbor 172.16.1.18: state change
> > > OpenConfirm -> Established, reason: KEEPALIVE message received
> > > Apr  5 12:52:46 ar213-FRA bgpd[5938]: nexthop 172.16.1.18 now valid:
> > > directly connected
> > > Apr  5 13:14:19 ar213-FRA bgpd[19227]: fatal in RDE: attr_diff: equal
> > > attributes encountered
> > > Apr  5 13:14:19 ar213-FRA bgpd[5938]: Lost child: route decision engine
> > > exited
> > > Apr  5 13:14:19 ar213-FRA bgpd[4507]: neighbor 192.168.30.10: state
> > change
> > > Established -> Idle, reason: Stop
> > > Apr  5 13:14:19 ar213-FRA bgpd[4507]: neighbor 172.16.1.22: state change
> > > Established -> Idle, reason: Stop
> > > Apr  5 13:14:19 ar213-FRA bgpd[4507]: neighbor 172.16.1.18: state change
> > > Established -> Idle, reason: Stop
> > > Apr  5 13:14:19 ar213-FRA bgpd[5938]: kernel routing table decoupled
> > > Apr  5 13:14:19 ar213-FRA bgpd[4507]: session engine exiting
> > > Apr  5 13:14:19 ar213-FRA bgpd[5938]: Terminating
> > >
> > > Time for a break.
> > >
> >
> > The following diff kills the fatalx() and keeps you running. THIS IS A
> > HACK!
> > The real problem is in rde_reflector() -- it modifies attributes
> > that are referenced in the cache and so you end up in a major fuckup.
> > The function needs some rework similar to the way communities are handled.
> >
> > I'll have a diff later today or early tomorrow.
> 
> 
> No worries Claudio, take your time.
> I prefer to have something that you consider good instead of a hack,
> I'm still in the lab slowly stepping my way to where I want to go with this.
> 

Your lucky day. Had to reschedule some work and hand a few mins to create
the following diff. Compiles but untested -- my lab is missing a
route-reflector :( -- but the change is obvious.

This should fix the "attr_diff: equal attributes encountered" fatal.
-- 
:wq Claudio

? obj
Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.203
diff -u -p -r1.203 rde.c
--- rde.c       5 Apr 2006 13:24:28 -0000       1.203
+++ rde.c       5 Apr 2006 13:25:19 -0000
@@ -1431,6 +1431,7 @@ int
 rde_reflector(struct rde_peer *peer, struct rde_aspath *asp)
 {
        struct attr     *a;
+       u_int8_t        *p;
        u_int16_t        len;
        u_int32_t        id;
 
@@ -1459,15 +1460,19 @@ rde_reflector(struct rde_peer *peer, str
                                    sizeof(conf->clusterid)) == 0)
                                        return (0);
 
-                       /* prepend own clusterid */
-                       if ((a->data = realloc(a->data, a->len +
-                           sizeof(conf->clusterid))) == NULL)
+                       /* prepend own clusterid by replacing attribute */
+                       len = a->len + sizeof(conf->clusterid);
+                       if (len < a->len)
+                               fatalx("rde_reflector: cluster-list overflow");
+                       if ((p = malloc(len)) == NULL)
                                fatal("rde_reflector");
-                       memmove(a->data + sizeof(conf->clusterid),
-                           a->data, a->len);
-                       a->len += sizeof(conf->clusterid);
-                       memcpy(a->data, &conf->clusterid,
-                           sizeof(conf->clusterid));
+                       memcpy(p, &conf->clusterid, sizeof(conf->clusterid));
+                       memcpy(p + sizeof(conf->clusterid), a->data, a->len);
+                       attr_free(asp, a);
+                       if (attr_optadd(asp, ATTR_OPTIONAL, ATTR_CLUSTER_LIST,
+                           p, len) == -1)
+                               fatalx("attr_optadd failed but impossible");
+                       free(p);
                } else if (attr_optadd(asp, ATTR_OPTIONAL, ATTR_CLUSTER_LIST,
                    &conf->clusterid, sizeof(conf->clusterid)) == -1)
                        fatalx("attr_optadd failed but impossible");
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.92
diff -u -p -r1.92 rde.h
--- rde.h       5 Apr 2006 13:24:29 -0000       1.92
+++ rde.h       5 Apr 2006 13:25:20 -0000
@@ -273,6 +273,7 @@ struct attr *attr_optget(const struct rd
 void            attr_copy(struct rde_aspath *, struct rde_aspath *);
 int             attr_compare(struct rde_aspath *, struct rde_aspath *);
 void            attr_freeall(struct rde_aspath *);
+void            attr_free(struct rde_aspath *, struct attr *);
 #define                 attr_optlen(x) \
     ((x)->len > 255 ? (x)->len + 4 : (x)->len + 3)
 
Index: rde_attr.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_attr.c,v
retrieving revision 1.64
diff -u -p -r1.64 rde_attr.c
--- rde_attr.c  15 Mar 2006 11:26:45 -0000      1.64
+++ rde_attr.c  5 Apr 2006 13:25:20 -0000
@@ -29,8 +29,6 @@
 #include "bgpd.h"
 #include "rde.h"
 
-void   attr_free(struct rde_aspath *, struct attr *);
-
 int
 attr_write(void *p, u_int16_t p_len, u_int8_t flags, u_int8_t type,
     void *data, u_int16_t data_len)

Reply via email to