protected internal override void HandleInternal(ChannelHandlerContext ctx, RpcInfo info) { // This is just like what's done in RpcProgramMountd#handleInternal and // RpcProgramNfs3#handleInternal. RpcCall rpcCall = (RpcCall)info.Header(); int procedure = rpcCall.GetProcedure(); if (procedure != 0) { bool portMonitorSuccess = DoPortMonitoring(info.RemoteAddress()); if (!portMonitorSuccess) { SendRejectedReply(rpcCall, info.RemoteAddress(), ctx); return; } } resultSize = info.Data().ReadableBytes(); RpcAcceptedReply reply = RpcAcceptedReply.GetAcceptInstance(1234, new VerifierNone ()); XDR @out = new XDR(); reply.Write(@out); ChannelBuffer b = ChannelBuffers.WrappedBuffer(@out.AsReadOnlyWrap().Buffer()); RpcResponse rsp = new RpcResponse(b, info.RemoteAddress()); RpcUtil.SendRpcResponse(ctx, rsp); }
public override void MessageReceived(ChannelHandlerContext ctx, MessageEvent e) { ChannelBuffer buf = (ChannelBuffer)e.GetMessage(); // Read reply if (!ValidMessageLength(buf.ReadableBytes())) { e.GetChannel().Close(); return; } // handling fragment header for TCP, 4 bytes. byte[] fragmentHeader = Arrays.CopyOfRange(buf.Array(), 0, 4); int fragmentSize = XDR.FragmentSize(fragmentHeader); bool isLast = XDR.IsLastFragment(fragmentHeader); System.Diagnostics.Debug.Assert((fragmentSize == 28 && isLast == true)); XDR xdr = new XDR(); xdr.WriteFixedOpaque(Arrays.CopyOfRange(buf.Array(), 4, buf.ReadableBytes())); RpcReply reply = RpcReply.Read(xdr); if (reply.GetState() == RpcReply.ReplyState.MsgAccepted) { RpcAcceptedReply acceptedReply = (RpcAcceptedReply)reply; Handle(acceptedReply, xdr); } else { RpcDeniedReply deniedReply = (RpcDeniedReply)reply; Handle(deniedReply); } e.GetChannel().Close(); }
private void Handle(RpcAcceptedReply acceptedReply, XDR xdr) { RpcAcceptedReply.AcceptState acceptState = acceptedReply.GetAcceptState(); System.Diagnostics.Debug.Assert((acceptState == RpcAcceptedReply.AcceptState.Success )); bool answer = xdr.ReadBoolean(); if (answer != true) { Log.Warn("Portmap mapping registration failed, accept state:" + acceptState); } Log.Info("Portmap mapping registration succeeded"); }
public virtual void TestConstructor() { Verifier verifier = new VerifierNone(); RpcAcceptedReply reply = new RpcAcceptedReply(0, RpcReply.ReplyState.MsgAccepted, verifier, RpcAcceptedReply.AcceptState.Success); Assert.Equal(0, reply.GetXid()); Assert.Equal(RpcMessage.Type.RpcReply, reply.GetMessageType()); Assert.Equal(RpcReply.ReplyState.MsgAccepted, reply.GetState() ); Assert.Equal(verifier, reply.GetVerifier()); Assert.Equal(RpcAcceptedReply.AcceptState.Success, reply.GetAcceptState ()); }
private void SendAcceptedReply(RpcCall call, EndPoint remoteAddress, RpcAcceptedReply.AcceptState acceptState, ChannelHandlerContext ctx) { RpcAcceptedReply reply = RpcAcceptedReply.GetInstance(call.GetXid(), acceptState, Verifier.VerifierNone); XDR @out = new XDR(); reply.Write(@out); if (acceptState == RpcAcceptedReply.AcceptState.ProgMismatch) { @out.WriteInt(lowProgVersion); @out.WriteInt(highProgVersion); } ChannelBuffer b = ChannelBuffers.WrappedBuffer(@out.AsReadOnlyWrap().Buffer()); RpcResponse rsp = new RpcResponse(b, remoteAddress); RpcUtil.SendRpcResponse(ctx, rsp); }
public static RpcReply Read(XDR xdr) { int xid = xdr.ReadInt(); RpcMessage.Type messageType = RpcMessage.Type.FromValue(xdr.ReadInt()); Preconditions.CheckState(messageType == RpcMessage.Type.RpcReply); RpcReply.ReplyState stat = RpcReply.ReplyState.FromValue(xdr.ReadInt()); switch (stat) { case RpcReply.ReplyState.MsgAccepted: { return(RpcAcceptedReply.Read(xid, stat, xdr)); } case RpcReply.ReplyState.MsgDenied: { return(RpcDeniedReply.Read(xid, stat, xdr)); } } return(null); }