NDFLTR: Add support for cancelling path queries when EP is destroyed, refine state transitions, don't NULL deref.
Signed-off-by: Fab Tillier <[email protected]> diff -dwup3 -X excl.txt -I ^ \*$ -I ^ \* \$ -r \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_ep.cpp .\core\ndfltr\kernel\nd_ep.cpp --- \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_ep.cpp Thu Sep 20 17:51:02 2012 +++ .\core\ndfltr\kernel\nd_ep.cpp Thu Oct 04 16:33:02 2012 @@ -67,6 +67,7 @@ ND_ENDPOINT::ND_ENDPOINT(ND_ADAPTER* pAd { m_pWork = reinterpret_cast<PIO_WORKITEM>(this + 1); IoInitializeWorkItem(WdfDeviceWdmGetDeviceObject(pAdapter->GetDevice()->WdfDev), m_pWork); + RtlZeroMemory(&m_DestinationHwAddress, sizeof(m_DestinationHwAddress)); RtlZeroMemory(&m_ReadLimits, sizeof(m_ReadLimits)); pAdapter->AddEp(&m_Entry); } @@ -75,11 +76,26 @@ ND_ENDPOINT::ND_ENDPOINT(ND_ADAPTER* pAd ND_ENDPOINT::~ND_ENDPOINT() { WdfObjectAcquireLock(m_Queue); + STATE prevState = m_State; m_State = NdEpDestroying; WdfObjectReleaseLock(m_Queue); UnbindQp(true, NULL, 0); + if( prevState == NdEpResolving ) { + NTSTATUS status = m_pParent->GetProvider()->GetPartition()->CancelQuery( + m_LocalAddress, + m_PeerAddress, + m_DestinationHwAddress, + ND_ENDPOINT::QueryPathHandler, + this + ); + if( status == STATUS_SUCCESS ) + { + Dereference(); + } + } + _Base::RunDown(); if (m_hIfc != NULL) { @@ -602,13 +618,14 @@ ND_ENDPOINT::Connect( } else { m_PeerAddress = DestinationAddress; } + m_DestinationHwAddress = DestinationHwAddress; WdfObjectReleaseLock(m_Queue); Reference(); status = m_pParent->GetProvider()->GetPartition()->QueryPath( m_LocalAddress, m_PeerAddress, - DestinationHwAddress, + m_DestinationHwAddress, ND_ENDPOINT::QueryPathHandler, this, &m_Route @@ -1671,18 +1688,21 @@ NTSTATUS ND_ENDPOINT::GetPeerAddress(__o NTSTATUS status; WdfObjectAcquireLock(m_Queue); switch (m_State) { - case NdEpDisconnected: + case NdEpIdle: + case NdEpQueued: + case NdEpAddressBound: status = STATUS_CONNECTION_INVALID; break; - case NdEpReqReceived: - case NdEpRepReceived: - *pAddress = m_PeerAddress; - status = STATUS_SUCCESS; + case NdEpListening: + case NdEpDestroying: + status = STATUS_INVALID_DEVICE_STATE; break; default: - status = STATUS_INVALID_DEVICE_STATE; + *pAddress = m_PeerAddress; + status = STATUS_SUCCESS; + break; } WdfObjectReleaseLock(m_Queue); return status; @@ -1750,22 +1770,13 @@ NTSTATUS ND_ENDPOINT::GetAddress(__out S status = STATUS_ADDRESS_NOT_ASSOCIATED; break; - case NdEpAddressBound: - case NdEpListening: - case NdEpReqReceived: - case NdEpResolving: - case NdEpReqSent: - case NdEpRepReceived: + case NdEpDestroying: + status = STATUS_INVALID_DEVICE_STATE; + + default: *pAddress = m_LocalAddress; status = STATUS_SUCCESS; break; - - case NdEpDisconnected: - status = STATUS_CONNECTION_INVALID; - break; - - default: - status = STATUS_INVALID_DEVICE_STATE; } WdfObjectReleaseLock(m_Queue); return status; diff -dwup3 -X excl.txt -I ^ \*$ -I ^ \* \$ -r \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_ep.h .\core\ndfltr\kernel\nd_ep.h --- \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_ep.h Thu Sep 20 17:51:02 2012 +++ .\core\ndfltr\kernel\nd_ep.h Tue Oct 02 12:20:22 2012 @@ -133,6 +133,9 @@ private: ULONG m_StartingPsn; ND_READ_LIMITS m_ReadLimits; + + IF_PHYSICAL_ADDRESS m_DestinationHwAddress; + UINT8 m_PrivateDataLength; BYTE m_PrivateData[IB_REJ_PDATA_SIZE]; diff -dwup3 -X excl.txt -I ^ \*$ -I ^ \* \$ -r \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_partition.cpp .\core\ndfltr\kernel\nd_partition.cpp --- \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_partition.cpp Thu Sep 20 17:51:02 2012 +++ .\core\ndfltr\kernel\nd_partition.cpp Tue Oct 02 12:20:19 2012 @@ -381,6 +381,50 @@ ND_PARTITION::QueryPath( } +NTSTATUS +ND_PARTITION::CancelQuery( + __in const SOCKADDR_INET& LocalAddress, + __in const SOCKADDR_INET& RemoteAddress, + __in const IF_PHYSICAL_ADDRESS& RemoteHwAddress, + __in FN_IBAT_QUERY_PATH_CALLBACK* CompletionCallback, + __in VOID* CompletionContext + ) +{ + if (m_AdapterId == 0) { + return IbatInterface.CancelQueryByIpAddress( + &LocalAddress, + &RemoteAddress, + CompletionCallback, + CompletionContext + ); + } + + UINT64 remoteMac = HwAddressToMac(RemoteHwAddress); + if (remoteMac == 0) { + return STATUS_INVALID_PARAMETER; + } + + NTSTATUS status = STATUS_INVALID_ADDRESS; + LockShared(); + for(ADDRESS_ENTRY* entry = static_cast<ADDRESS_ENTRY*>(m_AddrList.Flink); + entry != &m_AddrList; + entry = static_cast<ADDRESS_ENTRY*>(entry->Flink)) + { + if (IsEqual(entry->Addr, LocalAddress) == true) { + status = IbatInterface.CancelQueryByPhysicalAddress( + entry->Mac, + remoteMac, + CompletionCallback, + CompletionContext + ); + break; + } + } + Unlock(); + return status; +} + + //static void ND_PARTITION::ResolveAdapterId( diff -dwup3 -X excl.txt -I ^ \*$ -I ^ \* \$ -r \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_partition.h .\core\ndfltr\kernel\nd_partition.h --- \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_partition.h Thu Sep 20 17:51:02 2012 +++ .\core\ndfltr\kernel\nd_partition.h Tue Oct 02 12:19:21 2012 @@ -123,6 +123,15 @@ public: __out ib_path_rec_t* pPath ); + NTSTATUS + CancelQuery( + __in const SOCKADDR_INET& pLocalAddress, + __in const SOCKADDR_INET& pRemoteAddress, + __in const IF_PHYSICAL_ADDRESS& RemoteHwAddress, + __in FN_IBAT_QUERY_PATH_CALLBACK* CompletionCallback, + __in VOID* CompletionContext + ); + public: static FN_REQUEST_HANDLER ResolveAdapterId; static FN_REQUEST_HANDLER Free; diff -dwup3 -X excl.txt -I ^ \*$ -I ^ \* \$ -r \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_provider.h .\core\ndfltr\kernel\nd_provider.h --- \dev\openib\Mellanox\11011\core\ndfltr\kernel\nd_provider.h Thu Sep 20 17:51:02 2012 +++ .\core\ndfltr\kernel\nd_provider.h Sat Sep 15 14:47:59 2012 @@ -145,7 +145,7 @@ public: static __inline UINT64 HandleFromFile(WDFFILEOBJECT File) { DEVICE_OBJECT* pDevObj = IoGetRelatedDeviceObject(WdfFileObjectWdmGetFileObject(File)); - if (pDevObj != WdfDeviceWdmGetDeviceObject(ControlDevice)) { + if (ControlDevice == NULL || pDevObj != WdfDeviceWdmGetDeviceObject(ControlDevice)) { return 0; } return reinterpret_cast<ULONG_PTR>(WdfFileObjectWdmGetFileObject(File)->FsContext);
ndv2.61.patch
Description: ndv2.61.patch
_______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
