0

Please share your ideas on how we can resolve this exception

We are working on Netconf Over SSH and the SSH library used is Apache Mina and SSHD. Device is the Netconf server and Application is the Netconf Client. As device is behind firewall, application cannot connect to device but the device can connect to the application. so, we are using the session established by the device to the application for all the communication.

Below are the steps followed:

  1. Started NioSocketAcceptor listening/bind to a port number

  2. IoSessionConfig's useReadoperation attribute is set to true

  3. When a tcp connection is accepted, we have a mina core IoSession available, here we call it as a tcpSession.

  4. We wanted to use this mina IoSession for reading and writing netconf messages. Code used to convert mina core session to ssdh IoSession is as follows

    new org.apache.sshd.common.io.IoSession() {

         @Override
         public long getId() {
             return tcpSession.getId();
         }
    
         @Override
         public Object getAttribute(final Object key) {
             return tcpSession.getAttribute(key);
         }
    
         @Override
         public Object setAttribute(final Object key, final Object value) {
             return tcpSession.getAttribute(key, value);
         }
    
         @Override
         public SocketAddress getRemoteAddress() {
             return tcpSession.getRemoteAddress();
         }
    
         @Override
         public SocketAddress getLocalAddress() {
             return tcpSession.getLocalAddress();
         }
    
         @Override
         public IoWriteFuture write(final Buffer buffer) {
             final ChannelAsyncOutputStream.IoWriteFutureImpl ioWriteFuture = new ChannelAsyncOutputStream.IoWriteFutureImpl(buffer);
             byte[] bytes = buffer.getCompactData();   
             int capacity = bytes.length + 8;   
             IoBuffer bytebuffer = IoBuffer.allocate(capacity).setAutoExpand(true);   
             //bytebuffer.putInt(bytes.length);   
             bytebuffer.put(bytes);   
             bytebuffer.flip();              
             buffer.clear();
             final WriteFuture write = tcpSession.write(bytebuffer);
             write.addListener(new IoFutureListener<WriteFuture>() {
                 @Override
                 public void operationComplete(final WriteFuture future) {
                     if (future.isWritten()) {
                         ioWriteFuture.setValue(true);
                     } else {
                         // TODO check the value type expected + if exception can go there
                         ioWriteFuture.setValue(future.getException());
                     }
                 }
             });
    
             return ioWriteFuture;
         }       
    
         @Override
         public CloseFuture close(final boolean immediately) {
             final DefaultCloseFuture defaultCloseFuture = new DefaultCloseFuture(null);
             tcpSession.close(immediately).addListener(new IoFutureListener<org.apache.mina.core.future.CloseFuture>() {
                 @Override
                 public void operationComplete(final org.apache.mina.core.future.CloseFuture future) {
                     if(future.isClosed()) {
                         defaultCloseFuture.setValue(true);
                     } else {
                         // TODO check the value type expected
                         defaultCloseFuture.setValue(false);
                     }
                 }
             });
             return defaultCloseFuture;
         }
    
         @Override
         public IoService getService() {
             throw new UnsupportedOperationException("No service available");
         }
    
         @Override
         public boolean isClosed() {
             return tcpSession.getCloseFuture().isClosed();
         }
    
         @Override
         public boolean isClosing() {
             return tcpSession.isClosing();
         }
     });
    
  5. Code used to attach Apache SSHD IoSession with the client is as below

    final ConnectFuture connectFuture = new DefaultConnectFuture(null); ClientSessionImpl session = null; try { session = new ClientSessionImpl(sshClient, ioSession); AbstractSession.attachSession(ioSession, session); MyAsyncSshHandlerReader async = new MyAsyncSshHandlerReader(ioSession); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }

  6. MyAsyncSshHandlerReader is the class used to read the data from tcpSession.

    class MyAsyncSshHandlerReader implements IoFutureListener, AutoCloseable {

     private final org.apache.sshd.common.io.IoSession ioSession;
    
     public MyAsyncSshHandlerReader(org.apache.sshd.common.io.IoSession ioSession) {
         this.ioSession = ioSession;
         minaCoreIoSession.read().addListener(this);
     }
    
     @Override
     public void close() throws Exception {
         // TODO Auto-generated method stub
    
     }
    
     @Override
     public void operationComplete(ReadFuture future) {
         long msgsRead = future.getSession().getReadMessages();
         if(future.isRead() && !future.isClosed()){
    
             IoBuffer msg = (IoBuffer)future.getMessage();               
             msg.flip();
             Buffer buf = new Buffer(msg.array());           
             try {               
                 if(AbstractSession.getSession(ioSession) != null){
                     AbstractSession.getSession(ioSession).messageReceived(buf);                 
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
             minaCoreIoSession.read().addListener(this);
         }           
     }
    

    }

  7. When the client session is created at the application side, below methods are invoked.

    1. sendIdentification
    2. sendKexInit()
  8. Application has also received the identification message and key's exchanged from the device and identification message is read properly but could not decode the key exchange message, library has throwed SshException "invalid packet length 0"

2015-11-02 13:02:48,831 | INFO | oupCloseable-6-2 | ClientSessionImpl | 210 - org.apache.sshd.core - 0.14.0 | Error decoding packet (invalid length) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 fc 07 14 34 d4 4e 0e 2c 22 73 e4 7e 46 41 1b e3 55 27 ef 00 00 00 b7 65 63 64 68 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36 2c 65 63 64 68 2d 73 68 61 32 2d 6e 69 73 74 70 33 38 34 2c 65 63 64 68 2d 73 68 61 32 2d 6e 69 73 74 70 35 32 31 2c 64 69 66 66 69 65 2d 68 65 6c 6c 6d 61 6e 2d 67 72 6f 75 70 2d 65 78 63 68 61 6e 67 65 2d 73 68 61 32 35 36 2c 64 69 66 66 69 65 2d 68 65 6c 6c 6d 61 6e 2d 67 72 6f 75 70 2d 65 78 63 68 61 6e 67 65 2d 73 68 61 31 2c 64 69 66 66 69 65 2d 68 65 6c 6c 6d 61 6e 2d 67 72 6f 75 70 31 34 2d 73 68 61 31 2c 64 69 66org.apache.sshd.common.SshException: Invalid packet length: 0 at org.apache.sshd.common.session.AbstractSession.decode(AbstractSession.java:719) at org.apache.sshd.common.session.AbstractSession.messageReceived(AbstractSession.java:308) at org.opendaylight.controller.netconf.nettyutil.handler.ssh.client.ReversedAsyncSshHandler$MyAsyncSshHandlerReader.operationComplete(ReversedAsyncSshHandler.java:220)

  1. please throw some light on how AbstractSession.decode() method works

From my debugging, rpos and limit variables are holding same value, say, 1536 for example. Is the way I am reading has some issue?

Mehdi Dehghani
  • 10,970
  • 6
  • 59
  • 64
Vikram Darsi
  • 79
  • 2
  • 8

1 Answers1

0

After going through many examples and Apache mina library, I found the issue lies with the way we are reading from mina core IoSession.

Correct way of reading ::

int r=ioBuffer.remaining();
byte[] b=new byte[r];
ioBuffer.get(b,0,r);

Buffer buf = new Buffer(b);
AbstractSession.getSession(tcpSession).messageReceived(buf)
Vikram Darsi
  • 79
  • 2
  • 8