Apply by doing:
cd /usr/src
patch -p0 < 001_bgpd.patch
And then rebuild and install bgpd:
cd usr.sbin/bgpd/
make obj
make depend
make
make install
Index: usr.sbin/bgpd/rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.316
retrieving revision 1.316.2.1
diff -u -r1.316 -r1.316.2.1
--- usr.sbin/bgpd/rde.c 27 May 2012 18:52:07 -0000 1.316
+++ usr.sbin/bgpd/rde.c 29 Nov 2012 20:06:16 -0000 1.316.2.1
@@ -1382,7 +1382,7 @@
} 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: usr.sbin/bgpd/rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.142
retrieving revision 1.142.4.1
diff -u -r1.142 -r1.142.4.1
--- usr.sbin/bgpd/rde.h 21 Sep 2011 08:59:01 -0000 1.142
+++ usr.sbin/bgpd/rde.h 29 Nov 2012 20:06:16 -0000 1.142.4.1
@@ -118,6 +118,9 @@
#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: usr.sbin/bgpd/rde_attr.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_attr.c,v
retrieving revision 1.90
retrieving revision 1.90.2.1
diff -u -r1.90 -r1.90.2.1
--- usr.sbin/bgpd/rde_attr.c 12 Apr 2012 17:27:20 -0000 1.90
+++ usr.sbin/bgpd/rde_attr.c 29 Nov 2012 20:06:16 -0000 1.90.2.1
@@ -37,12 +37,12 @@
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 @@
{
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 @@
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 @@
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);