private PacketAction feedEncryptedPacketImpl(Object passthrough) {	
		PacketAction action = PacketAction.NOT_ENOUGH_BYTES_YET;
		ByteBuffer b = socketToEngineData2;
		if(log.isLoggable(Level.FINEST))
			log.finest(id+"[sockToEngine] finished filling pos="+b.position()+" lim="+b.limit());
		ByteBuffer out = engineToAppData;
		HELPER.eraseBuffer(out);
		HELPER.doneFillingBuffer(b);
		
		HandshakeStatus hsStatus = sslEngine.getHandshakeStatus();
		Status status = null;

		if(log.isLoggable(Level.FINEST))
			log.finest(id+"[sockToEngine] going to unwrap pos="+b.position()+
					" lim="+b.limit()+" hsStatus="+hsStatus);

		int i = 0;
		//stay in loop while we 
		//1. need unwrap or not_handshaking or need_task AND
		//2. have data in buffer
		//3. have enough data in buffer(ie. not underflow)
		while(b.hasRemaining() && status != Status.BUFFER_UNDERFLOW && status != Status.CLOSED) {
			i++;
			SSLEngineResult result;
			try {
				result = sslEngine.unwrap(b, out);				
			} catch(SSLException e) {
				AsyncSSLEngineException ee = new AsyncSSLEngineException("status="+status+" hsStatus="+hsStatus+" b="+b, e);
				throw ee;
			}
			status = result.getStatus();
			hsStatus = result.getHandshakeStatus();
			if(log.isLoggable(Level.FINEST))
				log.finest(id+"[sockToEngine] unwrap done pos="+b.position()+" lim="+
						b.limit()+" status="+status+" hs="+hsStatus);
			
			if(out.position() != 0 && status != Status.CLOSED) { 
				//hsStatus == HandshakeStatus.NOT_HANDSHAKING && status != Status.BUFFER_UNDERFLOW) {
				HELPER.doneFillingBuffer(out);
				if(log.isLoggable(Level.FINE))
					log.fine(id+"packetUnencrypted pos="+out.position()+" lim="+
							out.limit()+" hs="+hsStatus+" status="+status);
				action = PacketAction.DECRYPTED_AND_FEDTOLISTENER;
				fireUnencryptedPackToListener(passthrough, out);
				if(out.hasRemaining())
					log.warning(id+"Discarding unread data");
				out.clear();
			}
			
			if(i > 1000)
				throw new RuntimeException(this+"Bug, stuck in loop, bufIn="+b+" bufOut="+out+
						" hsStatus="+hsStatus+" status="+status);
			else if(hsStatus == HandshakeStatus.NEED_TASK) {
				//if status is need task, we need to break to run the task before other handshake
				//messages?
				break;
			}
		}
		resetBuffer(status);
		
		if(log.isLoggable(Level.FINEST))
			log.finest(id+"[sockToEngine] reset pos="+b.position()+" lim="+b.limit()+" status="+status+" hs="+hsStatus);	
		if(log.isLoggable(Level.FINEST) && isConnected && status != Status.CLOSED) {
			log.finest(id+"[out-buffer] pos="+out.position()+" lim="+out.limit());
		}

		//First if avoids case where the close handshake is still going on so we are not closed
		//yet I think(I am writing this from memory)...
		if(status == Status.CLOSED && hsStatus == HandshakeStatus.NOT_HANDSHAKING) {
			isClosed = true;
			closeInbound();
			sslEngine.closeOutbound();
			sslListener.closed(clientInitiated);			
		}