<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.6000.16587" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=011381121-03112008><FONT face=Arial color=#0000ff size=2>One 
more thing to note is that any solution that will be used has to interop with 
the Linux code as well.</FONT></SPAN></DIV>
<DIV><SPAN class=011381121-03112008><FONT face=Arial color=#0000ff 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=011381121-03112008><FONT face=Arial color=#0000ff size=2>I'll 
check the ipoib RFC and see if there are any hints.</FONT></SPAN></DIV>
<DIV><SPAN class=011381121-03112008><FONT face=Arial color=#0000ff 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=011381121-03112008><FONT face=Arial color=#0000ff 
size=2>Thanks</FONT></SPAN></DIV>
<DIV><SPAN class=011381121-03112008><FONT face=Arial color=#0000ff 
size=2>Tzachi</FONT></SPAN></DIV><BR>
<BLOCKQUOTE dir=ltr 
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid; MARGIN-RIGHT: 0px">
  <DIV class=OutlookMessageHeader lang=en-us dir=ltr align=left>
  <HR tabIndex=-1>
  <FONT face=Tahoma size=2><B>From:</B> ofw-bounces@lists.openfabrics.org 
  [mailto:ofw-bounces@lists.openfabrics.org] <B>On Behalf Of </B>Tzachi 
  Dar<BR><B>Sent:</B> Monday, November 03, 2008 7:20 PM<BR><B>To:</B> 
  ofw@lists.openfabrics.org; slavas@voltaire.com<BR><B>Subject:</B> [ofw] FW: 
  Problem on multicast flow<BR></FONT><BR></DIV>
  <DIV></DIV>
  <DIV><FONT face=Arial color=#0000ff size=2><SPAN 
  class=812581817-03112008>Resending without the executables attached (due to 
  antivirus enforcement)</SPAN></FONT></DIV>
  <DIV><FONT face=Arial color=#0000ff size=2><SPAN 
  class=812581817-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial color=#0000ff size=2><SPAN class=812581817-03112008>Any 
  one who wants the executables please call me directly.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial color=#0000ff size=2><SPAN 
  class=812581817-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial color=#0000ff size=2><SPAN 
  class=812581817-03112008>Thanks</SPAN></FONT></DIV>
  <DIV><FONT face=Arial color=#0000ff size=2><SPAN 
  class=812581817-03112008>Tzachi</SPAN></FONT></DIV><FONT face=Arial 
  color=#0000ff size=2></FONT><BR>
  <DIV class=OutlookMessageHeader lang=en-us dir=ltr align=left>
  <HR tabIndex=-1>
  <FONT face=Tahoma size=2><B>From:</B> Tzachi Dar <BR><B>Sent:</B> Monday, 
  November 03, 2008 7:16 PM<BR><B>To:</B> ofw@lists.openfabrics.org; 
  'slavas@voltaire.com'<BR><B>Subject:</B> Problem on multicast 
  flow<BR></FONT><BR></DIV>
  <DIV></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>Hi Voltaire and 
  anyone who can help !</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>On the last day we 
  have been working on a problem of a simple multicast test that doesn't 
  work.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>Test is attached 
  at the end of the mail.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>This test has used 
  to work in the past but not any more.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>Looking at the 
  current state of things, it seems that changes that were done on chekin 
  1450</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>are the root of 
  the problem.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>It seems that the 
  mechanism that maps Mac addresses and ip addresses into IB multicast was 
  broken.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>This was done when 
  ipoib_port_join_mcast has changed from:</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008>  mcast_req.member_rec.mgid.raw[12] <FONT 
  color=#ff0000>= 
  0;//mac.addr[1];<BR></FONT>  mcast_req.member_rec.mgid.raw[13] = 
  mac.addr[3];<BR>  mcast_req.member_rec.mgid.raw[14] = 
  mac.addr[4];<BR>  mcast_req.member_rec.mgid.raw[15] = 
  mac.addr[5];<BR></SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>to 
  </DIV></SPAN></FONT>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008>  mcast_req.member_rec.mgid.raw[12] = 
  mac.addr[1];<BR>  mcast_req.member_rec.mgid.raw[13] = 
  mac.addr[3];<BR>  mcast_req.member_rec.mgid.raw[14] = 
  mac.addr[4];<BR>  mcast_req.member_rec.mgid.raw[15] = 
  mac.addr[5];<BR></SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>It seems that now 
  mac_addr[1] is not always 0 as it used to be. Instead this data is being taken 
  from the ip addresses.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>More than that, it 
  seems that on the function ipoib_refresh_mcast the lines </SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008>   if ( ( p_mac_array[i].addr[0] == 1 
  && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 
  0x5e &&<BR>       p_mac_array[i].addr[3] 
  == 0 && p_mac_array[i].addr[4] == 0 && p_mac_array[i].addr[5] 
  == 1 ) ||<BR>      !( p_mac_array[i].addr[0] == 1 
  && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 
  0x5e )</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>that were added 
  actually means that for normal multicast addresses (starting with 01-00-5e) no 
  multicast group will be created.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>The attached 
  patch, fixes my specific test, but might cause problems to other scenarios. It 
  is not a fix, but rather trying to show the problem more 
  clearly.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>A few more 
  interesting points:</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>1) IP multicast 
  addresses are wider than Mac addresses. We need to decide what encoding we 
  want to use. see <A 
  href="http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/intwork/inaf_mul_wrfn.mspx?mfr=true">http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/intwork/inaf_mul_wrfn.mspx?mfr=true</A> for 
  example.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>Please note that 
  it might be that some ip multicast address will have to share the same Mac 
  addresses.</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>2) On the same 
  machine when running on Broadcom cards IGMP<FONT color=#ff0000> v2</FONT> is 
  used. On ipoib cards IGMP <FONT color=#ff0000>v3</FONT> is 
  used</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN 
  class=506185416-03112008></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>To run the 
  test:</SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008>reciver: <SPAN 
  class=967373610-03112008>mcastrcv.exe 11.4.12.85 19007 239.0.0.2 25 406 
  99</SPAN></SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008><SPAN 
  class=967373610-03112008></SPAN></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008><SPAN 
  class=967373610-03112008>sender: mcastsnd.exe 11.4.12.86 19007 239.0.0.2 25 
  406 100</SPAN></SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008><SPAN 
  class=967373610-03112008>Please replace the ip 11.4.12.85/6 with the local 
  IPOIB addreses.</SPAN></SPAN></FONT></DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008><SPAN 
  class=967373610-03112008></SPAN></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008><SPAN 
  class=967373610-03112008></SPAN></SPAN></FONT> </DIV>
  <DIV><FONT face=Arial size=2><SPAN class=506185416-03112008><SPAN 
  class=967373610-03112008>Index: 
  ipoib_adapter.c<BR>===================================================================<BR>--- 
  ipoib_adapter.c (revision 3408)<BR>+++ ipoib_adapter.c (working 
  copy)<BR>@@ -817,6 +817,18 @@<BR>  uint8_t    i, 
  j;<BR>  ipoib_port_t  *p_port = 
  NULL;<BR> <BR>+    for (i=0; i< num_macs; i++) 
  {<BR>+        DbgPrint("entry %d, mac = 
  %d-%d-%d-%d-%d-%d\n", i, 
  <BR>+            
  p_mac_array[i].addr[0],<BR>+            
  p_mac_array[i].addr[1],<BR>+            
  p_mac_array[i].addr[2],<BR>+            
  p_mac_array[i].addr[3],<BR>+            
  p_mac_array[i].addr[4],<BR>+            
  p_mac_array[i].addr[5]<BR>+        
  );<BR>+    }<BR>+<BR>+<BR>  IPOIB_ENTER( 
  IPOIB_DBG_MCAST );<BR>  cl_obj_lock( &p_adapter->obj 
  );<BR>  if( p_adapter->state == IB_PNP_PORT_ACTIVE )<BR>@@ 
  -859,11 +871,15 @@<BR> <BR>    if( j != 
  p_adapter->mcast_array_size 
  )<BR>     continue;<BR>+/*<BR>    if 
  ( ( p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 
  && p_mac_array[i].addr[2] == 0x5e 
  &&<BR>        
  p_mac_array[i].addr[3] == 0 && p_mac_array[i].addr[4] == 0 && 
  p_mac_array[i].addr[5] == 1 ) ||<BR>       !( 
  p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 && 
  p_mac_array[i].addr[2] == 0x5e 
  )<BR>-    )<BR>+    )*/<BR>+    <BR>    {<BR>+ IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,("\n"));<BR>+   <BR>     ipoib_port_join_mcast( 
  p_port, p_mac_array[i], IB_MC_REC_STATE_FULL_MEMBER 
  );<BR>    }<BR>   }<BR>@@ -877,6 +893,8 
  @@<BR>  if( p_port )<BR>   ipoib_port_deref( p_port, 
  ref_refresh_mcast );<BR> <BR>+DbgPrint("ipoib_refresh_mcast 
  exiting\n");<BR>+<BR>  IPOIB_EXIT( IPOIB_DBG_MCAST 
  );<BR> }<BR> <BR>@@ -1109,6 +1127,7 @@<BR>   /* Join 
  all programmed multicast groups. */<BR>   for( i = 0; i < 
  p_adapter->mcast_array_size; i++ 
  )<BR>   {<BR>+   IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,("\n"));<BR>    ipoib_port_join_mcast(<BR>     p_adapter->p_port, 
  p_adapter->mcast_array[i] 
  ,IB_MC_REC_STATE_FULL_MEMBER);<BR>   }<BR>Index: 
  ipoib_driver.c<BR>===================================================================<BR>--- 
  ipoib_driver.c (revision 3408)<BR>+++ ipoib_driver.c (working 
  copy)<BR>@@ -1731,24 +1731,25 @@<BR> <BR>  /* Required Ethernet 
  operational characteristics */<BR>  case 
  OID_802_3_MULTICAST_LIST:<BR>+        
  DbgPrint("OID_802_3_MULTICAST_LIST 
  called\n");<BR>   IPOIB_PRINT(TRACE_LEVEL_INFORMATION, 
  IPOIB_DBG_OID,<BR>    ("Port %d received set for 
  OID_802_3_MULTICAST_LIST\n", port_num) );<BR>   if( 
  info_buf_len > MAX_MCAST * sizeof(mac_addr_t) 
  )<BR>   {<BR>-   IPOIB_PRINT( 
  TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,<BR>+   IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,<BR>     ("Port %d 
  OID_802_3_MULTICAST_LIST - Multicast list full.\n", port_num) 
  );<BR>    status = 
  NDIS_STATUS_MULTICAST_FULL;<BR>    *p_bytes_needed = 
  MAX_MCAST * 
  sizeof(mac_addr_t);<BR>   }<BR>   else if( 
  info_buf_len % sizeof(mac_addr_t) 
  )<BR>   {<BR>-   IPOIB_PRINT( 
  TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,<BR>+   IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,<BR>     ("Port %d 
  OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) 
  );<BR>    status = 
  NDIS_STATUS_INVALID_DATA;<BR>   }<BR>   else if( 
  !info_buf && info_buf_len 
  )<BR>   {<BR>-   IPOIB_PRINT( 
  TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,<BR>+   IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,<BR>     ("Port %d 
  OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) 
  );<BR>    status = 
  NDIS_STATUS_INVALID_DATA;<BR>   }<BR>Index: 
  ipoib_port.c<BR>===================================================================<BR>--- 
  ipoib_port.c (revision 3411)<BR>+++ ipoib_port.c (working 
  copy)<BR>@@ -3243,7 +3243,7 @@<BR> <BR>  IPOIB_ENTER( 
  IPOIB_DBG_SEND );<BR> <BR>- IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
  IPOIB_DBG_MCAST,<BR>+ IPOIB_PRINT( TRACE_LEVEL_ERROR, 
  IPOIB_DBG_MCAST,<BR>     ("buf_len = %d,iph_options_size = 
  %d\n",(int)buf_len,(int)iph_options_size ) );<BR> <BR>  if( 
  !buf_len )<BR>@@ -3265,6 +3265,7 
  @@<BR>      ("Failed to query IGMPv2 header 
  buffer.\n") );<BR>     return 
  NDIS_STATUS_FAILURE;<BR>    }<BR>+   CL_ASSERT(iph_options_size 
  >= 
  buf_len);<BR>    iph_options_size-=buf_len;<BR>   }<BR>         
  <BR>@@ -3312,8 +3313,10 @@<BR>    Change type of mcast 
  endpt to SEND_RECV endpt. So mcast garbage collector 
  <BR>    will not delete this mcast 
  endpt.<BR>   */<BR>-  IPOIB_PRINT( 
  TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<BR>-   ("Catched 
  IGMP_V2_MEMBERSHIP_REPORT message\n") );<BR>+  IPOIB_PRINT( 
  TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<BR>+   ("Catched 
  IGMP_V2_MEMBERSHIP_REPORT message fake_addr = 
  %d-%d-%d-%d-%d-%d\n",<BR>+   fake_mcast_mac.addr[0], 
  fake_mcast_mac.addr[1], 
  fake_mcast_mac.addr[2],<BR>+   fake_mcast_mac.addr[3], 
  fake_mcast_mac.addr[4], fake_mcast_mac.addr[5]) 
  );<BR>   endpt_status = __endpt_mgr_ref( p_port, 
  fake_mcast_mac, &p_endpt );<BR>   if ( p_endpt 
  )<BR>   {<BR>@@ -3347,7 +3350,7 
  @@<BR>   break;<BR> <BR>  default:<BR>-  IPOIB_PRINT( 
  TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<BR>+  IPOIB_PRINT( 
  TRACE_LEVEL_ERROR, 
  IPOIB_DBG_MCAST,<BR>         ("Send 
  Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type ) 
  );<BR>   break;<BR>  }<BR>@@ -3815,6 +3818,7 
  @@<BR>  if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION 
  &&<BR>   ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) 
  )<BR>  {<BR>+  IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,("\n"));<BR>   if( 
  ipoib_port_join_mcast( p_port, p_eth_hdr->dst, 
  <BR>    IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS 
  )<BR>   {<BR>@@ -4248,6 +4252,7 
  @@<BR> <BR>    if( ETH_IS_MULTICAST( 
  p_eth_hdr->dst.addr ) 
  )<BR>    {<BR>+    IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,("\n"));<BR>     if( 
  ipoib_port_join_mcast( p_port, 
  p_eth_hdr->dst,<BR>      IB_MC_REC_STATE_FULL_MEMBER) 
  == IB_SUCCESS )<BR>     {<BR>@@ -5894,6 +5899,12 
  @@<BR> <BR>  IPOIB_ENTER( IPOIB_DBG_MCAST 
  );<BR> <BR>+ IPOIB_PRINT( 
  TRACE_LEVEL_ERROR,IPOIB_DBG_OID,<BR>+  ("ipoib_port_join_mcast 
  called MAC %d-%d-%d-%d-%d-%d \n", <BR>+  mac.addr[0], mac.addr[1], 
  mac.addr[2], <BR>+  mac.addr[3], mac.addr[4], mac.addr[5] ) 
  );<BR>+<BR>+<BR>  switch( __endpt_mgr_ref( p_port, mac, &p_endpt 
  ) )<BR>  {<BR>  case 
  NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<BR>@@ -5929,7 +5940,8 
  @@<BR>    * 24 lower bits of that network-byte-ordered value 
  (assuming MSb<BR>    * is zero) and 4 lsb bits of the first 
  byte of IP address.<BR>    
  */<BR>-  mcast_req.member_rec.mgid.raw[12] = 
  mac.addr[1];<BR>+CL_ASSERT(mac.addr[1] == 0 || mac.addr[1] == 
  128);<BR>+  mcast_req.member_rec.mgid.raw[12] = 
  0;//mac.addr[1];<BR>   mcast_req.member_rec.mgid.raw[13] = 
  mac.addr[3];<BR>   mcast_req.member_rec.mgid.raw[14] = 
  mac.addr[4];<BR>   mcast_req.member_rec.mgid.raw[15] = 
  mac.addr[5];<BR></SPAN></DIV></BLOCKQUOTE></SPAN></FONT></BODY></HTML>