Claudio Jeker <cje...@diehard.n-r-g.com> a écrit :

>I would prefer something like this. Since then we ensure that we do not
>forward crap (as in we regard the RFC and send nothing with reserved
>bits
>set). AFAIK there is nothing out there that started to use the reserved
>bits so I'm curious how that happend again.
>
>Only compile tested for now.
>-- 
>:wq Claudio
>
>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);

Hi,

Thanks Claudio.

Gonna try the patch u did provide.

Since i needed a quick fix i did apply the patch I provided which allowed my 
bgp sessions to come back up.

Cheers

Laurent

Reply via email to