]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Adds BGP option related to MED handling.
authorOndrej Zajicek <santiago@crfreenet.org>
Fri, 22 Apr 2011 14:13:27 +0000 (16:13 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Fri, 22 Apr 2011 14:13:27 +0000 (16:13 +0200)
Adds option 'med metric' allows to compare MEDs
between routes received from different neighbors.

doc/bird.sgml
proto/bgp/attrs.c
proto/bgp/bgp.h
proto/bgp/config.Y

index 86f4c5077cdfa853d52accff76baa561e0b835fe..b35f4944213e18fb360d304c8097245766cd094b 100644 (file)
@@ -1121,7 +1121,7 @@ for each neighbor using the following configuration parameters:
        BIRD does not implement obsoleted RFC 1863, but uses ad-hoc implementation,
        which behaves like plain EBGP but reduces modifications to advertised route
        attributes to be transparent (for example does not prepend its AS number to
-       AS PATH attribute and keep MED attribute). Default: disabled.
+       AS PATH attribute and keeps MED attribute). Default: disabled.
 
        <tag>enable route refresh <m/switch/</tag> When BGP speaker
        changes its import filter, it has to re-examine all routes
@@ -1205,6 +1205,15 @@ for each neighbor using the following configuration parameters:
        <tag>path metric <m/switch/</tag> Enable comparison of path lengths
        when deciding which BGP route is the best one. Default: on.
 
+       <tag>med metric <m/switch/</tag> Enable comparison of MED
+       attributes (during best route selection) even between routes
+       received from different ASes.  This may be useful if all MED
+       attributes contain some consistent metric, perhaps enforced in
+       import filters of AS boundary routers. If this option is
+       disabled, MED attributes are compared only if routes are
+       received from the same AS (which is the standard behavior).
+       Default: off.
+
        <tag>igp metric <m/switch/</tag> Enable comparison of internal
        distances to boundary routers during best route selection. Default: on.
 
@@ -1233,21 +1242,21 @@ with `<tt/O/') are optional.
 
 <descrip>
        <tag>bgppath <cf/bgp_path/</tag> Sequence of AS numbers describing the AS path
-       the packet will travel through when forwarded according to the particular route. In case of 
-       internal BGP it doesn't contain the number of the local AS.
+       the packet will travel through when forwarded according to the particular route.
+       In case of internal BGP it doesn't contain the number of the local AS.
 
        <tag>int <cf/bgp_local_pref/ [I]</tag> Local preference value used for
        selection among multiple BGP routes (see the selection rules above). It's
        used as an additional metric which is propagated through the whole local AS.
 
        <tag>int <cf/bgp_med/ [O]</tag> The Multiple Exit Discriminator of the route
-       is an optional attribute which is used on on external (inter-AS) links to
+       is an optional attribute which is used on external (inter-AS) links to
        convey to an adjacent AS the optimal entry point into the local AS.
-       The received attribute may be also propagated over internal BGP links
-       (and this is default behavior). The attribute value is zeroed when a route
-       is exported from a routing table to a BGP instance to ensure that the attribute
-       received from a neighboring AS is not propagated to other neighboring ASes.
-       A new value might be set in the export filter of a BGP instance.
+       The received attribute is also propagated over internal BGP links.
+       The attribute value is zeroed when a route is exported to an external BGP
+       instance to ensure that the attribute received from a neighboring AS is
+       not propagated to other neighboring ASes. A new value might be set in
+       the export filter of an external BGP instance.
        See RFC 4451<htmlurl url="ftp://ftp.rfc-editor.org/in-notes/rfc4451.txt">
        for further discussion of BGP MED attribute.
 
@@ -1281,11 +1290,11 @@ with `<tt/O/') are optional.
        its own routing policy, it also has a complete freedom about which community
        attributes it defines and what will their semantics be.
 
-       <tag>quad <cf/bgp_originator_id/ [O]</tag> This attribute is created by the
+       <tag>quad <cf/bgp_originator_id/ [I, O]</tag> This attribute is created by the
        route reflector when reflecting the route and contains the router ID of the
        originator of the route in the local AS.
 
-       <tag>clist <cf/bgp_cluster_list/ [O]</tag> This attribute contains a list
+       <tag>clist <cf/bgp_cluster_list/ [I, O]</tag> This attribute contains a list
        of cluster IDs of route reflectors. Each route reflector prepends its
        cluster ID when reflecting the route.
 </descrip>
index e1a3671af389c5c18b00c8b42a6a5422a8e43479..95eee9aa82b20b456bd83fd098b1c4f0e6bcb1a9 100644 (file)
@@ -1118,7 +1118,17 @@ bgp_rte_better(rte *new, rte *old)
     return 0;
 
   /* RFC 4271 9.1.2.2. c) Compare MED's */
-  if (bgp_get_neighbor(new) == bgp_get_neighbor(old))
+  /* This is noncompliant. Proper RFC 4271 path selection cannot be
+   * interpreted as finding the best path in some ordering.
+   * Therefore, it cannot be implemented in BIRD without some ugly
+   * hacks. This is just an approximation, which in specific
+   * situations may lead to persistent routing loops, because it is
+   * nondeterministic - it depends on the order in which routes
+   * appeared. But it is also the same behavior as used by default in
+   * Cisco routers, so it is probably not a big issue.
+   */
+  if (new_bgp->cf->med_metric || old_bgp->cf->med_metric ||
+      (bgp_get_neighbor(new) == bgp_get_neighbor(old)))
     {
       x = ea_find(new->attrs->eattrs, EA_CODE(EAP_BGP, BA_MULTI_EXIT_DISC));
       y = ea_find(old->attrs->eattrs, EA_CODE(EAP_BGP, BA_MULTI_EXIT_DISC));
index b06f20a0f5f9fd3ac7139a169b1159690feaa1b9..097faa6a8e1ca06b34c2f9c51e36b3d60c47d136 100644 (file)
@@ -25,6 +25,7 @@ struct bgp_config {
   int missing_lladdr;                  /* What we will do when we don' know link-local addr, see MLL_* */
   int gw_mode;                         /* How we compute route gateway from next_hop attr, see GW_* */
   int compare_path_lengths;            /* Use path lengths when selecting best route */
+  int med_metric;                      /* Compare MULTI_EXIT_DISC even between routes from differen ASes */
   int igp_metric;                      /* Use IGP metrics when selecting best route */
   int prefer_older;                    /* Prefer older routes according to RFC 5004 */
   u32 default_local_pref;              /* Default value for LOCAL_PREF attribute */
index e932a7f6ef174fdafc4e383ee093557b5d25a687..93f832aa871bd1e7bf179323d6c468342aef599e 100644 (file)
@@ -25,7 +25,7 @@ CF_KEYWORDS(BGP, LOCAL, NEIGHBOR, AS, HOLD, TIME, CONNECT, RETRY,
        ADVERTISE, IPV4, CAPABILITIES, LIMIT, PASSIVE, PREFER, OLDER,
        MISSING, LLADDR, DROP, IGNORE, ROUTE, REFRESH, INTERPRET,
        COMMUNITIES, BGP_ORIGINATOR_ID, BGP_CLUSTER_LIST, IGP, TABLE,
-       GATEWAY, DIRECT, RECURSIVE)
+       GATEWAY, DIRECT, RECURSIVE, MED)
 
 CF_GRAMMAR
 
@@ -79,6 +79,7 @@ bgp_proto:
  | bgp_proto GATEWAY DIRECT ';' { BGP_CFG->gw_mode = GW_DIRECT; }
  | bgp_proto GATEWAY RECURSIVE ';' { BGP_CFG->gw_mode = GW_RECURSIVE; }
  | bgp_proto PATH METRIC bool ';' { BGP_CFG->compare_path_lengths = $4; }
+ | bgp_proto MED METRIC bool ';' { BGP_CFG->med_metric = $4; }
  | bgp_proto IGP METRIC bool ';' { BGP_CFG->igp_metric = $4; }
  | bgp_proto PREFER OLDER bool ';' { BGP_CFG->prefer_older = $4; }
  | bgp_proto DEFAULT BGP_MED expr ';' { BGP_CFG->default_med = $4; }