]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: fix regression in improved attr flag checks
authorDenis Ovsienko <infrastation@yandex.ru>
Wed, 12 Oct 2011 09:54:21 +0000 (13:54 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 17 Oct 2011 14:28:10 +0000 (18:28 +0400)
Commit 2febf323411c1aed9d7694898f852ce2ef36a7e5 assumed every flag
bit except optional/transitive/partial unset, which at times could
not be true for "extended length" bit.

* bgp_attr.c
  * bgp_attr_origin(): exclude BGP_ATTR_FLAG_EXTLEN from comparison
  * bgp_attr_nexthop(): idem
  * bgp_attr_med(): idem
  * bgp_attr_local_pref(): idem
  * bgp_attr_atomic(): idem

bgpd/bgp_attr.c

index 9a5eb8d26419ec7030fc615c1b0987327db94b93..07d75ab09090850b23fe2aaef3b141a9edb35ec2 100644 (file)
@@ -712,7 +712,7 @@ bgp_attr_origin (struct peer *peer, bgp_size_t length,
      with the Attribute Type Code, then the Error Subcode is set to
      Attribute Flags Error.  The Data field contains the erroneous
      attribute (type, length and value). */
-  if (flag != BGP_ATTR_FLAG_TRANS)
+  if ((flag & ~BGP_ATTR_FLAG_EXTLEN) != BGP_ATTR_FLAG_TRANS)
   {
     if (CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL))
       zlog (peer->log, LOG_ERR, "ORIGIN attribute must not be flagged as \"optional\" (%u)", flag);
@@ -915,7 +915,7 @@ bgp_attr_nexthop (struct peer *peer, bgp_size_t length,
   total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
 
   /* Flags check. */
-  if (flag != BGP_ATTR_FLAG_TRANS)
+  if ((flag & ~BGP_ATTR_FLAG_EXTLEN) != BGP_ATTR_FLAG_TRANS)
   {
     if (CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL))
       zlog (peer->log, LOG_ERR, "NEXT_HOP attribute must not be flagged as \"optional\" (%u)", flag);
@@ -975,7 +975,7 @@ bgp_attr_med (struct peer *peer, bgp_size_t length,
   total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
 
   /* Flag checks. */
-  if (flag != BGP_ATTR_FLAG_OPTIONAL)
+  if ((flag & ~BGP_ATTR_FLAG_EXTLEN) != BGP_ATTR_FLAG_OPTIONAL)
   {
     if (! CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL))
       zlog (peer->log, LOG_ERR, "MULTI_EXIT_DISC attribute must be flagged as \"optional\" (%u)", flag);
@@ -1016,7 +1016,7 @@ bgp_attr_local_pref (struct peer *peer, bgp_size_t length,
 
   total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
   /* Flag checks. */
-  if (flag != BGP_ATTR_FLAG_TRANS)
+  if ((flag & ~BGP_ATTR_FLAG_EXTLEN) != BGP_ATTR_FLAG_TRANS)
   {
     if (CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL))
       zlog (peer->log, LOG_ERR, "LOCAL_PREF attribute must not be flagged as \"optional\" (%u)", flag);
@@ -1057,7 +1057,7 @@ bgp_attr_atomic (struct peer *peer, bgp_size_t length,
 
   total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
   /* Flag checks. */
-  if (flag != BGP_ATTR_FLAG_TRANS)
+  if ((flag & ~BGP_ATTR_FLAG_EXTLEN) != BGP_ATTR_FLAG_TRANS)
   {
     if (CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL))
       zlog (peer->log, LOG_ERR, "ATOMIC_AGGREGATE attribute must not be flagged as \"optional\" (%u)", flag);