[Openib-windows] RE: IPoIB multicast support

Yossi Leybovich sleybo at mellanox.co.il
Tue Nov 15 07:47:36 PST 2005


It looks fine to me
I also check the multicast test and its work!
Pls apply.
10x
Yossi

> -----Original Message-----
> From: Fab Tillier [mailto:ftillier at silverstorm.com] 
> Sent: Thursday, November 10, 2005 8:44 PM
> To: 'Yossi Leybovich'
> Cc: openib-windows at openib.org
> Subject: RE: IPoIB multicast support
> 
> 
> Hi Yossi,
> 
> > From: Yossi Leybovich [mailto:sleybo at mellanox.co.il]
> > Sent: Thursday, November 10, 2005 5:12 AM
> > 
> > What about this way :
> > In Send create the entpnt and **update its Mac** but give 
> it state of 
> > not valid (same state like endpnt that waits for path_rec ) 
> This field 
> > will become valid when the join request is finished. When 
> NDIS try to 
> > create the MC group before creating the entpndt check if there is 
> > endpnt with this Mac in the list. If yes use this endpnt for the MC 
> > group check the flag and issue join with full membership
> > The MC group will be in the list only if NDIS ask for it.
> 
> Ok, looking at the code more carefully, the endpoint is 
> created and added to the MAC and GID maps before the 
> multicast request is issued.  The code as it stood already 
> didn't account for a send coming down while the MC join is in 
> progress - the call to ipoib_endpt_queue didn't account for 
> multicast endpoints.
> 
> I added checks so that if there is no AV created, then it 
> returns pending if either there's a path query in progress of 
> the destination QPN is the multicast QPN (0xFFFFFF).
> 
> With this code in place, all that I needed to do in 
> ipoib_port_join_mcast was perform a lookup on the endpoint, 
> and exit if the endpoint already exists.
> 
> The code also already accounts for the endpoint being 
> destroyed while sends are in progress, and the MC group 
> membership won't be removed until all sends using that 
> endpoint complete.
> 
> I had to restructure your patch a little since I wanted 
> ipoib_port_join_mcast to be able to use the __endpt_mgr_ref 
> call (thus, that call can't call ipoib_port_join_mcast).  
> There were only two spots where that function was called, and 
> both spots now check for a NDIS_STATUS_NO_ROUTE_TO_DESTINATION
> status and call ipoib_port_join_mcast if the MAC is an mcast MAC.
> 
> I attach the patch for your review.  I will try to build the 
> mc test case you sent and test, but if you get around to it 
> before I do and it works let me know and I'll check this in.  
> Otherwise I'll send out a mail if I check this in before then.
> 
> Thanks,
> 
> - Fab
> 
> Index: ulp/ipoib/kernel/ipoib_endpoint.c 
> ===================================================================
> --- ulp/ipoib/kernel/ipoib_endpoint.c   (revision 145)
> +++ ulp/ipoib/kernel/ipoib_endpoint.c   (working copy)
> @@ -159,6 +159,12 @@
>  
>     IPOIB_ENTER( IPOIB_DBG_ENDPT );
>  
> +   IPOIB_TRACE( (IPOIB_DBG_ENDPT | IPOIB_DBG_INFO),
> +       ("Create av for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",
> +       p_endpt->mac.addr[0], p_endpt->mac.addr[1],
> +       p_endpt->mac.addr[2], p_endpt->mac.addr[3],
> +       p_endpt->mac.addr[4], p_endpt->mac.addr[5]) );
> +       
>     status = __create_mcast_av( h_pd, port_num, 
> p_mcast_rec->p_member_rec,
>         &p_endpt->h_av );
>     if( status != IB_SUCCESS )
> @@ -277,7 +283,8 @@
>         return NDIS_STATUS_SUCCESS;
>     }
>  
> -   if( p_endpt->h_query )
> +   if( p_endpt->h_query ||
> +       p_endpt->qpn == CL_HTON32(0x00FFFFFF) )
>     {
>         ipoib_endpt_deref( p_endpt );
>         IPOIB_EXIT( IPOIB_DBG_ENDPT );
> Index: ulp/ipoib/kernel/ipoib_port.c 
> ===================================================================
> --- ulp/ipoib/kernel/ipoib_port.c   (revision 145)
> +++ ulp/ipoib/kernel/ipoib_port.c   (working copy)
> @@ -1674,6 +1674,17 @@
>         CL_ASSERT( *pp_dst );
>     }
>  
> +   IPOIB_TRACE( (IPOIB_DBG_RECV | IPOIB_DBG_INFO),
> +       ("Recv:\n"
> +       "\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"
> +       "\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",
> +       (*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],
> +       (*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],
> +       (*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],
> +       (*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],
> +       (*pp_dst )->mac.addr[2], (*pp_dst )->mac.addr[3],
> +       (*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );
> +
>     IPOIB_EXIT( IPOIB_DBG_RECV );
>  }
>  
> @@ -3294,6 +3305,19 @@
>     status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, pp_endpt );
>     cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );
>  
> +   if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&
> +       p_eth_hdr->dst.addr[0] == 0x01 &&
> +       p_eth_hdr->dst.addr[1] == 0x00 &&
> +       p_eth_hdr->dst.addr[2] == 0x5E )
> +   {
> +       if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst ) 
> == IB_SUCCESS )
> +       {
> +           IPOIB_TRACE_EXIT( IPOIB_DBG_ENDPT,
> +               ("Multicast Mac - trying to join.\n") );
> +           return NDIS_STATUS_PENDING;
> +       }
> +   }
> +
>     IPOIB_EXIT( IPOIB_DBG_SEND );
>     return status;
>  }
> @@ -3555,6 +3579,22 @@
>         else if( status != NDIS_STATUS_SUCCESS )
>         {
>             ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );
> +
> +           if( p_eth_hdr->dst.addr[0] == 0x01 &&
> +               p_eth_hdr->dst.addr[1] == 0x00 &&
> +               p_eth_hdr->dst.addr[2] == 0x5E )
> +           {
> +               if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst ) ==
> +                   IB_SUCCESS )
> +               {
> +                   IPOIB_TRACE_EXIT( IPOIB_DBG_ENDPT,
> +                       ("Multicast Mac - trying to join.\n") );
> +                   cl_qlist_insert_head( 
> &p_port->send_mgr.pending_list,
> +                       IPOIB_LIST_ITEM_FROM_PACKET( desc.p_pkt ) );
> +                   break;
> +               }
> +           }
> +
>             /*
>              * Complete the send as if we sent it - WHQL 
> tests don't like the
>              * sends to fail.
> @@ -3876,6 +3916,11 @@
>  
>     cl_obj_lock( &p_port->obj );
>  
> +   IPOIB_TRACE( (IPOIB_DBG_ENDPT | IPOIB_DBG_INFO),
> +       ("Look for :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",
> +       mac.addr[0], mac.addr[1], mac.addr[2],
> +       mac.addr[3], mac.addr[4], mac.addr[5]) );
> +
>     p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );
>     if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )
>     {
> @@ -3988,6 +4033,11 @@
>  {
>     IPOIB_ENTER( IPOIB_DBG_ENDPT );
>  
> +   IPOIB_TRACE( (IPOIB_DBG_ENDPT | IPOIB_DBG_INFO),
> +       ("insert  :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",
> +       mac.addr[0], mac.addr[1], mac.addr[2],
> +       mac.addr[3], mac.addr[4], mac.addr[5]) );
> +
>     cl_obj_lock( &p_port->obj );
>     while( p_port->endpt_rdr )
>     {
> @@ -4866,6 +4916,19 @@
>  
>     IPOIB_ENTER( IPOIB_DBG_MCAST );
>  
> +   switch( __endpt_mgr_ref( p_port, mac, &p_endpt ) )
> +   {
> +   case NDIS_STATUS_NO_ROUTE_TO_DESTINATION:
> +       break;
> +
> +   case NDIS_STATUS_SUCCESS:
> +       ipoib_endpt_deref( p_endpt );
> +       /* Fall through */
> +
> +   case NDIS_STATUS_PENDING:
> +       return IB_SUCCESS;
> +   }
> +
>     /*
>      * Issue the mcast request, using the parameters of the 
> broadcast group.
>      * This allows us to do a create request that should 
> always succeed since @@ -5030,6 +5093,10 @@
>         CL_ASSERT( p_qitem == &p_endpt->lid_item );
>     }
>     cl_obj_unlock( &p_port->obj );
> +   
> +   /* Try to send all pending sends. */
> +   ipoib_port_resume( p_port );
> +
>     cl_obj_deref( &p_port->obj );
>  
>     IPOIB_EXIT( IPOIB_DBG_MCAST );
> 



More information about the ofw mailing list