<div dir="ltr">Dear Team Barrelfish,<div><br></div><div>I am currently having a trouble with doing a 3-way handshake like IDC. What I would like to achieve is</div><div><br></div><div>Core 0 -- Send Syn -&gt; Core 1</div><div>Core 0 &lt;- Send Syn/Ack -- Core 1</div><div>Core 0 -- Send Ack --&gt; Core 1</div><div><br></div><div>I got no luck doing this on my original system, the message can be sent from core 0 with no error code but core 1 keep looping waiting for event. Having troubleshooting for quite some time, then I turned to wrote a smaller scale testing program to verify that 3-way handshake can be done. And I still got the same result, i.e., core 0 sent ack with no error code while core 1 spin waiting for event with no arrival and delivery.</div><div><br></div><div>My platform is again... I am sorry, Intel SCC. The latest tag I can compile with Intel SCC is release2012-11-03 and the real tag I am now using is release2012-06-06. Hope you may help.</div><div><br></div><div>The micro program is as attached.</div><div><br></div><div><div><font face="courier new, monospace">#include &quot;stdio.h&quot;</font></div><div><font face="courier new, monospace">#include &quot;stdbool.h&quot; // FOR BOOL</font></div><div><font face="courier new, monospace">#include &lt;errors/errno.h&gt; // FOR ERRVAL_T</font></div><div><span style="font-family:&#39;courier new&#39;,monospace">#include &quot;arch/x86_32/barrelfish_kpi/eflags_arch.h&quot;</span><br></div><div><font face="courier new, monospace">#include &quot;arch/x86_32/barrelfish_kpi/paging_arch.h&quot;</font></div><div><font face="courier new, monospace">#include &quot;barrelfish_kpi/syscalls.h&quot; // FOR STRUCT SYSRET</font></div><div><font face="courier new, monospace">#include &quot;barrelfish/capabilities.h&quot;</font></div><div><font face="courier new, monospace">#include &quot;if/pingpong_defs.h&quot;</font></div><div><span style="font-family:&#39;courier new&#39;,monospace">#include &quot;barrelfish/domain.h&quot;</span><br></div><div><font face="courier new, monospace">#include &quot;barrelfish/spawn_client.h&quot;</font></div><div><font face="courier new, monospace">#include &quot;barrelfish/waitset.h&quot;</font></div><div><font face="courier new, monospace">#include &quot;barrelfish/nameservice_client.h&quot;</font></div><div><font face="courier new, monospace">#include &quot;rck_dev.h&quot;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">struct pingpong_binding* binding;</font></div><div><font face="courier new, monospace">int flag_connect = 0;</font></div><div><font face="courier new, monospace">int flag_ack = 0;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">void syn_handler(struct pingpong_binding *b){</font></div><div><font face="courier new, monospace">    debug_printf(&quot;arrived at syn\n&quot;);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    b-&gt;tx_vtbl.syn_ack(b, NOP_CONT);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    do{</font></div><div><font face="courier new, monospace">        printf(&quot;wait ack\n&quot;);</font></div><div><font face="courier new, monospace">        event_dispatch(get_default_waitset());</font></div><div><font face="courier new, monospace">    } while(!flag_ack);</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">void syn_ack_handler(struct pingpong_binding *b){</font></div><div><font face="courier new, monospace">    debug_printf(&quot;arrived at syn_ack\n&quot;);</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">void ack_handler(struct pingpong_binding *b){</font></div><div><font face="courier new, monospace">    debug_printf(&quot;arrived at ack\n&quot;);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    flag_ack = 1;</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><span style="font-family:&#39;courier new&#39;,monospace">struct pingpong_rx_vtbl pingpong_rx_vtbl = {</span><br></div><div><font face="courier new, monospace">    .syn     = syn_handler,</font></div><div><font face="courier new, monospace">    .syn_ack = syn_ack_handler,</font></div><div><font face="courier new, monospace">    .ack     = ack_handler,</font></div><div><font face="courier new, monospace">};</font></div><div><br></div><div><font face="courier new, monospace">static void bind_cb(void *st, errval_t err, struct pingpong_binding *b)</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace">    if (err_is_fail(err)) {</font></div><div><font face="courier new, monospace">        USER_PANIC_ERR(err, &quot;bind failed&quot;);</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    printf(&quot;client bound!\n&quot;);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    // copy my message receive handler vtable to the binding</font></div><div><font face="courier new, monospace">    b-&gt;rx_vtbl = pingpong_rx_vtbl;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    binding = b;</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">static void start_client(void)</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace">    iref_t iref;</font></div><div><font face="courier new, monospace">    errval_t err;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    printf(&quot;client looking up &#39;%s&#39; in name service...\n&quot;, &quot;pingpong_service&quot;);</font></div><div><font face="courier new, monospace">    err = nameservice_blocking_lookup(&quot;pingpong_service&quot;, &amp;iref);</font></div><div><font face="courier new, monospace">    if (err_is_fail(err)) {</font></div><div><font face="courier new, monospace">        USER_PANIC_ERR(err, &quot;nameservice_blocking_lookup failed&quot;);</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    printf(&quot;client binding to %&quot;PRIuIREF&quot;...\n&quot;, iref);</font></div><div><font face="courier new, monospace">    err = pingpong_bind(iref, bind_cb, NULL, get_default_waitset(), IDC_BIND_FLAGS_DEFAULT);</font></div><div><font face="courier new, monospace">    if (err_is_fail(err)) {</font></div><div><font face="courier new, monospace">        USER_PANIC_ERR(err, &quot;bind failed&quot;);</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    while(binding == NULL)</font></div><div><font face="courier new, monospace">        event_dispatch(get_default_waitset());</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">/* ------------------------------ SERVER ------------------------------ */</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">static void export_cb(void *st, errval_t err, iref_t iref)</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace">    if (err_is_fail(err)) {</font></div><div><font face="courier new, monospace">        USER_PANIC_ERR(err, &quot;export failed&quot;);</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    printf(&quot;service exported at iref %&quot;PRIuIREF&quot;\n&quot;, iref);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    // register this iref with the name service</font></div><div><font face="courier new, monospace">    err = nameservice_register(&quot;pingpong_service&quot;, iref);</font></div><div><font face="courier new, monospace">    printf(&quot;service exported at iref %&quot;PRIuIREF&quot;\n&quot;, iref);</font></div><div><font face="courier new, monospace">    if (err_is_fail(err)) {</font></div><div><font face="courier new, monospace">        USER_PANIC_ERR(err, &quot;nameservice_register failed&quot;);</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace">    printf(&quot;service exported at iref %&quot;PRIuIREF&quot;\n&quot;, iref);</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">static errval_t connect_cb(void *st, struct pingpong_binding *b)</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace">    printf(&quot;service got a connection!\n&quot;);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    // copy my message receive handler vtable to the binding</font></div><div><font face="courier new, monospace">    b-&gt;rx_vtbl = pingpong_rx_vtbl;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    flag_connect = 1;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    // accept the connection (we could return an error to refuse it)</font></div><div><font face="courier new, monospace">    return SYS_ERR_OK;</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">static void start_server(void)</font></div><div><font face="courier new, monospace">{</font></div><div><font face="courier new, monospace">    errval_t err;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    err = pingpong_export(NULL, export_cb, connect_cb, get_default_waitset(), IDC_EXPORT_FLAGS_DEFAULT);</font></div><div><font face="courier new, monospace">    if (err_is_fail(err)) {</font></div><div><font face="courier new, monospace">        USER_PANIC_ERR(err, &quot;export failed&quot;);</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    do{</font></div><div><font face="courier new, monospace">        event_dispatch(get_default_waitset());</font></div><div><font face="courier new, monospace">    } while(!flag_connect);</font></div><div><font face="courier new, monospace">}</font></div><div><br></div><div><font face="courier new, monospace">int main(int argc, char* argv[]){</font></div><div><font face="courier new, monospace">    debug_printf(&quot;%d\n&quot;, disp_get_core_id());</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    if(disp_get_core_id() == 0){</font></div><div><font face="courier new, monospace">        spawn_program(1, &quot;/scc/sbin/pingpong&quot;, argv, NULL, SPAWN_NEW_DOMAIN, NULL);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">        start_server();</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace">    else start_client();</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    if(disp_get_core_id() == 1){</font></div><div><font face="courier new, monospace">          binding-&gt;tx_vtbl.syn(binding, NOP_CONT);</font></div><div><font face="courier new, monospace">          event_dispatch(get_default_waitset());</font></div><div><font face="courier new, monospace">          binding-&gt;tx_vtbl.ack(binding, NOP_CONT);</font></div><div><font face="courier new, monospace">          printf(&quot;sent ack\n&quot;);</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace">    else{</font></div><div><font face="courier new, monospace">        event_dispatch(get_default_waitset());</font></div><div><font face="courier new, monospace">    }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    return 0;</font></div><div><font face="courier new, monospace">}</font></div></div><div><br></div><div><div>Thanks again!</div><div><br></div>Cheers,<br><div class="gmail_signature">
Dominic Hung<br><br>--------------------------------------------------<br><div>C H Dominic Hung, B.Eng. (CE) HK<br></div><div>M. Phil. Student, Dept. of CS., Faculty of Engg.</div><br>Mobile: +852-9819-9360<br>Email: <a href="mailto:domchdh@hku.hk" target="_blank">domchdh@hku.hk</a>
<br></div>
</div></div>