From edf1361b741aa373976e06d25751663a4ef65521 Mon Sep 17 00:00:00 2001 From: ftillier Date: Wed, 16 Nov 2005 17:29:31 +0000 Subject: [PATCH] [IPoIB] Fix multicast send support to not drop packets if the adapter hasn't been configured as a member of that multicast group. Based on code submitted by Yossi Leybovich (sleybo@mellanox.co.il) git-svn-id: svn://openib.tc.cornell.edu/gen1@154 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/ipoib/kernel/ipoib_endpoint.c | 9 +++- trunk/ulp/ipoib/kernel/ipoib_port.c | 67 +++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/trunk/ulp/ipoib/kernel/ipoib_endpoint.c b/trunk/ulp/ipoib/kernel/ipoib_endpoint.c index 2c62c2af..b6650993 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_endpoint.c +++ b/trunk/ulp/ipoib/kernel/ipoib_endpoint.c @@ -159,6 +159,12 @@ ipoib_endpt_set_mcast( 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 @@ ipoib_endpt_queue( 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 ); diff --git a/trunk/ulp/ipoib/kernel/ipoib_port.c b/trunk/ulp/ipoib/kernel/ipoib_port.c index 3c21429a..8f01cc91 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_port.c +++ b/trunk/ulp/ipoib/kernel/ipoib_port.c @@ -1674,6 +1674,17 @@ __recv_get_endpts( 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 @@ __send_mgr_queue( 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 @@ ipoib_port_resume( 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 @@ __endpt_mgr_ref( 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 @@ __endpt_mgr_insert_locked( { 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_port_join_mcast( 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 @@ __mcast_cb( 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 ); -- 2.41.0