Bonjour, J'ai été (comme probablement certains d'entre vous touché par le bug suivant):
https://puck.nether.net/pipermail/juniper-nsp/2012-July/023774.html Le patch fourni par Claudio Jeker ci-dessous permet de résoudre le problème. En esperant en aider certains d'entre vous et ne pas polluer la liste. Index: rde.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v retrieving revision 1.316 diff -u -p -r1.316 rde.c --- rde.c 27 May 2012 18:52:07 -0000 1.316 +++ rde.c 6 Aug 2012 20:57:27 -0000 @@ -1382,7 +1382,7 @@ rde_update_withdraw(struct rde_peer *pee } while (0) #define CHECK_FLAGS(s, t, m) \ - (((s) & ~(ATTR_EXTLEN | (m))) == (t)) + (((s) & ~(ATTR_DEFMASK | (m))) == (t)) int rde_attr_parse(u_char *p, u_int16_t len, struct rde_peer *peer, Index: rde.h =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v retrieving revision 1.142 diff -u -p -r1.142 rde.h --- rde.h 21 Sep 2011 08:59:01 -0000 1.142 +++ rde.h 6 Aug 2012 21:09:02 -0000 @@ -118,6 +118,9 @@ enum attrtypes { #define ATTR_PARTIAL 0x20 #define ATTR_TRANSITIVE 0x40 #define ATTR_OPTIONAL 0x80 +#define ATTR_RESERVED 0x0f +/* by default mask the reserved bits and the ext len bit */ +#define ATTR_DEFMASK (ATTR_RESERVED | ATTR_EXTLEN) /* default attribute flags for well known attributes */ #define ATTR_WELL_KNOWN ATTR_TRANSITIVE Index: rde_attr.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde_attr.c,v retrieving revision 1.90 diff -u -p -r1.90 rde_attr.c --- rde_attr.c 12 Apr 2012 17:27:20 -0000 1.90 +++ rde_attr.c 6 Aug 2012 21:14:39 -0000 @@ -37,12 +37,12 @@ attr_write(void *p, u_int16_t p_len, u_i u_char *b = p; u_int16_t tmp, tot_len = 2; /* attribute header (without len) */ + flags &= ~ATTR_DEFMASK; if (data_len > 255) { tot_len += 2 + data_len; flags |= ATTR_EXTLEN; } else { tot_len += 1 + data_len; - flags &= ~ATTR_EXTLEN; } if (tot_len > p_len) @@ -69,12 +69,12 @@ attr_writebuf(struct ibuf *buf, u_int8_t { u_char hdr[4]; + flags &= ~ATTR_DEFMASK; if (data_len > 255) { flags |= ATTR_EXTLEN; hdr[2] = (data_len >> 8) & 0xff; hdr[3] = data_len & 0xff; } else { - flags &= ~ATTR_EXTLEN; hdr[2] = data_len & 0xff; } @@ -322,6 +322,7 @@ attr_alloc(u_int8_t flags, u_int8_t type fatal("attr_optadd"); rdemem.attr_cnt++; + flags &= ~ATTR_DEFMASK; /* normalize mask */ a->flags = flags; a->hash = hash32_buf(&flags, sizeof(flags), HASHINIT); a->type = type; @@ -351,6 +352,7 @@ attr_lookup(u_int8_t flags, u_int8_t typ struct attr *a; u_int32_t hash; + flags &= ~ATTR_DEFMASK; /* normalize mask */ hash = hash32_buf(&flags, sizeof(flags), HASHINIT); hash = hash32_buf(&type, sizeof(type), hash); hash = hash32_buf(&len, sizeof(len), hash); --------------------------- Liste de diffusion du FRnOG http://www.frnog.org/