From: tzachid Date: Mon, 21 Nov 2005 12:02:13 +0000 (+0000) Subject: Connect parameters are being passed to the kernel code. (Rev 71) X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=5810d09e4c39a46c5f2b450c24c46b8a081980f0;p=~shefty%2Frdma-win.git Connect parameters are being passed to the kernel code. (Rev 71) git-svn-id: svn://openib.tc.cornell.edu/gen1@160 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/ulp/sdp/include/SdpShared.h b/trunk/ulp/sdp/include/SdpShared.h index f470f36c..577c4f2b 100644 --- a/trunk/ulp/sdp/include/SdpShared.h +++ b/trunk/ulp/sdp/include/SdpShared.h @@ -12,6 +12,7 @@ // Define the IOCTL codes that will be used for sending the requests down #define IOCTL_WSP_SOCKET CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED ,FILE_ANY_ACCESS) +#define IOCTL_WSP_CONNECT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED ,FILE_ANY_ACCESS) // Data structures that are used for connect struct WspSocketIn { @@ -24,13 +25,13 @@ struct WspSocketOut { }; struct WspConnectIn { + VOID *pSocket; ULONG IP; USHORT Port; - int namelen; }; struct WspConnectOut { int Errno; }; -#endif //_SDP_SHARED_H \ No newline at end of file +#endif //_SDP_SHARED_H diff --git a/trunk/ulp/sdp/kernel/SdpDriver.cpp b/trunk/ulp/sdp/kernel/SdpDriver.cpp index a7d1d0f9..3af15f2b 100644 --- a/trunk/ulp/sdp/kernel/SdpDriver.cpp +++ b/trunk/ulp/sdp/kernel/SdpDriver.cpp @@ -302,6 +302,9 @@ NTSTATUS SdpDriver::DispatchDeviceIoControl( NTSTATUS rc = STATUS_SUCCESS; SdpUserFile *pSdpUserFile = NULL; SdpSocket *pSdpSocket = NULL; + + WspConnectIn *pWspConnectIn = NULL; + WspConnectOut *pWspConnectOut = NULL; switch (IoControlCode) { case IOCTL_WSP_SOCKET : @@ -324,8 +327,35 @@ NTSTATUS SdpDriver::DispatchDeviceIoControl( SDP_PRINT(SDP_ERR, SDP_DRIVER, ("pSdpUserFile->AddSocket failed rc = 0x%x\n", rc )); goto Cleanup; } + OutputDataSize = sizeof (WspSocketOut); break; + + case IOCTL_WSP_CONNECT : + SDP_PRINT(SDP_DEBUG, SDP_DRIVER, ("DispatchDeviceIoControl IOCTL_WSP_CONNECT recieved\n" )); + VERIFY_BUFFERS(InputBufferLength, OutputBufferLength, WspConnectIn, WspConnectOut); + OutputDataSize = sizeof (WspConnectOut); + + // get the socket based on the users pointer + pWspConnectIn = (WspConnectIn *) pInputBuffer; + pWspConnectOut = (WspConnectOut *) pOutputBuffer; + pSdpUserFile = (SdpUserFile *)pIrpSp->FileObject->FsContext; + pSdpSocket = pSdpUserFile->SocketByPointer(pWspConnectIn->pSocket); + if (pSdpSocket == NULL) { + SDP_PRINT(SDP_DEBUG, SDP_DRIVER, ("DispatchDeviceIoControl IOCTL_WSP_CONNECT socket %x not found\n",pWspConnectIn->pSocket)); + // This is a well defined winsock error + pWspConnectOut->Errno = WSAENOTSOCK; + goto Cleanup; + } + rc = pSdpSocket->WSPConnect(pWspConnectIn, pWspConnectOut); + if (!NT_SUCCESS(rc)) { + SDP_PRINT(SDP_ERR, SDP_DRIVER, ("pSdpSocket->WSPConnect failed rc = 0x%x\n", rc )); + goto Cleanup; + } + + + + break; default: // This is an unrecgnized IOCTL diff --git a/trunk/ulp/sdp/kernel/SdpGenUtils.cpp b/trunk/ulp/sdp/kernel/SdpGenUtils.cpp index 1c7e08ef..67cc886f 100644 --- a/trunk/ulp/sdp/kernel/SdpGenUtils.cpp +++ b/trunk/ulp/sdp/kernel/SdpGenUtils.cpp @@ -3,6 +3,12 @@ #include "Precompile.h" +USHORT nthos(USHORT in) +{ + return ((in & 0xff) << 8) | ((in & 0xff00) >> 8); +} + + void* __cdecl operator new(size_t n ) throw() { return ExAllocatePoolWithTag(NonPagedPool , n, GLOBAL_ALLOCATION_TAG); diff --git a/trunk/ulp/sdp/kernel/SdpGenUtils.h b/trunk/ulp/sdp/kernel/SdpGenUtils.h index 6ca20127..8e9bd9e5 100644 --- a/trunk/ulp/sdp/kernel/SdpGenUtils.h +++ b/trunk/ulp/sdp/kernel/SdpGenUtils.h @@ -39,4 +39,72 @@ public: }; + +USHORT nthos(USHORT in); + + +// This error codes are taken from winsock2.h (the file can not) +// be included from user mode + +/* + * All Windows Sockets error constants are biased by WSABASEERR from + * the "normal" + */ +#define WSABASEERR 10000 + +/* + * Windows Sockets definitions of regular Microsoft C error constants + */ +#define WSAEINTR (WSABASEERR+4) +#define WSAEBADF (WSABASEERR+9) +#define WSAEACCES (WSABASEERR+13) +#define WSAEFAULT (WSABASEERR+14) +#define WSAEINVAL (WSABASEERR+22) +#define WSAEMFILE (WSABASEERR+24) + +/* + * Windows Sockets definitions of regular Berkeley error constants + */ +#define WSAEWOULDBLOCK (WSABASEERR+35) +#define WSAEINPROGRESS (WSABASEERR+36) +#define WSAEALREADY (WSABASEERR+37) +#define WSAENOTSOCK (WSABASEERR+38) +#define WSAEDESTADDRREQ (WSABASEERR+39) +#define WSAEMSGSIZE (WSABASEERR+40) +#define WSAEPROTOTYPE (WSABASEERR+41) +#define WSAENOPROTOOPT (WSABASEERR+42) +#define WSAEPROTONOSUPPORT (WSABASEERR+43) +#define WSAESOCKTNOSUPPORT (WSABASEERR+44) +#define WSAEOPNOTSUPP (WSABASEERR+45) +#define WSAEPFNOSUPPORT (WSABASEERR+46) +#define WSAEAFNOSUPPORT (WSABASEERR+47) +#define WSAEADDRINUSE (WSABASEERR+48) +#define WSAEADDRNOTAVAIL (WSABASEERR+49) +#define WSAENETDOWN (WSABASEERR+50) +#define WSAENETUNREACH (WSABASEERR+51) +#define WSAENETRESET (WSABASEERR+52) +#define WSAECONNABORTED (WSABASEERR+53) +#define WSAECONNRESET (WSABASEERR+54) +#define WSAENOBUFS (WSABASEERR+55) +#define WSAEISCONN (WSABASEERR+56) +#define WSAENOTCONN (WSABASEERR+57) +#define WSAESHUTDOWN (WSABASEERR+58) +#define WSAETOOMANYREFS (WSABASEERR+59) +#define WSAETIMEDOUT (WSABASEERR+60) +#define WSAECONNREFUSED (WSABASEERR+61) +#define WSAELOOP (WSABASEERR+62) +#define WSAENAMETOOLONG (WSABASEERR+63) +#define WSAEHOSTDOWN (WSABASEERR+64) +#define WSAEHOSTUNREACH (WSABASEERR+65) +#define WSAENOTEMPTY (WSABASEERR+66) +#define WSAEPROCLIM (WSABASEERR+67) +#define WSAEUSERS (WSABASEERR+68) +#define WSAEDQUOT (WSABASEERR+69) +#define WSAESTALE (WSABASEERR+70) +#define WSAEREMOTE (WSABASEERR+71) + + + + + #endif // _SDP_GEN_UTILS_H diff --git a/trunk/ulp/sdp/kernel/SdpSocket.cpp b/trunk/ulp/sdp/kernel/SdpSocket.cpp index 3b9aeb76..ca54437b 100644 --- a/trunk/ulp/sdp/kernel/SdpSocket.cpp +++ b/trunk/ulp/sdp/kernel/SdpSocket.cpp @@ -16,6 +16,34 @@ NTSTATUS SdpSocket::Init( return STATUS_SUCCESS; } +NTSTATUS SdpSocket::WSPConnect( + WspConnectIn *pWspConnectIn, + WspConnectOut *pWspConnectOut + ) +{ + NTSTATUS rc = STATUS_SUCCESS; + SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("SdpSocket::WSPConnect this = 0x%x remote addresses ip=%d.%d.%d.%d:%d", + this, + (pWspConnectIn->IP & 0XFF), + (pWspConnectIn->IP & 0XFF00) >> 8, + (pWspConnectIn->IP & 0XFF0000) >> 16, + (pWspConnectIn->IP & 0XFF000000) >> 24, + nthos(pWspConnectIn->Port) + )); + + if((pWspConnectIn->IP == 0) || (pWspConnectIn->Port == 0)) { + SDP_PRINT(SDP_ERR, SDP_SOCKET, ("Invalid Addresses")); + pWspConnectOut->Errno = WSAEADDRNOTAVAIL; + goto Cleanup; + } + +Cleanup: + return rc; + +} + + + VOID SdpSocket::Shutdown() { SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("SdpSocket::Shutdown called this = 0x%x\n", this)); diff --git a/trunk/ulp/sdp/kernel/SdpSocket.h b/trunk/ulp/sdp/kernel/SdpSocket.h index 876b1070..9dc1479f 100644 --- a/trunk/ulp/sdp/kernel/SdpSocket.h +++ b/trunk/ulp/sdp/kernel/SdpSocket.h @@ -21,8 +21,14 @@ private: public: NTSTATUS Init( - WspSocketIn *pSocketInParam, - WspSocketOut *pSocketOutParam); + WspSocketIn *pSocketInParam, + WspSocketOut *pSocketOutParam + ); + + NTSTATUS WSPConnect( + WspConnectIn *pWspConnectIn, + WspConnectOut *pWspConnectOut + ); VOID Shutdown(); diff --git a/trunk/ulp/sdp/kernel/SdpUserFile.cpp b/trunk/ulp/sdp/kernel/SdpUserFile.cpp index ebe0b71b..3442dd4c 100644 --- a/trunk/ulp/sdp/kernel/SdpUserFile.cpp +++ b/trunk/ulp/sdp/kernel/SdpUserFile.cpp @@ -53,4 +53,32 @@ NTSTATUS SdpUserFile::AddSocket(SdpSocket *pSdpSocket) } +SdpSocket *SdpUserFile::SocketByPointer(VOID *Socket) +{ + SdpSocket *pSdpSocket = NULL; + PLIST_ENTRY pNext; + CSpinLockWrapper Lock(m_Lock); + Lock.Lock(); + if (m_shutdown) { + Lock.Unlock(); + return NULL; + } + + pNext = m_SocketsList.Flink; + while (pNext != &m_SocketsList) { + pSdpSocket = CONTAINING_RECORD(pNext, SdpSocket, m_UserFileList ); + if (pSdpSocket == Socket) { + // We have found the socket that we are looking for + break; + } + pNext = pNext->Flink; + } + if (pSdpSocket) { + pSdpSocket->AddRef(); + } + + Lock.Unlock(); + return pSdpSocket; +} + diff --git a/trunk/ulp/sdp/kernel/SdpUserFile.h b/trunk/ulp/sdp/kernel/SdpUserFile.h index 92ded631..67ab18bf 100644 --- a/trunk/ulp/sdp/kernel/SdpUserFile.h +++ b/trunk/ulp/sdp/kernel/SdpUserFile.h @@ -25,6 +25,9 @@ public: NTSTATUS Init(); VOID Shutdown(); + + SdpSocket *SocketByPointer(VOID *Socket); + NTSTATUS AddSocket(SdpSocket *pSdpSocket);