<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;}
/* 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-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@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">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>
</body>
</html>