From 7b7f3ad77c28973f1c505448ab08f2aace82c9e4 Mon Sep 17 00:00:00 2001 From: aestrin Date: Fri, 5 Sep 2008 14:18:09 +0000 Subject: [PATCH] IPoIB CM updated to trunk rev 1499 git-svn-id: svn://openib.tc.cornell.edu/gen1@1549 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- branches/ipoib_cm/kernel/SOURCES | 7 + branches/ipoib_cm/kernel/ipoib.cdf | 5 +- branches/ipoib_cm/kernel/ipoib_adapter.c | 96 ++++- branches/ipoib_cm/kernel/ipoib_adapter.h | 1 + branches/ipoib_cm/kernel/ipoib_cm.c | 22 +- branches/ipoib_cm/kernel/ipoib_debug.h | 5 + branches/ipoib_cm/kernel/ipoib_driver.c | 132 +++---- branches/ipoib_cm/kernel/ipoib_endpoint.c | 2 +- branches/ipoib_cm/kernel/ipoib_endpoint.h | 4 +- branches/ipoib_cm/kernel/ipoib_ibat.c | 9 +- branches/ipoib_cm/kernel/ipoib_log.mc | 9 + branches/ipoib_cm/kernel/ipoib_port.c | 460 ++++++++++++++++++---- branches/ipoib_cm/kernel/ipoib_port.h | 9 + trunk/ulp/ipoib/kernel/ipoib_driver.h | 4 +- trunk/ulp/ipoib/kernel/ipoib_xfr_mgr.h | 13 +- 15 files changed, 607 insertions(+), 171 deletions(-) diff --git a/branches/ipoib_cm/kernel/SOURCES b/branches/ipoib_cm/kernel/SOURCES index f29391b5..f18da583 100644 --- a/branches/ipoib_cm/kernel/SOURCES +++ b/branches/ipoib_cm/kernel/SOURCES @@ -2,6 +2,13 @@ TARGETNAME=ipoib TARGETPATH=..\..\..\bin\kernel\obj$(BUILD_ALT_DIR) TARGETTYPE=DRIVER +!if $(_NT_TOOLS_VERSION) != 0x700 +# WDK build only - transform .inx --> .inf adding date & version stamp. +# see .\makefile.inc +INF_NAME=netipoib +INF_TARGET=..\..\..\bin\kernel\$(O)\$(INF_NAME).inf +NTTARGETFILES=$(INF_TARGET) +!endif !if $(FREEBUILD) ENABLE_EVENT_TRACING=1 diff --git a/branches/ipoib_cm/kernel/ipoib.cdf b/branches/ipoib_cm/kernel/ipoib.cdf index 5253af19..eb21da98 100644 --- a/branches/ipoib_cm/kernel/ipoib.cdf +++ b/branches/ipoib_cm/kernel/ipoib.cdf @@ -8,5 +8,6 @@ CATATTR1=0x10010001:OSAttr:2:6.0 ipoib.sys=ipoib.sys ibwsd.dll=ibwsd.dll ibwsd32.dll=ibwsd32.dll - - +ibndprov.dll=ibndprov.dll +ibndprov32.dll=ibndprov32.dll +ndinstall.exe=ndinstall.exe diff --git a/branches/ipoib_cm/kernel/ipoib_adapter.c b/branches/ipoib_cm/kernel/ipoib_adapter.c index 801ee654..a70f0274 100644 --- a/branches/ipoib_cm/kernel/ipoib_adapter.c +++ b/branches/ipoib_cm/kernel/ipoib_adapter.c @@ -487,15 +487,75 @@ __adapter_free( } +static ib_api_status_t +ipoib_query_pkey_index(ipoib_adapter_t *p_adapter) +{ + ib_api_status_t status; + ib_ca_attr_t *ca_attr; + uint32_t ca_size; + uint16_t index = 0; + + /* Query the CA for Pkey table */ + status = p_adapter->p_ifc->query_ca(p_adapter->p_port->ib_mgr.h_ca, NULL, &ca_size); + if(status != IB_INSUFFICIENT_MEMORY) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("ib_query_ca failed\n")); + return status; + } + + ca_attr = (ib_ca_attr_t*)cl_zalloc(ca_size); + if (!ca_attr) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("cl_zalloc can't allocate %d\n",ca_size)); + return IB_INSUFFICIENT_MEMORY; + } + + status = p_adapter->p_ifc->query_ca(p_adapter->p_port->ib_mgr.h_ca, ca_attr,&ca_size); + if( status != IB_SUCCESS ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("ib_query_ca returned %s\n", + p_adapter->p_ifc->get_err_str( status )) ); + goto pkey_end; + } + + CL_ASSERT(ca_attr->p_port_attr->p_pkey_table[0] == IB_DEFAULT_PKEY); + for(index = 0; index < ca_attr->p_port_attr->num_pkeys; index++) + { + if(cl_hton16(p_adapter->guids.port_guid.pkey) == ca_attr->p_port_attr->p_pkey_table[index]) + break; + } + if(index >= ca_attr->p_port_attr->num_pkeys) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Pkey table is invalid, index not found\n")); + NdisWriteErrorLogEntry( p_adapter->h_adapter, + EVENT_IPOIB_PARTITION_ERR, 1, p_adapter->guids.port_guid.pkey ); + p_adapter->p_port->pkey_index = PKEY_INVALID_INDEX; + goto pkey_end; + } + + p_adapter->p_port->pkey_index = index; + IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_IB, + ("for PKEY = 0x%04X got index = %d\n",p_adapter->guids.port_guid.pkey,index)); + +pkey_end: + if(ca_attr) + cl_free(ca_attr); + return status; +} + static ib_api_status_t __ipoib_pnp_cb( IN ib_pnp_rec_t *p_pnp_rec ) { - ib_api_status_t status; ipoib_adapter_t *p_adapter; ipoib_port_t *p_port; ib_pnp_event_t old_state; ib_pnp_port_rec_t *p_port_rec; + ib_api_status_t status = IB_SUCCESS; IPOIB_ENTER( IPOIB_DBG_PNP ); @@ -654,15 +714,25 @@ __ipoib_pnp_cb( ("IPOIB: Received unhandled PnP event 0x%x (%s)\n", p_pnp_rec->pnp_event, ib_get_pnp_event_str( p_pnp_rec->pnp_event )) ); /* Fall through. */ - case IB_PNP_PKEY_CHANGE: - case IB_PNP_SM_CHANGE: - case IB_PNP_GID_CHANGE: - case IB_PNP_LID_CHANGE: + status = IB_SUCCESS; - /* We ignore this event if the link is not active. */ + /* We ignore events below if the link is not active. */ if( p_port_rec->p_port_attr->link_state != IB_LINK_ACTIVE ) - break; + break; + + case IB_PNP_PKEY_CHANGE: + if(p_pnp_rec->pnp_event == IB_PNP_PKEY_CHANGE && + p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY) + { + status = ipoib_query_pkey_index(p_adapter); + if(status != IB_SUCCESS) + break; + } + + case IB_PNP_SM_CHANGE: + case IB_PNP_GID_CHANGE: + case IB_PNP_LID_CHANGE: cl_obj_lock( &p_adapter->obj ); old_state = p_adapter->state; @@ -762,8 +832,13 @@ ipoib_refresh_mcast( if( j != p_adapter->mcast_array_size ) continue; - - ipoib_port_join_mcast( p_port, p_mac_array[i] ,IB_MC_REC_STATE_FULL_MEMBER); + if ( ( p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 0x5e && + p_mac_array[i].addr[3] == 0 && p_mac_array[i].addr[4] == 0 && p_mac_array[i].addr[5] == 1 ) || + !( p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 0x5e ) + ) + { + ipoib_port_join_mcast( p_port, p_mac_array[i], IB_MC_REC_STATE_FULL_MEMBER ); + } } } @@ -1001,6 +1076,9 @@ ipoib_set_active( break; default: + if (p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY) + ipoib_query_pkey_index(p_adapter); + /* Join all programmed multicast groups. */ for( i = 0; i < p_adapter->mcast_array_size; i++ ) { diff --git a/branches/ipoib_cm/kernel/ipoib_adapter.h b/branches/ipoib_cm/kernel/ipoib_adapter.h index 4cc4cc83..5428f651 100644 --- a/branches/ipoib_cm/kernel/ipoib_adapter.h +++ b/branches/ipoib_cm/kernel/ipoib_adapter.h @@ -75,6 +75,7 @@ typedef struct _ipoib_params uint32_t payload_mtu; uint32_t xfer_block_size; mac_addr_t conf_mac; + uint32_t mc_leave_rescan; boolean_t cm_enabled; uint32_t cm_payload_mtu; uint32_t cm_xfer_block_size; diff --git a/branches/ipoib_cm/kernel/ipoib_cm.c b/branches/ipoib_cm/kernel/ipoib_cm.c index fe839405..5cc856c4 100644 --- a/branches/ipoib_cm/kernel/ipoib_cm.c +++ b/branches/ipoib_cm/kernel/ipoib_cm.c @@ -277,7 +277,7 @@ ipoib_endpt_connect( conn_req.p_req_pdata = (uint8_t *)&p_endpt->conn.private_data; conn_req.req_length = sizeof( cm_private_data_t ); conn_req.svc_id = p_endpt->conn.service_id; - conn_req.p_primary_path = (ib_path_rec_t* __ptr64)&p_endpt->conn.path_rec; + conn_req.p_primary_path = (ib_path_rec_t*)&p_endpt->conn.path_rec; conn_req.retry_cnt = 3; conn_req.rnr_nak_timeout = 22; /* 20 ms */ @@ -439,14 +439,14 @@ IN ib_cm_req_rec_t *p_cm_req ) CL_ASSERT( p_cm_req ); - p_port = (ipoib_port_t* __ptr64) p_cm_req->context; + p_port = (ipoib_port_t*) p_cm_req->context; p_endpt = ipoib_endpt_get_by_gid( p_port, &p_cm_req->primary_path.dgid ); if( !p_endpt ) return; /*copy private data and parse */ - private_data = (*(cm_private_data_t * __ptr64)p_cm_req->p_req_pdata); + private_data = (*(cm_private_data_t *)p_cm_req->p_req_pdata); if( private_data.ud_qpn != p_endpt->qpn ) { @@ -567,8 +567,8 @@ __conn_accept( cl_memclr( &cm_reply, sizeof( ib_cm_rep_t ) ); - private_data.recv_mtu = ((cm_private_data_t * __ptr64)p_cm_req->p_req_pdata)->recv_mtu; - private_data.ud_qpn = ((cm_private_data_t * __ptr64)p_cm_req->p_req_pdata)->ud_qpn; + private_data.recv_mtu = ((cm_private_data_t *)p_cm_req->p_req_pdata)->recv_mtu; + private_data.ud_qpn = ((cm_private_data_t *)p_cm_req->p_req_pdata)->ud_qpn; cm_reply.p_rep_pdata = (uint8_t*)&private_data; cm_reply.rep_length = sizeof( cm_private_data_t ); @@ -607,7 +607,7 @@ __conn_reply_cb( IPOIB_ENTER( IPOIB_DBG_ENDPT ); CL_ASSERT( p_cm_rep ); - p_endpt = (ipoib_endpt_t* __ptr64) p_cm_rep->qp_context; + p_endpt = (ipoib_endpt_t* ) p_cm_rep->qp_context; if( ! p_endpt ) return; @@ -695,7 +695,7 @@ __conn_rej_cb( CL_ASSERT( p_rej_rec ); - p_endpt = (ipoib_endpt_t* __ptr64)p_rej_rec->qp_context; + p_endpt = (ipoib_endpt_t* )p_rej_rec->qp_context; p_port = ipoib_endpt_parent( p_endpt ); CL_ASSERT( p_endpt->conn.h_qp == p_rej_rec->h_qp ); @@ -734,7 +734,7 @@ __conn_dreq_cb( CL_ASSERT( p_dreq_rec ); - p_endpt = (ipoib_endpt_t * __ptr64)p_dreq_rec->qp_context; + p_endpt = (ipoib_endpt_t *)p_dreq_rec->qp_context; p_port = ipoib_endpt_parent( p_endpt ); cm_state = endpt_cm_set_state( p_endpt, IPOIB_CM_DREP_SENT ); @@ -979,7 +979,7 @@ __conn_reject( cm_rej.rej_status = IB_REJ_USER_DEFINED; cm_rej.ari_length = sizeof( uint16_t ); ari_info = rej_status; - cm_rej.p_ari = (ib_ari_t* __ptr64)&ari_info; + cm_rej.p_ari = (ib_ari_t *)&ari_info; ib_status = p_port->p_adapter->p_ifc->cm_rej( h_cm_handle, &cm_rej ); if( ib_status != IB_SUCCESS ) @@ -995,7 +995,7 @@ static void __endpt_async_event_cb( IN ib_async_event_rec_t *p_event_rec ) { - ipoib_endpt_t* p_endpt = (ipoib_endpt_t* __ptr64)p_event_rec->context; + ipoib_endpt_t* p_endpt = (ipoib_endpt_t *)p_event_rec->context; IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("CM ENDPT [%p] ASYNC EVENT CODE ARRIVED %d(%#x)\n", @@ -1030,4 +1030,4 @@ __conn_send_dreq( } IPOIB_EXIT( IPOIB_DBG_ENDPT ); -} \ No newline at end of file +} diff --git a/branches/ipoib_cm/kernel/ipoib_debug.h b/branches/ipoib_cm/kernel/ipoib_debug.h index ee038d0c..6dfa54b6 100644 --- a/branches/ipoib_cm/kernel/ipoib_debug.h +++ b/branches/ipoib_cm/kernel/ipoib_debug.h @@ -127,12 +127,14 @@ extern uint32_t g_ipoib_dbg_flags; // assignment of _level_ is need to to overcome warning C4127 #define IPOIB_PRINT(_level_,_flag_,_msg_) \ { \ + __pragma(warning(suppress:6326)) \ if( g_ipoib_dbg_level >= (_level_) ) \ CL_TRACE( _flag_, g_ipoib_dbg_flags, _msg_ ); \ } #define IPOIB_PRINT_EXIT(_level_,_flag_,_msg_) \ { \ + __pragma(warning(suppress:6326)) \ if( g_ipoib_dbg_level >= (_level_) ) \ CL_TRACE( _flag_, g_ipoib_dbg_flags, _msg_ );\ IPOIB_EXIT(_flag_);\ @@ -140,18 +142,21 @@ extern uint32_t g_ipoib_dbg_flags; #define IPOIB_ENTER(_flag_) \ { \ + __pragma(warning(suppress:6326)) \ if( g_ipoib_dbg_level >= TRACE_LEVEL_VERBOSE ) \ CL_ENTER( _flag_, g_ipoib_dbg_flags ); \ } #define IPOIB_EXIT(_flag_)\ { \ + __pragma(warning(suppress:6326)) \ if( g_ipoib_dbg_level >= TRACE_LEVEL_VERBOSE ) \ CL_EXIT( _flag_, g_ipoib_dbg_flags ); \ } #define IPOIB_TRACE_BYTES( lvl, ptr, len ) \ { \ + __pragma(warning(suppress:6326)) \ if( g_ipoib_dbg_level >= (_level_) && \ (g_ipoib_dbg_flags & (_flag_)) ) \ { \ diff --git a/branches/ipoib_cm/kernel/ipoib_driver.c b/branches/ipoib_cm/kernel/ipoib_driver.c index 25bd7806..bf2d6d0d 100644 --- a/branches/ipoib_cm/kernel/ipoib_driver.c +++ b/branches/ipoib_cm/kernel/ipoib_driver.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2005 SilverStorm Technologies. All rights reserved. * Copyright (c) 2006 Mellanox Technologies. All rights reserved. + * Portions Copyright (c) 2008 Microsoft Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: @@ -152,7 +153,8 @@ IPOIB_REG_ENTRY HCARegTable[] = { {NDIS_STRING_CONST("SaTimeout"), 1, IPOIB_OFFSET(sa_timeout), IPOIB_SIZE(sa_timeout), 1000, 250, UINT_MAX}, {NDIS_STRING_CONST("SaRetries"), 1, IPOIB_OFFSET(sa_retry_cnt), IPOIB_SIZE(sa_retry_cnt), 10, 1, UINT_MAX}, {NDIS_STRING_CONST("RecvRatio"), 1, IPOIB_OFFSET(recv_pool_ratio), IPOIB_SIZE(recv_pool_ratio), 1, 1, 10}, - {NDIS_STRING_CONST("PayloadMtu"), 1, IPOIB_OFFSET(payload_mtu), IPOIB_SIZE(payload_mtu), MAX_UD_PAYLOAD_MTU, 60, MAX_CM_PAYLOAD_MTU}, + {NDIS_STRING_CONST("PayloadMtu"), 1, IPOIB_OFFSET(payload_mtu), IPOIB_SIZE(payload_mtu), 2044, 60, 4092}, + {NDIS_STRING_CONST("MCLeaveRescan"), 1, IPOIB_OFFSET(mc_leave_rescan), IPOIB_SIZE(mc_leave_rescan), 260, 1, 3600}, {NDIS_STRING_CONST("CmEnabled"), 1, IPOIB_OFFSET(cm_enabled), IPOIB_SIZE(cm_enabled), 0, 0, 1} }; @@ -445,7 +447,7 @@ __ipoib_read_registry( g_ipoib_dbg_flags)); #if DBG - if( g_ipoib_dbg_flags & IPOIB_DBG_ERROR ) + if( g_ipoib_dbg_flags & IPOIB_DBG_ERR ) g_ipoib_dbg_flags |= CL_DBG_ERROR; #endif @@ -594,7 +596,6 @@ ipoib_get_adapter_params( p_adapter->params.payload_mtu = min( MAX_UD_PAYLOAD_MTU, p_adapter->params.payload_mtu); p_adapter->params.xfer_block_size = (sizeof(eth_hdr_t) + p_adapter->params.payload_mtu); - NdisReadNetworkAddress( &status, &mac, &len, h_config ); ETH_COPY_NETWORK_ADDRESS( p_adapter->params.conf_mac.addr, p_adapter->mac.addr ); @@ -917,32 +918,32 @@ ipoib_query_info( { /* Required General */ case OID_GEN_SUPPORTED_LIST: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_SUPPORTED_LIST\n", port_num) ); src_buf = (PVOID)SUPPORTED_OIDS; buf_len = sizeof(SUPPORTED_OIDS); break; case OID_GEN_HARDWARE_STATUS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_HARDWARE_STATUS\n", port_num) ); cl_obj_lock( &p_adapter->obj ); switch( p_adapter->state ) { case IB_PNP_PORT_ADD: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NdisHardwareStatusInitializing\n", port_num) ); info = NdisHardwareStatusInitializing; break; case IB_PNP_PORT_ACTIVE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NdisHardwareStatusReady\n", port_num) ); info = NdisHardwareStatusReady; break; default: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NdisHardwareStatusNotReady\n", port_num) ); info = NdisHardwareStatusNotReady; } @@ -951,23 +952,20 @@ ipoib_query_info( case OID_GEN_MEDIA_SUPPORTED: case OID_GEN_MEDIA_IN_USE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MEDIA_SUPPORTED " "or OID_GEN_MEDIA_IN_USE\n", port_num) ); info = NdisMedium802_3; break; case OID_GEN_MAXIMUM_FRAME_SIZE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MAXIMUM_FRAME_SIZE\n", port_num) ); - if( p_adapter->params.cm_enabled ) - info = p_adapter->params.cm_payload_mtu; - else - info = p_adapter->params.payload_mtu; + info = p_adapter->params.payload_mtu; break; case OID_GEN_LINK_SPEED: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_LINK_SPEED\n", port_num) ); cl_obj_lock( &p_adapter->obj ); switch( p_adapter->state ) @@ -979,13 +977,13 @@ ipoib_query_info( /* Save the request parameters. */ p_adapter->query_oid = oid_info; - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NDIS_STATUS_PENDING\n", port_num) ); status = NDIS_STATUS_PENDING; break; case IB_PNP_PORT_REMOVE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NDIS_STATUS_NOT_ACCEPTED\n", port_num) ); status = NDIS_STATUS_NOT_ACCEPTED; break; @@ -999,7 +997,7 @@ ipoib_query_info( break; case OID_GEN_TRANSMIT_BUFFER_SPACE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_TRANSMIT_BUFFER_SPACE\n", port_num) ); if( p_adapter->params.cm_enabled ) info = p_adapter->params.sq_depth * p_adapter->params.cm_xfer_block_size; @@ -1008,7 +1006,7 @@ ipoib_query_info( break; case OID_GEN_RECEIVE_BUFFER_SPACE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_TRANSMIT_BUFFER_SPACE " "or OID_GEN_RECEIVE_BUFFER_SPACE\n", port_num) ); if( p_adapter->params.cm_enabled ) @@ -1022,7 +1020,7 @@ ipoib_query_info( case OID_GEN_TRANSMIT_BLOCK_SIZE: case OID_GEN_RECEIVE_BLOCK_SIZE: case OID_GEN_MAXIMUM_TOTAL_SIZE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MAXIMUM_LOOKAHEAD " "or OID_GEN_CURRENT_LOOKAHEAD or " "OID_GEN_TRANSMIT_BLOCK_SIZE or " @@ -1035,21 +1033,21 @@ ipoib_query_info( break; case OID_GEN_VENDOR_ID: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_VENDOR_ID\n", port_num) ); src_buf = (void*)VENDOR_ID; buf_len = sizeof(VENDOR_ID); break; case OID_GEN_VENDOR_DESCRIPTION: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_VENDOR_DESCRIPTION\n", port_num) ); src_buf = VENDOR_DESCRIPTION; buf_len = sizeof(VENDOR_DESCRIPTION); break; case OID_GEN_VENDOR_DRIVER_VERSION: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_VENDOR_DRIVER_VERSION\n", port_num) ); src_buf = &version; buf_len = sizeof(version); @@ -1058,19 +1056,19 @@ ipoib_query_info( break; case OID_GEN_PHYSICAL_MEDIUM: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_PHYSICAL_MEDIUM\n", port_num) ); info = NdisPhysicalMediumUnspecified; break; case OID_GEN_CURRENT_PACKET_FILTER: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_CURRENT_PACKET_FILTER\n", port_num) ); info = p_adapter->packet_filter; break; case OID_GEN_DRIVER_VERSION: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_DRIVER_VERSION\n", port_num) ); src_buf = &version; buf_len = sizeof(version); @@ -1078,7 +1076,7 @@ ipoib_query_info( break; case OID_GEN_MAC_OPTIONS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MAC_OPTIONS\n", port_num) ); info = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | NDIS_MAC_OPTION_TRANSFERS_NOT_PEND | @@ -1092,7 +1090,7 @@ ipoib_query_info( break; case OID_GEN_MEDIA_CONNECT_STATUS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MEDIA_CONNECT_STATUS\n", port_num) ); cl_obj_lock( &p_adapter->obj ); switch( p_adapter->state ) @@ -1106,25 +1104,25 @@ ipoib_query_info( p_adapter->pending_query = TRUE; p_adapter->query_oid = oid_info; - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NDIS_STATUS_PENDING\n", port_num) ); status = NDIS_STATUS_PENDING; break; case IB_PNP_PORT_ACTIVE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NdisMediaStateConnected\n", port_num) ); info = NdisMediaStateConnected; break; case IB_PNP_PORT_REMOVE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NDIS_STATUS_NOT_ACCEPTED\n", port_num) ); status = NDIS_STATUS_NOT_ACCEPTED; break; default: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d returning NdisMediaStateDisconnected\n", port_num) ); info = NdisMediaStateDisconnected; } @@ -1132,126 +1130,126 @@ ipoib_query_info( break; case OID_GEN_MAXIMUM_SEND_PACKETS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MAXIMUM_SEND_PACKETS\n", port_num) ); info = MAXULONG; break; /* Required General Statistics */ case OID_GEN_XMIT_OK: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_XMIT_OK\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_SUCCESS, &oid_info ); break; case OID_GEN_RCV_OK: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_RCV_OK\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_SUCCESS, &oid_info ); break; case OID_GEN_XMIT_ERROR: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_XMIT_ERROR\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_ERROR, &oid_info ); break; case OID_GEN_RCV_ERROR: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_RCV_ERROR\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_ERROR, &oid_info ); break; case OID_GEN_RCV_NO_BUFFER: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_RCV_NO_BUFFER\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_DROPPED, &oid_info ); break; case OID_GEN_DIRECTED_BYTES_XMIT: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_DIRECTED_BYTES_XMIT\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_UCAST_BYTES, &oid_info ); break; case OID_GEN_DIRECTED_FRAMES_XMIT: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_DIRECTED_FRAMES_XMIT\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_UCAST_FRAMES, &oid_info ); break; case OID_GEN_MULTICAST_BYTES_XMIT: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MULTICAST_BYTES_XMIT\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_MCAST_BYTES, &oid_info ); break; case OID_GEN_MULTICAST_FRAMES_XMIT: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MULTICAST_FRAMES_XMIT\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_MCAST_FRAMES, &oid_info ); break; case OID_GEN_BROADCAST_BYTES_XMIT: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_BROADCAST_BYTES_XMIT\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_BCAST_BYTES, &oid_info ); break; case OID_GEN_BROADCAST_FRAMES_XMIT: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_BROADCAST_FRAMES_XMIT\n", port_num) ); src_buf = NULL; status = ipoib_get_send_stat( p_adapter, IP_STAT_BCAST_FRAMES, &oid_info ); break; case OID_GEN_DIRECTED_BYTES_RCV: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_DIRECTED_BYTES_RCV\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_UCAST_BYTES, &oid_info ); break; case OID_GEN_DIRECTED_FRAMES_RCV: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_DIRECTED_FRAMES_RCV\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_UCAST_FRAMES, &oid_info ); break; case OID_GEN_MULTICAST_BYTES_RCV: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MULTICAST_BYTES_RCV\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_MCAST_BYTES, &oid_info ); break; case OID_GEN_MULTICAST_FRAMES_RCV: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_MULTICAST_FRAMES_RCV\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_MCAST_FRAMES, &oid_info ); break; case OID_GEN_BROADCAST_BYTES_RCV: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_BROADCAST_BYTES_RCV\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_BCAST_BYTES, &oid_info ); break; case OID_GEN_BROADCAST_FRAMES_RCV: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_GEN_BROADCAST_FRAMES_RCV\n", port_num) ); src_buf = NULL; status = ipoib_get_recv_stat( p_adapter, IP_STAT_BCAST_FRAMES, &oid_info ); @@ -1259,34 +1257,34 @@ ipoib_query_info( /* Required Ethernet operational characteristics */ case OID_802_3_PERMANENT_ADDRESS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_802_3_PERMANENT_ADDRESS\n", port_num) ); src_buf = &p_adapter->mac; buf_len = sizeof(p_adapter->mac); break; case OID_802_3_CURRENT_ADDRESS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_802_3_CURRENT_ADDRESS\n", port_num) ); src_buf = &p_adapter->params.conf_mac; buf_len = sizeof(p_adapter->params.conf_mac); break; case OID_802_3_MULTICAST_LIST: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_802_3_MULTICAST_LIST\n", port_num) ); src_buf = p_adapter->mcast_array; buf_len = p_adapter->mcast_array_size * sizeof(mac_addr_t); break; case OID_802_3_MAXIMUM_LIST_SIZE: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_802_3_MAXIMUM_LIST_SIZE\n", port_num) ); info = MAX_MCAST; break; case OID_802_3_MAC_OPTIONS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_802_3_MAC_OPTIONS\n", port_num) ); info = 0; break; @@ -1295,7 +1293,7 @@ ipoib_query_info( case OID_802_3_RCV_ERROR_ALIGNMENT: case OID_802_3_XMIT_ONE_COLLISION: case OID_802_3_XMIT_MORE_COLLISIONS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received query for OID_802_3_RCV_ERROR_ALIGNMENT or " "OID_802_3_XMIT_ONE_COLLISION or " "OID_802_3_XMIT_MORE_COLLISIONS\n", port_num) ); @@ -1327,7 +1325,7 @@ ipoib_query_info( case OID_802_3_XMIT_LATE_COLLISIONS: case OID_PNP_CAPABILITIES: status = NDIS_STATUS_NOT_SUPPORTED; - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received an unsupported oid of 0x%.8X!\n", port_num, oid) ); break; @@ -1340,7 +1338,7 @@ ipoib_query_info( #endif default: status = NDIS_STATUS_INVALID_OID; - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received an invalid oid of 0x%.8X!\n", port_num, oid) ); break; } @@ -1380,7 +1378,7 @@ ipoib_complete_query( { if( p_oid_info->buf_len < buf_len ) { - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Insufficient buffer space. " "Returning NDIS_STATUS_INVALID_LENGTH.\n") ); oid_status = NDIS_STATUS_INVALID_LENGTH; @@ -1398,7 +1396,7 @@ ipoib_complete_query( } else { - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Returning NDIS_NOT_ACCEPTED") ); oid_status = NDIS_STATUS_NOT_ACCEPTED; } @@ -1507,7 +1505,7 @@ __ipoib_set_tcp_task_offload( NDIS_TASK_OFFLOAD *p_offload_task; NDIS_TASK_TCP_IP_CHECKSUM *p_offload_chksum; - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received set for OID_TCP_TASK_OFFLOAD\n", p_adapter->guids.port_num) ); @@ -1667,7 +1665,7 @@ ipoib_set_info( { /* Required General */ case OID_GEN_CURRENT_PACKET_FILTER: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received set for OID_GEN_CURRENT_PACKET_FILTER\n", port_num)); if( info_buf_len < sizeof(p_adapter->packet_filter) ) { @@ -1729,14 +1727,14 @@ ipoib_set_info( break; case OID_GEN_CURRENT_LOOKAHEAD: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received set for OID_GEN_CURRENT_LOOKAHEAD\n", port_num)); if( info_buf_len < buf_len ) status = NDIS_STATUS_INVALID_LENGTH; break; case OID_GEN_PROTOCOL_OPTIONS: - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d received set for OID_GEN_PROTOCOL_OPTIONS\n", port_num)); if( info_buf_len < buf_len ) status = NDIS_STATUS_INVALID_LENGTH; @@ -1759,14 +1757,14 @@ ipoib_set_info( ("Port %d received set for OID_802_3_MULTICAST_LIST\n", port_num) ); if( info_buf_len > MAX_MCAST * sizeof(mac_addr_t) ) { - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d OID_802_3_MULTICAST_LIST - Multicast list full.\n", port_num) ); status = NDIS_STATUS_MULTICAST_FULL; *p_bytes_needed = MAX_MCAST * sizeof(mac_addr_t); } else if( info_buf_len % sizeof(mac_addr_t) ) { - IPOIB_PRINT( TRACE_LEVEL_VERBOSE,IPOIB_DBG_OID, + IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) ); status = NDIS_STATUS_INVALID_DATA; } @@ -2563,7 +2561,7 @@ __ipoib_ats_reg_cb( CL_ASSERT( p_reg_svc_rec ); CL_ASSERT( p_reg_svc_rec->svc_context ); - p_reg = (ats_reg_t* __ptr64)p_reg_svc_rec->svc_context; + p_reg = (ats_reg_t*)p_reg_svc_rec->svc_context; port_num = p_reg->p_adapter->guids.port_num; cl_obj_lock( &p_reg->p_adapter->obj ); diff --git a/branches/ipoib_cm/kernel/ipoib_endpoint.c b/branches/ipoib_cm/kernel/ipoib_endpoint.c index 74dd5169..8be2fb76 100644 --- a/branches/ipoib_cm/kernel/ipoib_endpoint.c +++ b/branches/ipoib_cm/kernel/ipoib_endpoint.c @@ -442,7 +442,7 @@ __path_query_cb( IPOIB_ENTER( IPOIB_DBG_ENDPT ); - p_endpt = (ipoib_endpt_t*__ptr64)p_query_rec->query_context; + p_endpt = (ipoib_endpt_t*)p_query_rec->query_context; p_port = __endpt_parent( p_endpt ); cl_obj_lock( &p_endpt->obj ); diff --git a/branches/ipoib_cm/kernel/ipoib_endpoint.h b/branches/ipoib_cm/kernel/ipoib_endpoint.h index 00085295..ce35554c 100644 --- a/branches/ipoib_cm/kernel/ipoib_endpoint.h +++ b/branches/ipoib_cm/kernel/ipoib_endpoint.h @@ -46,7 +46,6 @@ #include "ipoib_debug.h" -//typedef struct _ipoib_recv_desc ipoib_recv_desc_t; typedef struct _endpt_buf_mgr { @@ -120,7 +119,8 @@ typedef struct _ipoib_endpt cl_event_t remove_event; ib_al_ifc_t *p_ifc; - + boolean_t is_in_use; + boolean_t is_mcast_listener; } ipoib_endpt_t; /* * FIELDS diff --git a/branches/ipoib_cm/kernel/ipoib_ibat.c b/branches/ipoib_cm/kernel/ipoib_ibat.c index f9191306..55ef84c1 100644 --- a/branches/ipoib_cm/kernel/ipoib_ibat.c +++ b/branches/ipoib_cm/kernel/ipoib_ibat.c @@ -35,7 +35,6 @@ #include "ipoib_driver.h" #include "ipoib_adapter.h" #include "ipoib_port.h" -#include "ipoib_endpoint.h" #include "ipoib_debug.h" #if defined(EVENT_TRACING) #ifdef offsetof @@ -550,25 +549,25 @@ __ipoib_dispatch( switch( pIoStack->Parameters.DeviceIoControl.IoControlCode ) { - case IOCTL_IBAT_PORTS: //check_done, fixed print_ips + case IOCTL_IBAT_PORTS: IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, ("IOCTL_IBAT_PORTS received\n") ); status = __ibat_get_ports( pIrp, pIoStack ); break; - case IOCTL_IBAT_IP_ADDRESSES: //check_done, fixed query_ip_address,CProvider::QueryAddressList,print_ips + case IOCTL_IBAT_IP_ADDRESSES: IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, ("IOCTL_IBAT_IP_ADDRESSES received\n" )); status = __ibat_get_ips( pIrp, pIoStack ); break; - case IOCTL_IBAT_MAC_TO_GID: //check_done, fixed remote_ip, SdpArp::DestPortGidFromMac + case IOCTL_IBAT_MAC_TO_GID: IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, ("IOCTL_IBAT_MAC_TO_GID received\n" )); status = __ibat_mac_to_gid( pIrp, pIoStack ); break; - case IOCTL_IBAT_IP_TO_PORT: //check_done, fixed CProvider::OpenAdapter + case IOCTL_IBAT_IP_TO_PORT: IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, ("IOCTL_IBAT_IP_TO_PORT received\n" )); status = __ibat_ip_to_port( pIrp, pIoStack ); diff --git a/branches/ipoib_cm/kernel/ipoib_log.mc b/branches/ipoib_cm/kernel/ipoib_log.mc index 646035e0..193e368a 100644 --- a/branches/ipoib_cm/kernel/ipoib_log.mc +++ b/branches/ipoib_cm/kernel/ipoib_log.mc @@ -307,3 +307,12 @@ SymbolicName=EVENT_IPOIB_WRONG_PARAMETER_INFO Language=English %2: Incorrect value or non-existing registry for the optional IPoIB parameter %3, overriding it by default value: %4 . + +MessageId=0x005B +Facility=IPoIB +Severity=Error +SymbolicName=EVENT_IPOIB_PARTITION_ERR +Language=English +%2: Pkey index not found for partition , change switch pkey configuration. +. + diff --git a/branches/ipoib_cm/kernel/ipoib_port.c b/branches/ipoib_cm/kernel/ipoib_port.c index c12a5405..0e9d9f17 100644 --- a/branches/ipoib_cm/kernel/ipoib_port.c +++ b/branches/ipoib_cm/kernel/ipoib_port.c @@ -60,7 +60,8 @@ ib_gid_t bcast_mgid_template = { ipoib_port_t *gp_ipoib_port; #endif - +static void __port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2); +static void __port_do_mcast_garbage(ipoib_port_t* const p_port ); /****************************************************************************** * * Declarations @@ -93,10 +94,6 @@ __port_query_ca_attrs( IN ipoib_port_t* const p_port, IN ib_ca_attr_t** pp_ca_attrs ); -static uint16_t -__port_get_pkey_index( - IN ib_ca_attr_t* const p_ca_attrs, - IN ib_net16_t pkey ); static void __srq_async_event_cb( IN ib_async_event_rec_t *p_event_rec ); @@ -295,6 +292,14 @@ __send_mgr_filter_ip( IN size_t buf_len, IN OUT ipoib_send_desc_t* const p_desc ); +static NDIS_STATUS +__send_mgr_filter_igmp_v2( + IN ipoib_port_t* const p_port, + IN const ip_hdr_t* const p_ip_hdr, + IN size_t iph_options_size, + IN NDIS_BUFFER* p_buf, + IN size_t buf_len ); + static NDIS_STATUS __send_mgr_filter_udp( IN ipoib_port_t* const p_port, @@ -460,14 +465,6 @@ __leave_error_mcast_cb( IN void *context ); -static void -__endpt_cm_init( - IN void* p_context ); - -static ib_api_status_t -__endpt_cm_init_endpt( - IN ipoib_endpt_t* const p_endpt ); - static intn_t __gid_cmp( IN const void* const p_key1, @@ -503,6 +500,13 @@ inline void ipoib_port_deref(ipoib_port_t * p_port, int type) #endif } +/* function returns pointer to payload that is going after IP header. +* asssuming that payload and IP header are in the same buffer +*/ +static void* GetIpPayloadPtr(const ip_hdr_t* const p_ip_hdr) +{ + return (void*)((uint8_t*)p_ip_hdr + 4*(p_ip_hdr->ver_hl & 0xf)); +} /****************************************************************************** * @@ -666,6 +670,9 @@ __port_init( p_adapter->p_ifc->get_err_str( status )) ); return status; } + /* Initialize multicast garbage collector timer and DPC object */ + KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port); + KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer); /* We only ever destroy from the PnP callback thread. */ cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC, @@ -767,6 +774,8 @@ __port_free( p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj ); + KeCancelTimer(&p_port->gc_timer); + KeFlushQueuedDpcs(); __endpt_mgr_destroy( p_port ); __recv_mgr_destroy( p_port ); __send_mgr_destroy( p_port ); @@ -840,9 +849,6 @@ __ib_mgr_init( ("Query CA attributes failed\n" ) ); return status; } - p_port->pkey_index = __port_get_pkey_index( p_port->p_ca_attrs, - p_port->p_adapter->guids.port_guid.pkey ); - /* Allocate the PD. */ status = p_port->p_adapter->p_ifc->alloc_pd( p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd ); @@ -970,7 +976,7 @@ __srq_async_event_cb( IN ib_async_event_rec_t *p_event_rec ) { ipoib_port_t* p_port = - (ipoib_port_t * __ptr64 )p_event_rec->context; + (ipoib_port_t *)p_event_rec->context; switch( p_event_rec->code ) { @@ -1092,21 +1098,6 @@ done: return ib_status; } -static uint16_t -__port_get_pkey_index( - IN ib_ca_attr_t* const p_ca_attrs, - IN ib_net16_t pkey ) -{ - uint16_t index; - CL_ASSERT( p_ca_attrs->p_port_attr->p_pkey_table[0] == IB_DEFAULT_PKEY ); - for( index = 0; index < p_ca_attrs->p_port_attr->num_pkeys; index++ ) - { - if( p_ca_attrs->p_port_attr->p_pkey_table[index] == pkey ) - return index; - } - return 0; -} - void ipoib_port_srq_destroy( IN ipoib_port_t* const p_port ) @@ -1668,7 +1659,7 @@ ipoib_return_packet( cl_perf_start( ReturnPacket ); - /* Get the port from the packet. */ + /* Get the port and descriptor from the packet. */ p_port = IPOIB_PORT_FROM_PACKET( p_packet ); cl_spinlock_acquire( &p_port->recv_lock ); @@ -2133,6 +2124,7 @@ __recv_mgr_filter( } /* Successful completion. Get the receive information. */ + p_desc->ndis_csum.Value = (ULONG) p_wc->csum_ok; cl_perf_start( GetRecvEndpts ); __recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst ); cl_perf_stop( &p_port->p_adapter->perf, GetRecvEndpts ); @@ -2257,6 +2249,7 @@ __recv_mgr_filter( } else { + ip_stat_sel_t ip_stat; p_desc->len = len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t); if( p_dst->h_mcast) @@ -2267,17 +2260,22 @@ __recv_mgr_filter( p_dst->dgid.multicast.raw_group_id[13] == 0xFF ) { p_desc->type = PKT_TYPE_BCAST; + ip_stat = IP_STAT_BCAST_BYTES; } else { p_desc->type = PKT_TYPE_MCAST; + ip_stat = IP_STAT_MCAST_BYTES; } } else { p_desc->type = PKT_TYPE_UCAST; + ip_stat = IP_STAT_UCAST_BYTES; + } cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item ); + ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, len, 1 ); } } @@ -2311,6 +2309,16 @@ __recv_gen( p_eth->hdr.src = p_src->mac; p_eth->hdr.dst = p_dst->mac; + if ( p_eth->hdr.dst.addr[0] == 1 && + p_eth->hdr.type == ETH_PROT_TYPE_IP && + p_eth->hdr.dst.addr[2] == 0x5E) + { + p_eth->hdr.dst.addr[1] = 0; + p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f; + } + if (p_dst->h_mcast) + p_dst->is_in_use = TRUE; + IPOIB_EXIT( IPOIB_DBG_RECV ); return IB_SUCCESS; } @@ -2506,7 +2514,7 @@ __recv_arp( if( p_ib_arp->prot_type != ETH_PROT_TYPE_IP ) { IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, - ("ARP protocol type not IP\n") ); + ("ARP protocal type not IP\n") ); return IB_INVALID_SETTING; } @@ -2706,7 +2714,6 @@ __recv_mgr_prepare_pkt( NDIS_STATUS status; uint32_t pkt_filter; ip_stat_sel_t type; - NDIS_TCP_IP_CHECKSUM_PACKET_INFO chksum; PERF_DECLARE( GetNdisPkt ); IPOIB_ENTER( IPOIB_DBG_RECV ); @@ -2787,14 +2794,9 @@ __recv_mgr_prepare_pkt( return IB_INSUFFICIENT_RESOURCES; } - /* Flag the checksums as having been calculated. */ - chksum.Value = 0; - chksum.Receive.NdisPacketTcpChecksumSucceeded = TRUE; - chksum.Receive.NdisPacketUdpChecksumSucceeded = TRUE; - chksum.Receive.NdisPacketIpChecksumSucceeded = TRUE; - NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = - (void*)(uintn_t)chksum.Value; - + /* Get the checksums directly from packet information. */ + NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = + (PVOID) (uintn_t) (p_desc->ndis_csum.Value); ipoib_inc_recv_stat( p_port->p_adapter, type, p_desc->len, 1 ); IPOIB_EXIT( IPOIB_DBG_RECV ); @@ -3332,6 +3334,26 @@ __send_mgr_filter_ip( if( p_ip_hdr->offset || p_ip_hdr->prot != IP_PROT_UDP ) { + /* Check if this packet is IGMP */ + if ( p_ip_hdr->prot == IP_PROT_IGMP ) + { + /* + In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs: + 1. iph + 2. ip options + So to get the IGMP packet we need to skip the ip options NDIS_BUFFER + */ + size_t iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4; + size_t iph_options_size = iph_size_in_bytes - buf_len; + buf_len -= sizeof(ip_hdr_t);//without ipheader + + /* + Could be a case that arrived igmp packet not from type IGMPv2 , + but IGMPv1 or IGMPv3. + We anyway pass it to __send_mgr_filter_igmp_v2(). + */ + __send_mgr_filter_igmp_v2(p_port, p_ip_hdr, iph_options_size, p_buf, buf_len); + } /* Not a UDP packet. */ cl_perf_start( SendTcp ); status = __send_gen( p_port, p_desc ); @@ -3351,6 +3373,133 @@ __send_mgr_filter_ip( return status; } +static NDIS_STATUS +__send_mgr_filter_igmp_v2( + IN ipoib_port_t* const p_port, + IN const ip_hdr_t* const p_ip_hdr, + IN size_t iph_options_size, + IN NDIS_BUFFER* p_buf, + IN size_t buf_len ) +{ + igmp_v2_hdr_t *p_igmp_v2_hdr = NULL; + NDIS_STATUS endpt_status; + ipoib_endpt_t* p_endpt = NULL; + mac_addr_t fake_mcast_mac; + + IPOIB_ENTER( IPOIB_DBG_SEND ); + + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, + ("buf_len = %d,iph_options_size = %d\n",(int)buf_len,(int)iph_options_size ) ); + + if( !buf_len ) + { + // To get the IGMP packet we need to skip the ip options NDIS_BUFFER (if exists) + while ( iph_options_size ) + { + NdisGetNextBuffer( p_buf, &p_buf ); + if( !p_buf ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Failed to get IGMPv2 header buffer.\n") ); + return NDIS_STATUS_FAILURE; + } + NdisQueryBufferSafe( p_buf, &p_igmp_v2_hdr, &buf_len, NormalPagePriority ); + if( !p_igmp_v2_hdr ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Failed to query IGMPv2 header buffer.\n") ); + return NDIS_STATUS_FAILURE; + } + iph_options_size-=buf_len; + } + + NdisGetNextBuffer( p_buf, &p_buf ); + if( !p_buf ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Failed to get IGMPv2 header buffer.\n") ); + return NDIS_STATUS_FAILURE; + } + NdisQueryBufferSafe( p_buf, &p_igmp_v2_hdr, &buf_len, NormalPagePriority ); + if( !p_igmp_v2_hdr ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Failed to query IGMPv2 header buffer.\n") ); + return NDIS_STATUS_FAILURE; + } + } + else + { + /* assuming ip header and options are in the same packet */ + p_igmp_v2_hdr = GetIpPayloadPtr(p_ip_hdr); + } + /* Get the IGMP header length. */ + if( buf_len < sizeof(igmp_v2_hdr_t) ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Buffer not large enough for IGMPv2 packet.\n") ); + return NDIS_STATUS_BUFFER_TOO_SHORT; + } + + // build fake mac from igmp packet group address + fake_mcast_mac.addr[0] = 1; + fake_mcast_mac.addr[1] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f; + fake_mcast_mac.addr[2] = 0x5E; + fake_mcast_mac.addr[3] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[1]; + fake_mcast_mac.addr[4] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[2]; + fake_mcast_mac.addr[5] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[3]; + + switch ( p_igmp_v2_hdr->type ) + { + case IGMP_V2_MEMBERSHIP_REPORT: + /* + This mean that some body open listener on this group + Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector + will not delete this mcast endpt. + */ + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, + ("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") ); + endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt ); + if ( p_endpt ) + { + cl_obj_lock( &p_port->obj ); + p_endpt->is_mcast_listener = TRUE; + cl_obj_unlock( &p_port->obj ); + ipoib_endpt_deref( p_endpt ); + } + break; + + case IGMP_V2_LEAVE_GROUP: + /* + This mean that somebody CLOSE listener on this group . + Change type of mcast endpt to SEND_ONLY endpt. So mcast + garbage collector will delete this mcast endpt next time. + */ + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, + ("Catched IGMP_V2_LEAVE_GROUP message\n") ); + endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt ); + if ( p_endpt ) + { + cl_obj_lock( &p_port->obj ); + p_endpt->is_mcast_listener = FALSE; + p_endpt->is_in_use = FALSE; + cl_obj_unlock( &p_port->obj ); + ipoib_endpt_deref( p_endpt ); + } + + __port_do_mcast_garbage(p_port); + + break; + + default: + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, + ("Send Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type ) ); + break; + } + + IPOIB_EXIT( IPOIB_DBG_SEND ); + return NDIS_STATUS_SUCCESS; +} static NDIS_STATUS __send_mgr_filter_udp( @@ -3389,7 +3538,7 @@ __send_mgr_filter_udp( } else { - p_udp_hdr = (udp_hdr_t*)(p_ip_hdr + 1); + p_udp_hdr = (udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr); } /* Get the UDP header and check the destination port numbers. */ if( buf_len < sizeof(udp_hdr_t) ) @@ -3437,6 +3586,18 @@ __send_mgr_filter_udp( return status; } +unsigned short ipchksum(unsigned short *ip, int len) +{ + unsigned long sum = 0; + + len >>= 1; + while (len--) { + sum += *(ip++); + if (sum > 0xFFFF) + sum -= 0xFFFF; + } + return (unsigned short)((~sum) & 0x0000FFFF); +} static NDIS_STATUS __send_mgr_filter_dhcp( @@ -3539,7 +3700,7 @@ __send_mgr_filter_dhcp( { IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Can't convert CID to IPoIB format.\n") ); - return IB_INSUFFICIENT_MEMORY; + return NDIS_STATUS_RESOURCES; } /* Move the existing options down, and add a new CID option */ len = p_option - ( p_cid + p_cid[1] + 2 ); @@ -3583,6 +3744,17 @@ __send_mgr_filter_dhcp( cl_memcpy( &p_cid[7], &gid, sizeof(ib_gid_t) ); cl_memcpy( &p_cid[3], &p_port->ib_mgr.qpn, sizeof(p_port->ib_mgr.qpn) ); p_ib_dhcp->htype = DHCP_HW_TYPE_IB; + + /* update lengths to include any change we made */ + p_desc->p_buf->ip.hdr.length = cl_ntoh16( sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) ); + p_desc->p_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) ); + + /* update crc in ip header */ + if( !p_port->p_adapter->params.send_chksum_offload ) + { + p_desc->p_buf->ip.hdr.chksum = 0; + p_desc->p_buf->ip.hdr.chksum = ipchksum((unsigned short*) &p_desc->p_buf->ip.hdr, sizeof(ip_hdr_t)); + } break; /* Server messages. */ @@ -3694,7 +3866,6 @@ __send_mgr_filter_arp( net32_t qpn = 0; status = __endpt_mgr_get_gid_qpn( p_port, p_arp->dst_hw, &p_ib_arp->dst_hw.gid, &qpn ); - if( status != NDIS_STATUS_SUCCESS ) { IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, @@ -3863,13 +4034,21 @@ __send_mgr_queue( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) ) { if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, - IB_MC_REC_STATE_SEND_ONLY_MEMBER) == IB_SUCCESS ) + IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS ) { IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Multicast Mac - trying to join.\n") ); return NDIS_STATUS_PENDING; } } + else if ( status == NDIS_STATUS_SUCCESS && + ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && + !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) + { + CL_ASSERT( (*pp_endpt) ); + CL_ASSERT((*pp_endpt)->h_mcast != NULL); + (*pp_endpt)->is_in_use = TRUE; + } IPOIB_EXIT( IPOIB_DBG_SEND ); return status; @@ -3886,6 +4065,8 @@ __build_send_desc( { NDIS_STATUS status; int32_t hdr_idx; + PNDIS_PACKET_EXTENSION PktExt; + PNDIS_TCP_IP_CHECKSUM_PACKET_INFO pChecksumPktInfo; //NDIS 5.1 PERF_DECLARE( SendMgrFilter ); @@ -3920,6 +4101,23 @@ __build_send_desc( p_desc->wr.wr_id = (uintn_t)p_desc->p_pkt; p_desc->wr.wr_type = WR_SEND; p_desc->wr.send_opt = IB_SEND_OPT_SIGNALED; + + PktExt = NDIS_PACKET_EXTENSION_FROM_PACKET(p_desc->p_pkt); + pChecksumPktInfo = (PNDIS_TCP_IP_CHECKSUM_PACKET_INFO)&PktExt->NdisPacketInfo[TcpIpChecksumPacketInfo]; + if(p_port->p_adapter->params.send_chksum_offload & + (pChecksumPktInfo->Transmit.NdisPacketChecksumV4 || pChecksumPktInfo->Transmit.NdisPacketChecksumV6)) + { + // Set transimition checksum offloading + if (pChecksumPktInfo->Transmit.NdisPacketIpChecksum) + { + p_desc->wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM; + } + if(pChecksumPktInfo->Transmit.NdisPacketTcpChecksum ) + { + p_desc->wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM; + } + } + p_desc->wr.ds_array = p_desc->local_ds; if( ETH_IS_UNICAST( p_eth_hdr->dst.addr ) && @@ -4039,6 +4237,44 @@ ipoib_port_send( } cl_perf_start( SendMgrQueue ); + + if ( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && + p_eth_hdr->type == ETH_PROT_TYPE_IP && + !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) + { + ip_hdr_t *p_ip_hdr; + NDIS_BUFFER *p_ip_hdr_buf; + UINT ip_hdr_buf_len; + + // Extract the ip hdr + NdisGetNextBuffer( p_buf, &p_ip_hdr_buf ); + if( !p_ip_hdr_buf ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Failed to get IP header buffer.\n") ); + goto h_end; + } + + NdisQueryBufferSafe( p_ip_hdr_buf, &p_ip_hdr, &ip_hdr_buf_len, NormalPagePriority ); + if( !p_ip_hdr ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Failed to query IP header buffer.\n") ); + goto h_end; + } + + if( ip_hdr_buf_len < sizeof(ip_hdr_t) ) + { + /* This buffer is done for. Get the next buffer. */ + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Buffer too small for IP packet.\n") ); + goto h_end; + } + + p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] & 0x0f; + p_eth_hdr->dst.addr[3] = ((unsigned char*)&p_ip_hdr->dst_ip)[1]; + } +h_end: status = __send_mgr_queue( p_port, p_eth_hdr, &desc.p_endpt ); cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue ); if( status == NDIS_STATUS_PENDING ) @@ -4184,7 +4420,7 @@ ipoib_port_resume( if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) ) { if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, - IB_MC_REC_STATE_SEND_ONLY_MEMBER) == IB_SUCCESS ) + IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS ) { IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Multicast Mac - trying to join.\n") ); @@ -4590,7 +4826,6 @@ __endpt_mgr_reset_all( cl_qlist_init( &mc_list ); cl_qlist_init( &conn_list ); - cl_obj_lock( &p_port->obj ); /* Wait for all readers to complete. */ while( p_port->endpt_rdr ) @@ -5034,6 +5269,7 @@ __endpt_mgr_add_bcast( return IB_INSUFFICIENT_RESOURCES; } /* set reference to transport to be used while is not attached to the port */ + p_endpt->is_mcast_listener = TRUE; p_endpt->p_ifc = p_port->p_adapter->p_ifc; status = ipoib_endpt_set_mcast( p_endpt, p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec ); @@ -5323,7 +5559,7 @@ __port_info_cb( IPOIB_ENTER( IPOIB_DBG_INIT ); - p_port = (ipoib_port_t* __ptr64)p_query_rec->query_context; + p_port = (ipoib_port_t*)p_query_rec->query_context; cl_obj_lock( &p_port->obj ); p_port->ib_mgr.h_query = NULL; @@ -5441,7 +5677,7 @@ __port_get_bcast( member_rec.mgid.raw[4] = (uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8) ; member_rec.mgid.raw[5] = (uint8_t) p_port->p_adapter->guids.port_guid.pkey; - member_rec.pkey = p_port->p_adapter->guids.port_guid.pkey; + member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey); cl_memclr( &query, sizeof(ib_query_req_t) ); query.query_type = IB_QUERY_USER_DEFINED; query.p_query_input = &info; @@ -5480,7 +5716,7 @@ __bcast_get_cb( IPOIB_ENTER( IPOIB_DBG_INIT ); - p_port = (ipoib_port_t* __ptr64)p_query_rec->query_context; + p_port = (ipoib_port_t*)p_query_rec->query_context; cl_obj_lock( &p_port->obj ); p_port->ib_mgr.h_query = NULL; @@ -5646,7 +5882,7 @@ __port_create_bcast( mcast_req.member_rec.mtu = (IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048; - mcast_req.member_rec.pkey = p_port->p_adapter->guids.port_guid.pkey; + mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey); mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0 ); mcast_req.member_rec.scope_state = @@ -5709,6 +5945,10 @@ ipoib_port_down( KeWaitForSingleObject( &p_port->sa_event, Executive, KernelMode, FALSE, NULL ); + /* garbage collector timer is not needed when link is down */ + KeCancelTimer(&p_port->gc_timer); + KeFlushQueuedDpcs(); + /* * Put the QP in the error state. This removes the need to * synchronize with send/receive callbacks. @@ -5772,10 +6012,11 @@ __bcast_cb( { ipoib_port_t *p_port; ib_api_status_t status; + LARGE_INTEGER gc_due_time; IPOIB_ENTER( IPOIB_DBG_INIT ); - p_port = (ipoib_port_t* __ptr64)p_mcast_rec->mcast_context; + p_port = (ipoib_port_t*)p_mcast_rec->mcast_context; cl_obj_lock( &p_port->obj ); if( p_port->state != IB_QPS_INIT ) @@ -5894,6 +6135,10 @@ err: p_port->p_adapter->params.cm_enabled = FALSE; } } + /* garbage collector timer is needed when link is active */ + gc_due_time.QuadPart = -(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan * 2000000) * 10); + KeSetTimerEx(&p_port->gc_timer,gc_due_time, + (LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc); KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE ); ipoib_port_deref( p_port, ref_join_bcast ); @@ -5907,7 +6152,7 @@ __qp_event( { UNUSED_PARAM( p_event_rec ); CL_ASSERT( p_event_rec->context ); - ((ipoib_port_t* __ptr64)p_event_rec->context)->p_adapter->hung = TRUE; + ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE; } @@ -5917,7 +6162,7 @@ __cq_event( { UNUSED_PARAM( p_event_rec ); CL_ASSERT( p_event_rec->context ); - ((ipoib_port_t* __ptr64)p_event_rec->context)->p_adapter->hung = TRUE; + ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE; } @@ -6021,15 +6266,15 @@ ipoib_port_join_mcast( mcast_req.member_rec.mlid = 0; ib_member_set_state( &mcast_req.member_rec.scope_state,state); - if( mac.addr[0] == 1 && mac.addr[1] == 0 && mac.addr[2] == 0x5E ) + if( (mac.addr[0] == 1) && (mac.addr[2] == 0x5E )) { /* * Update the address portion of the MGID with the 28 lower bits of the - * IP address. Since we're given a MAC address, we end up using only - * the 24 lower bits of that network-byte-ordered value (assuming MSb - * is zero). + * IP address. Since we're given a MAC address, we are using + * 24 lower bits of that network-byte-ordered value (assuming MSb + * is zero) and 4 lsb bits of the first byte of IP address. */ - mcast_req.member_rec.mgid.raw[12] = 0; + mcast_req.member_rec.mgid.raw[12] = mac.addr[1]; mcast_req.member_rec.mgid.raw[13] = mac.addr[3]; mcast_req.member_rec.mgid.raw[14] = mac.addr[4]; mcast_req.member_rec.mgid.raw[15] = mac.addr[5]; @@ -6050,7 +6295,7 @@ ipoib_port_join_mcast( mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt; mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid; mcast_req.pkey_index = p_port->pkey_index; - mcast_req.member_rec.pkey = p_port->p_adapter->guids.port_guid.pkey; + mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey); /* * Create the endpoint and insert it in the port. Since we don't wait for * the mcast SA operations to complete before returning from the multicast @@ -6106,7 +6351,7 @@ __mcast_cb( IPOIB_ENTER( IPOIB_DBG_MCAST ); - p_port = (ipoib_port_t* __ptr64)p_mcast_rec->mcast_context; + p_port = (ipoib_port_t*)p_mcast_rec->mcast_context; cl_obj_lock( &p_port->obj ); if( p_port->state != IB_QPS_RTS ) @@ -6187,6 +6432,8 @@ __mcast_cb( &p_port->endpt_mgr.lid_endpts, p_endpt->dlid, &p_endpt->lid_item ); CL_ASSERT( p_qitem == &p_endpt->lid_item ); } + /* set flag that endpoint is use */ + p_endpt->is_in_use = TRUE; cl_obj_unlock( &p_port->obj ); /* Try to send all pending sends. */ @@ -6206,7 +6453,7 @@ ipoib_leave_mcast_cb( IPOIB_ENTER( IPOIB_DBG_MCAST ); - p_port = (ipoib_port_t* __ptr64)context; + p_port = (ipoib_port_t*)context; IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt)); @@ -6224,8 +6471,6 @@ ipoib_leave_mcast_cb( IPOIB_EXIT( IPOIB_DBG_MCAST ); } - - void __leave_error_mcast_cb( IN void *context ) @@ -6234,7 +6479,7 @@ __leave_error_mcast_cb( IPOIB_ENTER( IPOIB_DBG_MCAST ); - p_port = (ipoib_port_t* __ptr64)context; + p_port = (ipoib_port_t*)context; ipoib_port_deref( p_port, ref_leave_mcast); IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, @@ -6243,6 +6488,87 @@ __leave_error_mcast_cb( IPOIB_EXIT( IPOIB_DBG_MCAST ); } +static void +__port_do_mcast_garbage(ipoib_port_t* const p_port) +{ + const mac_addr_t DEFAULT_MCAST_GROUP = {0x01, 0x00, 0x5E, 0x00, 0x00, 0x01}; + /* Do garbage collecting... */ + + cl_map_item_t *p_item; + ipoib_endpt_t *p_endpt; + cl_qlist_t destroy_mc_list; + uint8_t cnt; + const static GC_MAX_LEAVE_NUM = 80; + + cl_qlist_init( &destroy_mc_list ); + + cl_obj_lock( &p_port->obj ); + cnt = 0; + p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts ); + while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )) && (cnt < GC_MAX_LEAVE_NUM)) + { + p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item ); + p_item = cl_qmap_next( p_item ); + + /* Check if the current endpoint is not a multicast listener */ + + if( p_endpt->h_mcast && + (!p_endpt->is_mcast_listener) && + ( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t) ) && + (!p_endpt->is_in_use) )) + { + cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts, + &p_endpt->mac_item ); + cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts, + &p_endpt->gid_item ); + + if( p_endpt->dlid ) + { + cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts, + &p_endpt->lid_item ); + p_endpt->dlid = 0; + } + + cl_qlist_insert_tail( + &destroy_mc_list, &p_endpt->mac_item.pool_item.list_item ); + cnt++; + } + else + p_endpt->is_in_use = FALSE; + } + cl_obj_unlock( &p_port->obj ); + + /* Destroy all multicast endpoints now that we have released the lock. */ + while( cl_qlist_count( &destroy_mc_list ) ) + { + p_endpt = PARENT_STRUCT( cl_qlist_head( &destroy_mc_list ), + ipoib_endpt_t, mac_item.pool_item.list_item ); + IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT, + ("mcast garbage collector: destroying endpoint %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]) ); + + cl_obj_destroy( &PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ), + ipoib_endpt_t, mac_item.pool_item.list_item )->obj ); + } +} + +static void +__port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2) +{ + ipoib_port_t *p_port = context; + + UNREFERENCED_PARAMETER(p_gc_dpc); + UNREFERENCED_PARAMETER(s_arg1); + UNREFERENCED_PARAMETER(s_arg2); + + __port_do_mcast_garbage(p_port); +} + ipoib_endpt_t* ipoib_endpt_get_by_gid( IN ipoib_port_t* const p_port, diff --git a/branches/ipoib_cm/kernel/ipoib_port.h b/branches/ipoib_cm/kernel/ipoib_port.h index 399dc045..c9efb00e 100644 --- a/branches/ipoib_cm/kernel/ipoib_port.h +++ b/branches/ipoib_cm/kernel/ipoib_port.h @@ -45,11 +45,17 @@ #include "ipoib_xfr_mgr.h" #include "ipoib_endpoint.h" + /* * Define to place receive buffer inline in receive descriptor. */ #define IPOIB_INLINE_RECV 0 +/* + * Invalid pkey index + */ +#define PKEY_INVALID_INDEX 0xFFFF + /* * Define to control how transfers are done. When defined as 1, causes * packets to be sent using NDIS DMA facilities (getting the SGL from the @@ -331,6 +337,7 @@ typedef struct _ipoib_recv_desc ib_recv_wr_t wr; ipoib_endpt_t* p_endpt; ib_local_ds_t local_ds[2]; + NDIS_TCP_IP_CHECKSUM_PACKET_INFO ndis_csum; #if IPOIB_INLINE_RECV recv_buf_t buf; #else @@ -521,6 +528,8 @@ typedef struct _ipoib_port atomic32_t hdr_idx; uint16_t pkey_index; + KDPC gc_dpc; + KTIMER gc_timer; ipoib_hdr_t hdr[1]; /* Must be last! */ } ipoib_port_t; diff --git a/trunk/ulp/ipoib/kernel/ipoib_driver.h b/trunk/ulp/ipoib/kernel/ipoib_driver.h index bb912940..0660f593 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_driver.h +++ b/trunk/ulp/ipoib/kernel/ipoib_driver.h @@ -47,8 +47,8 @@ */ #define MAX_BUNDLE_ID_LENGTH 32 - -#define IB_MTU 2048 +/* MLX4 supports 4K MTU */ +#define IB_MTU 4096 /* * Header length as defined by IPoIB spec: * http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-04.txt diff --git a/trunk/ulp/ipoib/kernel/ipoib_xfr_mgr.h b/trunk/ulp/ipoib/kernel/ipoib_xfr_mgr.h index f53e3453..e4775814 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_xfr_mgr.h +++ b/trunk/ulp/ipoib/kernel/ipoib_xfr_mgr.h @@ -219,19 +219,22 @@ ipoib_mac_from_mlx_guid( { const uint8_t *p_guid = (const uint8_t*)&port_guid; uint32_t low24; + net16_t guid_middle; /* Port guid is in network byte order. OUI is in lower 3 bytes. */ ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x02 && p_guid[2] == 0xc9 ); - if( (port_guid & CL_HTON64( 0x000000ffff000000 )) != - CL_HTON64(0x0000000200000000)) - { + guid_middle = (net16_t)((port_guid & CL_HTON64( 0x000000ffff000000 )) >>24); + + if (guid_middle == 2) { + p_mac_addr->addr[0] = 0; + } else if (guid_middle == 3) { + p_mac_addr->addr[0] = 2; + } else { return IB_INVALID_GUID; } - low24 = ((uint32_t)cl_ntoh64( port_guid ) & 0x00FFFFFF); - p_mac_addr->addr[0] = p_guid[0]; p_mac_addr->addr[1] = p_guid[1]; p_mac_addr->addr[2] = p_guid[2]; p_mac_addr->addr[3] = (uint8_t)(low24 >> 16); -- 2.46.0