void onReceiveFromLocal(final MuxServerLocal local, final MuxPacket msg) { // Local is MUX
			// Log.debug(this.getClass().getSimpleName() + "::onReceiveFromLocal " + msg);
			if (msg.syn()) { // This is SYN/ACK
				final MuxServerRemote remote = getRemote(msg.getIdChannel());
				if (remote != null)
					remote.unlock(Constants.BUFFER_LEN * Constants.IO_BUFFERS);
			} else if (msg.fin()) { // End SubChannel
				Log.info(this.getClass().getSimpleName() + "::onReceiveFromLocal " + msg);
				final MuxServerRemote remote = getRemote(msg.getIdChannel());
				if (remote != null)
					remote.setShutdown();
			} else if (msg.ack()) { // Flow-Control ACK
				Log.debug(this.getClass().getSimpleName() + "::onReceiveFromLocal " + msg);
				final MuxServerRemote remote = getRemote(msg.getIdChannel());
				if (remote != null)
					remote.unlock(msg.ackSize());
			} else if (msg.nop()) { // NOP
				Log.info(this.getClass().getSimpleName() + "::onReceiveFromLocal " + msg);
			} else { // Data
				Log.debug(this.getClass().getSimpleName() + "::onReceiveFromLocal " + msg);
				try {
					final MuxServerRemote remote = getRemote(msg.getIdChannel());
					if (remote == null)
						return;
					final RawPacket raw = context.allocateRawPacket();
					raw.put(msg.getIdChannel(), msg.getBufferLen(), msg.getBuffer());
					remote.sendQueueRemote(raw);
				} catch (Exception e) {
					Log.error(this.getClass().getSimpleName() + "::onReceiveFromLocal " + e.toString(), e);
				}
			}
		}