示例#1
0
 /**
  * Got an SSH_MSG_UNIMPLEMENTED, so lets see where we're at and act accordingly.
  *
  * @param packet The 'unimplemented' packet received
  * @throws TransportException
  */
 private void gotUnimplemented(SSHPacket packet) throws SSHException {
   long seqNum = packet.readUInt32();
   log.debug("Received SSH_MSG_UNIMPLEMENTED #{}", seqNum);
   if (kexer.isKexOngoing())
     throw new TransportException("Received SSH_MSG_UNIMPLEMENTED while exchanging keys");
   getService().notifyUnimplemented(seqNum);
 }
示例#2
0
  @Override
  public long write(SSHPacket payload) throws TransportException {
    writeLock.lock();
    try {

      if (kexer.isKexOngoing()) {
        // Only transport layer packets (1 to 49) allowed except SERVICE_REQUEST
        final Message m = Message.fromByte(payload.array()[payload.rpos()]);
        if (!m.in(1, 49) || m == Message.SERVICE_REQUEST) {
          assert m != Message.KEXINIT;
          kexer.waitForDone();
        }
      } else if (encoder.getSequenceNumber() == 0) // We get here every 2**32th packet
      kexer.startKex(true);

      final long seq = encoder.encode(payload);
      try {
        connInfo.out.write(payload.array(), payload.rpos(), payload.available());
        connInfo.out.flush();
      } catch (IOException ioe) {
        throw new TransportException(ioe);
      }

      return seq;

    } finally {
      writeLock.unlock();
    }
  }