<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 14 (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:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        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;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></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-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">“best” is too vague below.  To limit the scope of this, let’s specifically call it “shortest distance” to make it clear we’re not looking at speed, congestion, etc.  Simply an abstracted “network hops”.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">To put it in real terms – you have two interfaces, the remote is on the same subnet as one, but could also be reached through a router from the other.  You want to pick the local one, and you don’t want the application
 having to parse kernel routing tables to find out which one to use, or even know that kernel routing tables are involved in the answer.  How does it pick the right one?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">-reese<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> ofiwg-bounces@lists.openfabrics.org [mailto:ofiwg-bounces@lists.openfabrics.org]
<b>On Behalf Of </b>Reese Faucette (rfaucett)<br>
<b>Sent:</b> Wednesday, October 08, 2014 4:20 PM<br>
<b>To:</b> ofiwg@lists.openfabrics.org<br>
<b>Subject:</b> [ofiwg] selecting a fabric for a destination<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If a program needs to send to only one remote address, selecting a fabric is simple: the program just passes the remote address to fi_getinfo and is returned an ordered list of fabrics that can communicate with the remote address.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Suppose, though, that you have an application that may need to send data to a large set of remote destinations that may only become known “later”.  I see the app calling fi_getinfo() at startup to learn what suitable fabrics are available,
 and opening a domain and set of endpoints on each of them.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Now, later, through some out-of-band mechanism, the process learns of remote destinations it should contact.  The problem the app now faces is, “which endpoint do I use?” since not all fabrics can necessarily reach the remote address. 
 Calling fi_getinfo() with this newly learned address is somewhat clumsy, since fi_getinfo will malloc a whole new list of fi_infos to return, which then must be mapped by the application to actual fabric/domain/endpoint in use.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Any suggestions for how the app should learn which fabric is the best to use to reach this remote destination?  One possibility is that the program can pass in a list of fabrics and a remote destination to “fi_fabric_for_dest(fi_list, remote_address)”
 and be returned a pointer to the “best” one to use, “best” defined by the providers.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Another possibility is for the program itself to loop through the fabrics it knows about calling “fi_get_distance_metric(domain, remote_address)” and pick the one with the lowest (provider-defined within guidelines) metric.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The mechanism sockets uses is, IMO, unacceptable here – creating one “fabric” for all interfaces and letting the kernel (or some agent) pick the right one at send time.  Bypassing all this critical path lookup is much of the reason we want
 OS-bypass in the first place.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thoughts, suggestions, flames?<o:p></o:p></p>
<p class="MsoNormal">-reese<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>