<!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>