[haiku-commits] BRANCH pdziepak-github.nfs4 - src/add-ons/kernel/file_systems/nfs4

  • From: pdziepak-github.nfs4 <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 5 Aug 2012 04:49:11 +0200 (CEST)

added 2 changesets to branch 'refs/remotes/pdziepak-github/nfs4'
old head: 94c47dc6a85fa8c028382eb3b54e04f40d08590c
new head: feb15cc63ce6f32dc73e8322c165266d4a11b149

----------------------------------------------------------------------------

8019eaf: nfs4: Several minor fixes

feb15cc: nfs4: Reply to incorrect and CB_NULL callback requests

                                    [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ]

----------------------------------------------------------------------------

12 files changed, 207 insertions(+), 63 deletions(-)
.../kernel/file_systems/nfs4/Connection.cpp        |    6 +-
src/add-ons/kernel/file_systems/nfs4/Jamfile       |    1 +
src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp   |    2 +
src/add-ons/kernel/file_systems/nfs4/RPCAuth.h     |    5 --
src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp   |   14 +---
.../kernel/file_systems/nfs4/RPCCallbackReply.cpp  |   49 +++++++++++++
.../kernel/file_systems/nfs4/RPCCallbackReply.h    |   42 +++++++++++
.../file_systems/nfs4/RPCCallbackRequest.cpp       |   31 ++++----
.../kernel/file_systems/nfs4/RPCCallbackRequest.h  |   11 +++
.../kernel/file_systems/nfs4/RPCCallbackServer.cpp |   23 +++++-
src/add-ons/kernel/file_systems/nfs4/RPCDefs.h     |   61 ++++++++++++++++
src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp  |   25 +------

############################################################################

Commit:      8019eaf184c1cadcf0ef6625e439851d0133de24

Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Sun Aug  5 01:10:38 2012 UTC

nfs4: Several minor fixes

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp 
b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
index b9a5f0e..25ed74b 100644
--- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
@@ -593,7 +593,7 @@ ConnectionListener::Listen(ConnectionListener** _listener, 
uint16 port)
 
 
 status_t
-ConnectionListener::AcceptConnection(Connection** _connection)
+ConnectionListener::AcceptConnection(Connection** connection)
 {
        object_wait_info object[2];
        object[0].object = fWaitCancel;
@@ -623,15 +623,13 @@ ConnectionListener::AcceptConnection(Connection** 
_connection)
        ServerAddress address;
        address.fProtocol = IPPROTO_TCP;
        address.fAddress = addr;
-       Connection* connection;
 
-       status_t result = Connection::SetTo(&connection, sock, address);
+       status_t result = Connection::SetTo(connection, sock, address);
        if (result != B_OK) {
                close(sock);
                return result;
        }
 
-       *_connection = connection;
        return B_OK;
 }
 
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp
index 39788b1..c484112 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp
@@ -26,7 +26,7 @@ enum {
        PROGRAM_NFS_CB  = 0x40000000
 };
 
-#define NFS_VERSION    4
+#define NFS_CB_VERSION 1
 
 
 CallbackRequest::CallbackRequest(void *buffer, int size)
@@ -46,6 +46,9 @@ CallbackRequest::CallbackRequest(void *buffer, int size)
        if (fStream.GetUInt() != PROGRAM_NFS_CB)
                return;
 
+       if (fStream.GetUInt() != NFS_CB_VERSION)
+               return;
+
        fProcedure = fStream.GetUInt();
 
        fStream.GetOpaque(NULL);
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp
index 837557e..5ff83f6 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp
@@ -170,7 +170,7 @@ CallbackServer::NewConnection(Connection* connection)
                return B_NO_MEMORY;
 
        arguments[0] = this;
-       arguments[1] = connection;
+       arguments[1] = entry;
 
        thread_id thread;
        thread = spawn_kernel_thread(&CallbackServer::ConnectionThreadLauncher,
@@ -224,7 +224,7 @@ status_t
 CallbackServer::ConnectionThread(ConnectionEntry* entry)
 {
        Connection* connection = entry->fConnection;
-       dprintf("NEW CONNECTION\n");
+
        while (fThreadRunning) {
                uint32 size;
                void* buffer;

############################################################################

Commit:      feb15cc63ce6f32dc73e8322c165266d4a11b149

Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Sun Aug  5 01:50:30 2012 UTC

nfs4: Reply to incorrect and CB_NULL callback requests

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/nfs4/Jamfile 
b/src/add-ons/kernel/file_systems/nfs4/Jamfile
index abe0a46..b6aeed8 100644
--- a/src/add-ons/kernel/file_systems/nfs4/Jamfile
+++ b/src/add-ons/kernel/file_systems/nfs4/Jamfile
@@ -27,6 +27,7 @@ KernelAddon nfs4 :
        RPCAuth.cpp
        RPCCall.cpp
        RPCCallback.cpp
+       RPCCallbackReply.cpp
        RPCCallbackRequest.cpp
        RPCCallbackServer.cpp
        RPCReply.cpp
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp
index e9ce2aa..b10f2ab 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp
@@ -16,6 +16,8 @@
 #include <SupportDefs.h>
 #include <util/kernel_cpp.h>
 
+#include "RPCDefs.h"
+
 
 using namespace RPC;
 
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h 
b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h
index 81a127f..d45a7cf 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h
@@ -14,11 +14,6 @@
 
 namespace RPC {
 
-enum auth_flavour {
-       AUTH_NONE       = 0,
-       AUTH_SYS        = 1
-};
-
 class Auth {
 public:
        inline  const XDR::WriteStream&         Stream() const;
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp
index 323e7f1..fcc3124 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp
@@ -11,20 +11,10 @@
 
 #include <util/kernel_cpp.h>
 
+#include "RPCDefs.h"
 
-using namespace RPC;
-
-enum {
-       CALL            = 0
-};
-
-#define        VERSION         2
 
-enum {
-       PROGRAM_NFS     = 100003
-};
-
-#define NFS_VERSION    4
+using namespace RPC;
 
 
 Call::Call()
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp
new file mode 100644
index 0000000..595bb09
--- /dev/null
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Paweł Dziepak, pdziepak@xxxxxxxxxxx
+ */
+
+
+#include "RPCCallbackReply.h"
+
+#include <util/kernel_cpp.h>
+
+#include "RPCDefs.h"
+
+
+using namespace RPC;
+
+
+CallbackReply::CallbackReply()
+{
+}
+
+
+CallbackReply*
+CallbackReply::Create(uint32 xid, AcceptStat rpcError)
+{
+       CallbackReply* reply = new(std::nothrow) CallbackReply;
+       if (reply == NULL)
+               return NULL;
+
+       reply->fStream.AddUInt(xid);
+
+       reply->fStream.AddInt(REPLY);
+       reply->fStream.AddUInt(MSG_ACCEPTED);
+
+       reply->fStream.AddInt(AUTH_NONE);
+       reply->fStream.AddOpaque(NULL, 0);
+
+       reply->fStream.AddUInt(rpcError);
+       
+       return reply;
+}
+
+
+CallbackReply::~CallbackReply()
+{
+}
+
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h 
b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h
new file mode 100644
index 0000000..485d5fa
--- /dev/null
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Paweł Dziepak, pdziepak@xxxxxxxxxxx
+ */
+#ifndef RPCCALLBACKREPLY_H
+#define RPCCALLBACKREPLY_H
+
+
+#include "RPCDefs.h"
+#include "XDR.h"
+
+
+namespace RPC {
+
+class CallbackReply {
+public:
+       static  CallbackReply*          Create(uint32 xid,
+                                                                       
AcceptStat rpcError = SUCCESS);
+                                                               
~CallbackReply();
+
+       inline  XDR::WriteStream&       Stream();
+
+private:
+                                                               CallbackReply();
+
+                       XDR::WriteStream        fStream;
+};
+
+
+inline XDR::WriteStream&
+CallbackReply::Stream()
+{
+       return fStream;
+}
+
+}              // namespace RPC
+
+
+#endif //      RPCCALLBACKREPLY_H
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp
index c484112..4b10efb 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp
@@ -12,26 +12,16 @@
 #include <stdlib.h>
 
 #include "NFS4Defs.h"
+#include "RPCDefs.h"
 
 
 using namespace RPC;
 
-enum {
-       CALL            = 0
-};
-
-#define        VERSION         2
-
-enum {
-       PROGRAM_NFS_CB  = 0x40000000
-};
-
-#define NFS_CB_VERSION 1
-
 
 CallbackRequest::CallbackRequest(void *buffer, int size)
        :
        fError(B_BAD_VALUE),
+       fRPCError(GARBAGE_ARGS),
        fStream(buffer, size),
        fBuffer(buffer)
 {
@@ -43,11 +33,15 @@ CallbackRequest::CallbackRequest(void *buffer, int size)
        if (fStream.GetUInt() != VERSION)
                return;
 
-       if (fStream.GetUInt() != PROGRAM_NFS_CB)
+       if (fStream.GetUInt() != PROGRAM_NFS_CB) {
+               fRPCError = PROG_UNAVAIL;
                return;
+       }
 
-       if (fStream.GetUInt() != NFS_CB_VERSION)
+       if (fStream.GetUInt() != NFS_CB_VERSION) {
+               fRPCError = PROG_MISMATCH;
                return;
+       }
 
        fProcedure = fStream.GetUInt();
 
@@ -60,9 +54,11 @@ CallbackRequest::CallbackRequest(void *buffer, int size)
                        return;
 
                fID = fStream.GetUInt();
-       }
-
-       fError = B_OK;
+       } else if (fProcedure == CallbackProcNull) {
+               fRPCError = SUCCESS;
+               fError = B_OK;
+       } else
+               fRPCError = PROC_UNAVAIL;
 }
 
 
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h 
b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h
index 28b822e..01518f3 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h
@@ -9,6 +9,7 @@
 #define RPCCALLBACKREQUEST_H
 
 
+#include "RPCDefs.h"
 #include "XDR.h"
 
 
@@ -25,6 +26,8 @@ public:
        inline  uint32                          Procedure();
 
        inline  status_t                        Error();
+       inline  AcceptStat                      RPCError();
+
        inline  XDR::ReadStream&        Stream();
 
 private:
@@ -34,6 +37,7 @@ private:
                        uint32                          fProcedure;
 
                        status_t                        fError;
+                       AcceptStat                      fRPCError;
 
                        XDR::ReadStream         fStream;
                        void*                           fBuffer;
@@ -68,6 +72,13 @@ CallbackRequest::Error()
 }
 
 
+inline AcceptStat
+CallbackRequest::RPCError()
+{
+       return fRPCError;
+}
+
+
 inline XDR::ReadStream&
 CallbackRequest::Stream()
 {
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp
index 5ff83f6..651ccc5 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp
@@ -11,6 +11,7 @@
 
 #include "NFS4Defs.h"
 #include "RPCCallback.h"
+#include "RPCCallbackReply.h"
 #include "RPCCallbackRequest.h"
 
 
@@ -224,6 +225,7 @@ status_t
 CallbackServer::ConnectionThread(ConnectionEntry* entry)
 {
        Connection* connection = entry->fConnection;
+       CallbackReply* reply;
 
        while (fThreadRunning) {
                uint32 size;
@@ -238,15 +240,30 @@ CallbackServer::ConnectionThread(ConnectionEntry* entry)
                if (request == NULL || request->Error() != B_OK) {
                        free(buffer);
                        continue;
+               } else if (request != NULL) {
+                       reply = CallbackReply::Create(request->XID(), 
request->RPCError());
+                       if (reply != NULL) {
+                               connection->Send(reply->Stream().Buffer(),
+                                       reply->Stream().Size());
+                               delete reply;
+                       }
+                       free(buffer);
+                       continue;
                }
 
+
                switch (request->Procedure()) {
                        case CallbackProcCompound:
                                
GetCallback(request->ID())->EnqueueRequest(request, connection);
                                break;
 
                        case CallbackProcNull:
-                               dprintf("GOT CB_NULL %x\n", 
(int)request->XID());
+                               reply = CallbackReply::Create(request->XID());
+                               if (reply != NULL) {
+                                       
connection->Send(reply->Stream().Buffer(),
+                                               reply->Stream().Size());
+                                       delete reply;
+                               }
 
                        default:
                                free(buffer);
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h 
b/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h
new file mode 100644
index 0000000..bd551a6
--- /dev/null
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Paweł Dziepak, pdziepak@xxxxxxxxxxx
+ */
+#ifndef RPCDEFS_H
+#define RPCDEFS_H
+
+
+namespace RPC {
+
+enum {
+       VERSION                 = 2
+};
+
+enum {
+       PROGRAM_NFS             = 100003,
+       PROGRAM_NFS_CB  = 0x40000000
+};
+
+enum {
+       NFS_VERSION             = 4,
+       NFS_CB_VERSION  = 1
+};
+
+enum {
+       CALL            = 0,
+       REPLY           = 1
+};
+
+enum {
+       MSG_ACCEPTED    = 0,
+       MSG_DENIED              = 1
+};
+
+enum AcceptStat {
+       SUCCESS       = 0, /* RPC executed successfully       */
+       PROG_UNAVAIL  = 1, /* remote hasn't exported program  */
+       PROG_MISMATCH = 2, /* remote can't support version #  */
+       PROC_UNAVAIL  = 3, /* program can't support procedure */
+       GARBAGE_ARGS  = 4, /* procedure can't decode params   */
+       SYSTEM_ERR    = 5  /* e.g. memory allocation failure  */
+};
+
+enum RejectStat {
+       RPC_MISMATCH = 0, /* RPC version number != 2          */
+       AUTH_ERROR = 1    /* remote can't authenticate caller */
+};
+
+enum AuthFlavour {
+       AUTH_NONE       = 0,
+       AUTH_SYS        = 1
+};
+
+}              // namespace RPC
+
+
+#endif // RPCDEFS_H
+
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp
index 3dfa899..3f61357 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp
@@ -11,31 +11,10 @@
 
 #include <util/kernel_cpp.h>
 
+#include "RPCDefs.h"
 
-using namespace RPC;
-
-enum {
-       REPLY   = 1
-};
-
-enum {
-       MSG_ACCEPTED    = 0,
-       MSG_DENIED              = 1
-};
 
-enum accept_stat {
-       SUCCESS       = 0, /* RPC executed successfully       */
-       PROG_UNAVAIL  = 1, /* remote hasn't exported program  */
-       PROG_MISMATCH = 2, /* remote can't support version #  */
-       PROC_UNAVAIL  = 3, /* program can't support procedure */
-       GARBAGE_ARGS  = 4, /* procedure can't decode params   */
-       SYSTEM_ERR    = 5  /* e.g. memory allocation failure  */
-};
-
-enum reject_stat {
-       RPC_MISMATCH = 0, /* RPC version number != 2          */
-       AUTH_ERROR = 1    /* remote can't authenticate caller */
-};
+using namespace RPC;
 
 
 Reply::Reply(void *buffer, int size)


Other related posts: