draft-ietf-idr-optional-transitive-00 became RFC 7606, and updated a few
things.
- PARTIAL flag is no longer considered protection
- sometimes, 0 len is invalid as well
OK?
Index: rde.c
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.352
diff -u -p -u -p -r1.352 rde.c
--- rde.c 18 Oct 2016 19:47:52 -0000 1.352
+++ rde.c 31 Oct 2016 18:42:30 -0000
@@ -1537,11 +1537,8 @@ bad_flags:
(rde_as4byte(peer) && attr_len != 8)) {
/*
* ignore attribute in case of error as per
- * draft-ietf-idr-optional-transitive-00.txt
- * but only if partial bit is set
+ * RFC 7606
*/
- if ((flags & ATTR_PARTIAL) == 0)
- goto bad_len;
log_peer_warnx(&peer->conf, "bad AGGREGATOR, "
"partial attribute ignored");
plen += attr_len;
@@ -1564,14 +1561,11 @@ bad_flags:
/* 4-byte ready server take the default route */
goto optattr;
case ATTR_COMMUNITIES:
- if (attr_len % 4 != 0) {
+ if (attr_len == 0 || attr_len % 4 != 0) {
/*
* mark update as bad and withdraw all routes as per
- * draft-ietf-idr-optional-transitive-00.txt
- * but only if partial bit is set
+ * RFC 7606
*/
- if ((flags & ATTR_PARTIAL) == 0)
- goto bad_len;
a->flags |= F_ATTR_PARSE_ERR;
log_peer_warnx(&peer->conf, "bad COMMUNITIES, "
"path invalidated and prefix withdrawn");
@@ -1581,14 +1575,11 @@ bad_flags:
goto bad_flags;
goto optattr;
case ATTR_LARGE_COMMUNITIES:
- if (attr_len % 12 != 0) {
+ if (attr_len == 0 || attr_len % 12 != 0) {
/*
* mark update as bad and withdraw all routes as per
- * draft-ietf-idr-optional-transitive-00.txt
- * but only if partial bit is set
+ * RFC 7606
*/
- if ((flags & ATTR_PARTIAL) == 0)
- goto bad_len;
a->flags |= F_ATTR_PARSE_ERR;
log_peer_warnx(&peer->conf, "bad LARGE COMMUNITIES, "
"path invalidated and prefix withdrawn");
@@ -1598,14 +1589,11 @@ bad_flags:
goto bad_flags;
goto optattr;
case ATTR_EXT_COMMUNITIES:
- if (attr_len % 8 != 0) {
+ if (attr_len == 0 || attr_len % 8 != 0) {
/*
* mark update as bad and withdraw all routes as per
- * draft-ietf-idr-optional-transitive-00.txt
- * but only if partial bit is set
+ * RFC 7606
*/
- if ((flags & ATTR_PARTIAL) == 0)
- goto bad_len;
a->flags |= F_ATTR_PARSE_ERR;
log_peer_warnx(&peer->conf, "bad EXT_COMMUNITIES, "
"path invalidated and prefix withdrawn");
--
Tussman's Law:
Nothing is as inevitable as a mistake whose time has come.