<!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><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></SPAN></FONT></BODY></HTML>