<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Consolas;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:Consolas;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
 /* List Definitions */
 @list l0
        {mso-list-id:1145317353;
        mso-list-type:hybrid;
        mso-list-template-ids:-93533924 134807569 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l0:level1
        {mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
-->
</style><!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoPlainText">Hi Vincent,<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">This is something that we have also been after for some time too, and I know that Securepoint (a company who implement BIRD in their firewall/router product have also approached the bird team about), however there does not seem to be
 any resources available in the BIRD team at the moment willing to look into this despite how important it is.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Internally BIRD does support the ability to hold multiple routes for a single common remote subnet in its routing tables.<o:p></o:p></p>
<p class="MsoPlainText">I do not believe a single instance of a Dynamic Routing ‘Protocol’ can insert multiple routes into the BIRD's routing tables, but multiple Protocol instances can.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">A simple example ‘bird.conf’ with two RIP Protocol instances listening on different interfaces;<o:p></o:p></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">protocol rip EDGE2RIP { # Create RIP protocol instance called EDGE2RIP<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        debug all;<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        timeout time 65; # specifies how old route has to be to be considered unreachable. Default is 4*period (period default is 30)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        garbage time 70; # specifies how old route has to be to be discarded. Default is 10*period (period default is 30)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        export none;    # Do not transmit BIRD table to RIP peers<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        import all;     # Listen to RIP info from RIP peers and store in BIRD table<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        interface "eth3";<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">protocol rip EDGE1RIP { # Create RIP protocol instance called EDGE1RIP<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        debug all;<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        timeout time 65; # specifies how old route has to be to be considered unreachable. Default is 4*period (period default is 30)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        garbage time 70; # specifies how old route has to be to be discarded. Default is 10*period (period default is 30)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        export none;    # Do not transmit BIRD table to RIP peers<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        import all;     # Listen to RIP info from RIP peers and store in BIRD table<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">        interface "eth2";<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">}<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">bird> show route<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">192.168.100.0/24   via 192.168.214.1 on eth2 [EDGE1RIP 09:57] * (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">                   via 192.168.215.1 on eth3 [EDGE2RIP 09:57] (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">10.131.0.0/16      via 192.168.214.1 on eth2 [EDGE1RIP 09:57] * (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">                   via 192.168.215.1 on eth3 [EDGE2RIP 09:57] (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">10.0.0.0/24        via 192.168.215.1 on eth3 [EDGE2RIP 09:57] * (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">                   via 192.168.214.1 on eth2 [EDGE1RIP 09:57] (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">10.1.20.0/24       via 192.168.214.1 on eth2 [EDGE1RIP 09:57] * (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">                   via 192.168.215.1 on eth3 [EDGE2RIP 09:57] (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">10.1.19.0/24       via 192.168.214.1 on eth2 [EDGE1RIP 09:57] * (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">                   via 192.168.215.1 on eth3 [EDGE2RIP 09:57] (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">10.10.0.0/24       via 192.168.214.1 on eth2 [EDGE1RIP 09:57] * (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">                   via 192.168.215.1 on eth3 [EDGE2RIP 09:57] (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">192.168.68.0/24    via 192.168.214.1 on eth2 [EDGE1RIP 09:57] * (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Courier New"">                   via 192.168.215.1 on eth3 [EDGE2RIP 09:57] (120/4)<o:p></o:p></span></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">You can see above that the internal routing table is capable of holding the routes.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">The problem is with the process (BIRD’s Kernel Protocol) which exports these routes into the Kernel routing tables.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">To add an ECMP route using the ‘ip’ command set provided by the kernel package iproute2 requires all the route options to be defined in a single statement.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">For example to export the first ECMP route shown in the example above requires the following statement;<o:p></o:p></p>
<p class="MsoPlainText">ip route add 192.168.100.0/24 nexthop via 192.168.214.1 weight 1 nexthop via 192.168.215.1 weight 1<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">However the Kernel Protocol is currently not capable of scanning the BIRD routing table for all route ‘options’ and forming a single statement, instead the ‘Kernel Protocol’ just recursively works its way through the BIRD routing table
 exporting each entry in single statements. E.g;<o:p></o:p></p>
<p class="MsoPlainText">ip route add 192.168.100.0/24 via 192.168.214.1<o:p></o:p></p>
<p class="MsoPlainText">ip route add 192.168.100.0/24 via 192.168.215.1<o:p></o:p></p>
<p class="MsoPlainText">.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">The first command will work fine. But the second command will NOT work and will be rejected (with error; ‘RTNETLINK answers: File exists‘) resulting in only a single route in the kernel routing tables for 192.168.100.0/24 via 192.168.214.1
 in my example.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">The solution could be provided in two places.<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:
l0 level1 lfo1">
<![if !supportLists]><span style="mso-list:Ignore">1)<span style="font:7.0pt "Times New Roman""> 
</span></span><![endif]>Support could be added in iproute2 for the ‘ip route add’ command to update the existing route into an ECMP route if a second route add statement is provided for an existing subnet etc.<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:
l0 level1 lfo1">
<![if !supportLists]><span style="mso-list:Ignore">2)<span style="font:7.0pt "Times New Roman""> 
</span></span><![endif]>Or support could be added in BIRD for the ‘Kernel Protocol’ to scan the BIRD routing tables for all the route ‘options’ and form a single ‘ip route add .. nexthop’ statement etc.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I believe support needs to be added to BIRD’s ‘Kernel Protocol’ to scan BIRD’s internal routing table for all route options.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Hope this helps provide some insight.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Regards, Andy.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><span lang="EN-US">-----Original Message-----<br>
From: owner-bird-users@atrey.karlin.mff.cuni.cz [mailto:owner-bird-users@atrey.karlin.mff.cuni.cz] On Behalf Of Vincent Bernat<br>
Sent: 24 September 2010 10:41<br>
To: bird-users@trubka.network.cz<br>
Subject: ECMP/multipath support</span><o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Hi!<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">BIRD does not support EMCP yet. Looking at the source code, BIRD seems to<o:p></o:p></p>
<p class="MsoPlainText">be able to support ECMP routes internally by adding attaching several route<o:p></o:p></p>
<p class="MsoPlainText">attributes to the same route entry. Is there already someone working on<o:p></o:p></p>
<p class="MsoPlainText">this? ECMP is an important feature when dealing with redundancy.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Thanks.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
</div>
<br>
<hr>
<font face="Verdana" color="Gray" size="1">Monitor Computer Systems Limited<br>
Company Registration Number: NI 17805<br>
Registered Office: 3 Pine Crest, Holywood, North Down, Northern Ireland BT18 9ED<br>
</font>
</body>
</html>