}\r
rc = pSdpSocket->WSPListen(&wspListenIn, pWspListenOut);\r
if (!NT_SUCCESS(rc)) {\r
- SDP_PRINT(SDP_ERR, SDP_DRIVER, ("pSdpSocket->WSPRecv failed rc = 0x%x\n", rc )); \r
+ SDP_PRINT(SDP_ERR, SDP_DRIVER, ("pSdpSocket->WSPListen failed rc = 0x%x\n", rc )); \r
goto Cleanup;\r
}\r
}\r
}\r
break;\r
\r
+ case IOCTL_WSP_GET_XXX_NAME:\r
+ {\r
+ SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("IOCTL_WSP_GET_XXX_NAME recieved\n" )); \r
+ VERIFY_BUFFERS(InputBufferLength, OutputBufferLength, WspGetSockXXIn, WspGetSockXXOut);\r
+ OutputDataSize = sizeof (WspGetSockXXOut);\r
+\r
+ // get the socket based on the users pointer\r
+ WspGetSockXXIn wspGetSockXXin = *(WspGetSockXXIn *) pInputBuffer;\r
+ WspGetSockXXOut *pWspGetSockXXOut = (WspGetSockXXOut *) pOutputBuffer;\r
+ pSdpUserFile = (SdpUserFile *)pIrpSp->FileObject->FsContext;\r
+ pSdpSocket = pSdpUserFile->SocketByPointer(wspGetSockXXin.pSocket);\r
+ if (pSdpSocket == NULL) {\r
+ SDP_PRINT(SDP_DEBUG, SDP_DRIVER, ("IOCTL_WSP_GET_XXX_NAME socket %x not found\n", wspGetSockXXin.pSocket)); \r
+ // This is a well defined winsock error\r
+ pWspGetSockXXOut->Errno = WSAENOTSOCK;\r
+ goto Cleanup;\r
+ }\r
+ rc = pSdpSocket->WSPGetXXXName(&wspGetSockXXin, pWspGetSockXXOut);\r
+ if (!NT_SUCCESS(rc)) {\r
+ SDP_PRINT(SDP_ERR, SDP_DRIVER, ("pSdpSocket->WSPGetXXXName failed rc = 0x%x\n", rc )); \r
+ goto Cleanup;\r
+ }\r
+ }\r
+ break;\r
+ \r
+\r
case IOCTL_WSP_CLOSE_SOCKET :\r
{\r
SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("IOCTL_WSP_CLOSE_SOCKET recieved\n" )); \r
NTSTATUS rc = STATUS_SUCCESS;\r
\r
for (int i=0;i < MAX_RECV_PACKETS; i++) {\r
- rc = BufferDescriptor::AllocateBuffer(&pBufferDescriptor, m_MaxMessageSize, SEND_BUFFERS_ALLOCATION_TAG);\r
- ASSERT(NT_SUCCESS(rc));\r
+ rc = BufferDescriptor::AllocateBuffer(&pBufferDescriptor, m_MaxMessageSize, RECV_BUFFERS_ALLOCATION_TAG);\r
+ if (!NT_SUCCESS(rc)) {\r
+ SDP_PRINT(SDP_ERR, SDP_BUFFER_POOL, ("BufferDescriptor::AllocateBuffer failed rc=0x%x \n", rc));\r
+ goto Cleanup;\r
+ }\r
+\r
m_CurrentlyAllocated++;\r
\r
pBufferDescriptor->Reset();\r
m_FreePackets.InsertTailList(&pBufferDescriptor->BuffersList);\r
}\r
- \r
- return STATUS_SUCCESS;\r
+Cleanup:\r
+ if (!NT_SUCCESS(rc)) {\r
+ LIST_ENTRY *item = NULL;\r
+ while (m_FreePackets.Size() > 0 ) {\r
+ item = m_FreePackets.RemoveHeadList();\r
+ pBufferDescriptor = CONTAINING_RECORD(item, BufferDescriptor , BuffersList);\r
+ BufferDescriptor::DeAllocateBuffer(pBufferDescriptor, RECV_BUFFERS_ALLOCATION_TAG);\r
+ }\r
+\r
+ }\r
+ \r
+ return rc;\r
}\r
\r
/*\r
pBufferDescriptor = CONTAINING_RECORD(item, BufferDescriptor , BuffersList); \r
} else if (m_CurrentlyAllocated < m_MaxBuffers) {\r
// We can allocate more buffers\r
- rc = BufferDescriptor::AllocateBuffer(&pBufferDescriptor, m_MaxMessageSize, SEND_BUFFERS_ALLOCATION_TAG);\r
+ rc = BufferDescriptor::AllocateBuffer(&pBufferDescriptor, m_MaxMessageSize, RECV_BUFFERS_ALLOCATION_TAG);\r
if (!NT_SUCCESS(rc)) {\r
SDP_PRINT(SDP_ERR, SDP_BUFFER_POOL, ("AllocateBuffer failed rc = 0x%x\n", rc ));\r
goto Cleanup;\r
while (m_FreePackets.Size() > 0 ) {\r
item = m_FreePackets.RemoveHeadList();\r
pBufferDescriptor = CONTAINING_RECORD(item, BufferDescriptor , BuffersList);\r
- BufferDescriptor::DeAllocateBuffer(pBufferDescriptor, SEND_BUFFERS_ALLOCATION_TAG);\r
+ BufferDescriptor::DeAllocateBuffer(pBufferDescriptor, RECV_BUFFERS_ALLOCATION_TAG);\r
}\r
\r
while (m_FullPackets.Size() > 0 ) {\r
item = m_FullPackets.RemoveHeadList();\r
pBufferDescriptor = CONTAINING_RECORD(item, BufferDescriptor , BuffersList);\r
- BufferDescriptor::DeAllocateBuffer(pBufferDescriptor, SEND_BUFFERS_ALLOCATION_TAG);\r
+ BufferDescriptor::DeAllocateBuffer(pBufferDescriptor, RECV_BUFFERS_ALLOCATION_TAG);\r
}\r
}\r
\r
} else {\r
// Make sure that we have the error setted\r
ASSERT(pWspSendOut->Errno != 0); // BUGBUG: Need to make sure that this\r
+ SDP_PRINT(SDP_WARN, SDP_SOCKET, ("this = 0x%p rc = 0x%x\n",this, rc));\r
// is indeed the case.\r
}\r
return rc;\r
return rc;\r
}\r
\r
+NTSTATUS \r
+SdpSocket::WSPGetXXXName(\r
+ WspGetSockXXIn *pWspGetSockXXIn,\r
+ WspGetSockXXOut *pWspGetSockXXOut\r
+ )\r
+{\r
+ NTSTATUS rc = STATUS_SUCCESS;\r
+ ib_api_status_t ib_status;\r
+\r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("this = 0x%p \n",this));\r
+ rc = m_Lock.LockRc();\r
+ if (!NT_SUCCESS(rc)) { \r
+ SDP_PRINT(SDP_ERR, SDP_SOCKET, ("Failed to lock this = 0x%p \n",this));\r
+ pWspGetSockXXOut->Errno = WSAENETDOWN;\r
+ goto Cleanup;\r
+ }\r
+ pWspGetSockXXOut->Errno = 0;\r
+ if(pWspGetSockXXIn->LocaleAddress) {\r
+ // This is the WSPGetSockName\r
+ pWspGetSockXXOut->IP = m_SrcIp;\r
+ pWspGetSockXXOut->Port = m_SrcPort; \r
+ } else {\r
+ // This is the WSPGetPeerName\r
+ pWspGetSockXXOut->IP = m_DstIp;\r
+ pWspGetSockXXOut->Port = m_DstPort; \r
+ }\r
+ rc = m_Lock.Unlock();\r
+ if (!NT_SUCCESS(rc)) {\r
+ SDP_PRINT(SDP_ERR, SDP_SOCKET, ("m_Lock.Unlock() failed rc = 0x%x\n", rc ));\r
+ pWspGetSockXXOut->Errno = WSAENETDOWN; \r
+ goto Cleanup;\r
+ }\r
+ \r
+Cleanup: \r
+ if (NT_SUCCESS(rc) ) {\r
+ pWspGetSockXXOut->Errno = 0;\r
+ } else {\r
+ // Make sure that we have the error setted\r
+ ASSERT(pWspGetSockXXOut->Errno != 0);\r
+ // is indeed the case.\r
+ }\r
+ return rc;\r
+\r
+\r
+}\r
+\r
+\r
+\r
/*\r
CloseSocket is probably one of the most complicated winsock APIs.\r
Our current implmentation will be the default implmentation always. \r
\r
// We now start the recieve processing\r
\r
- rc = m_Lock.Lock(); //??????????\r
+ rc = m_Lock.LockRc();\r
if (!NT_SUCCESS(rc)) {\r
SDP_PRINT(SDP_ERR, SDP_SOCKET, ("m_Lock.Lock failed rc = 0x%x\n", rc ));\r
goto Cleanup;\r
SdpSocket::CmReqCallback(IN ib_cm_req_rec_t *p_cm_req_rec)\r
{\r
SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("this = 0x%p\n", this));\r
+\r
NTSTATUS rc = STATUS_SUCCESS;\r
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);\r
net64_t SrcCaGuid;\r
}\r
\r
// Take the lock and verify the state\r
- rc = m_Lock.Lock(); //???????\r
+ rc = m_Lock.LockRc();\r
if (!NT_SUCCESS(rc)) {\r
SDP_PRINT(SDP_ERR, SDP_SOCKET, ("m_Lock.Lock failed rc = 0x%x\n", rc ));\r
goto Cleanup;\r
// Create a new socket for this request\r
pNewSocket = new SdpSocket;\r
if (pNewSocket == NULL) {\r
- SDP_PRINT(SDP_ERR, SDP_SOCKET, ("pNewSocket failed\n")); \r
+ SDP_PRINT(SDP_ERR, SDP_SOCKET, ("new pNewSocket failed\n")); \r
goto ErrorLocked;\r
}\r
\r
goto ErrorLocked;\r
}\r
\r
- rc = pNewSocket->m_Lock.Lock(); //????????\r
+ rc = pNewSocket->m_Lock.LockRc();\r
if (!NT_SUCCESS(rc)) {\r
SDP_PRINT(SDP_ERR, SDP_SOCKET, ("pNewSocket.Init() failed rc = 0x%x\n", rc ));\r
goto ErrorLocked;\r
} \r
\r
Cleanup:\r
+ if (!NT_SUCCESS(rc)) {\r
+ // BUGBUG: We need to send a rej here\r
+ }\r
if (pNewSocket != NULL) {\r
pNewSocket->Release();\r
- }\r
+ } \r
return;\r
\r
ErrorLocked:\r
\r
\r
// Take the lock and verify the state\r
- rc = m_Lock.Lock(); //?????\r
+ rc = m_Lock.LockRc();\r
if (!NT_SUCCESS(rc)) {\r
SDP_PRINT(SDP_ERR, SDP_SOCKET, ("m_Lock.Lock failed rc = 0x%x\n", rc ));\r
goto Cleanup;\r
}\r
\r
// Next step is to move the new socket to the SS_CONNECTED state\r
- rc = pSocket->m_Lock.Lock(); //???????\r
+ rc = pSocket->m_Lock.LockRc();\r
if (!NT_SUCCESS(rc)) {\r
SDP_PRINT(SDP_ERR, SDP_SOCKET, ("m_Lock.Lock failed rc = 0x%x\n", rc ));\r
goto ErrorLocked;\r
IN const ib_cq_handle_t h_cq,\r
IN void *cq_context )\r
{\r
+ SDP_PRINT(SDP_ALL, SDP_SOCKET, ("__recv_cb1\n"));\r
+\r
SdpSocket *pSocket = (SdpSocket *) cq_context;\r
pSocket->m_Lock.SignalCB(RECV_CB_CALLED);\r
}\r
ASSERT (ib_status == IB_SUCCESS);\r
ib_wc_t *p_wc;\r
for( p_wc = p_wc1; p_wc; p_wc = p_wc->p_next ) {\r
- ASSERT( p_wc->status == IB_WCS_SUCCESS || p_wc->status == IB_WCS_WR_FLUSHED_ERR);\r
+ ASSERT( p_wc->status == IB_WCS_SUCCESS || p_wc->status == IB_WCS_WR_FLUSHED_ERR); // BUGBUG: Can there be other errors here ???\r
if (p_wc->status == IB_WCS_WR_FLUSHED_ERR) {\r
// We have an error, but we still need to return the packet to the caller\r
pBufferDescriptor = (BufferDescriptor *)p_wc->wr_id;\r
- SDP_PRINT(SDP_ERR, SDP_SOCKET, ("p_wc->status == IB_WCS_WR_FLUSHED_ERR \n" ));\r
+ SDP_PRINT(SDP_DEBUG, SDP_SOCKET, ("p_wc->status == IB_WCS_WR_FLUSHED_ERR \n" ));\r
// we can not handle it, but we can and should return it to the pool of recieved buffers\r
rc1 = m_RecvBufferPool.RecievedBuffer(pBufferDescriptor, true);\r
ASSERT(rc1 == STATUS_SUCCESS); // return with error can not fail\r
SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("called this = 0x%p\n", this)); \r
NTSTATUS rc = STATUS_SUCCESS;\r
ib_api_status_t ib_status;\r
+ ib_qp_mod_t qp_mod;\r
\r
\r
if (m_ShutdownCalled) {\r
}\r
\r
m_ConnectionList.Shutdown();\r
+\r
\r
- SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("111111\n", this)); \r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("111111\n", this));\r
\r
if (m_qp != NULL) {\r
+\r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("222222\n", this));\r
+\r
+ cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
+ qp_mod.req_state = IB_QPS_ERROR;\r
+ ib_status = ib_modify_qp( m_qp, &qp_mod );\r
+ if( ib_status != IB_SUCCESS ) {\r
+ SDP_PRINT(SDP_ERR, SDP_SOCKET, ("ib_modify_qp failed ib_status = 0x%d\n", ib_status ));\r
+ ASSERT(FALSE);\r
+ // We are probably going to leak, but we have to continue\r
+ }\r
+ \r
ib_status = ib_destroy_qp(m_qp, ShutdownCB);\r
//m_qp = NULL;\r
if(ib_status == IB_SUCCESS) {\r
}\r
}\r
\r
- SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("22222\n", this)); \r
-\r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("333333\n", this));\r
+ \r
if (m_scq != NULL) {\r
ib_status = ib_destroy_cq(m_scq, ShutdownCB);\r
//???ASSERT(ib_status == IB_SUCCESS);\r
}\r
//?????m_scq = NULL;\r
}\r
- SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("33333\n", this)); \r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("444444\n", this)); \r
\r
if (m_rcq != NULL) {\r
ib_status = ib_destroy_cq(m_rcq, ShutdownCB); \r
//??????m_rcq = NULL;\r
\r
}\r
- SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("44444\n", this)); \r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("555555\n", this)); \r
if (m_pd != NULL) {\r
ib_status = ib_dealloc_pd(m_pd, ShutdownCB); \r
//???ASSERT(ib_status == IB_SUCCESS);\r
//?????m_pd = NULL;\r
\r
}\r
- SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("55555\n", this)); \r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("666666\n", this)); \r
\r
if (mh_Ca != NULL) {\r
ib_status = ib_close_ca(mh_Ca, ShutdownCB); \r