private void sendOpen(final short channelMax, final int maxFrameSize) { Open open = new Open(); open.setChannelMax(UnsignedShort.valueOf(DEFAULT_CHANNEL_MAX)); open.setContainerId(_container.getId()); open.setMaxFrameSize(getDesiredMaxFrameSize()); open.setHostname(getRemoteHostname()); send(CONNECTION_CONTROL_CHANNEL, open); }
public synchronized void receiveBegin(short channel, Begin begin) { short myChannelId; if (begin.getRemoteChannel() != null) { myChannelId = begin.getRemoteChannel().shortValue(); SessionEndpoint endpoint; try { endpoint = _sendingSessions[myChannelId]; } catch (IndexOutOfBoundsException e) { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription( "BEGIN received on channel " + channel + " with given remote-channel " + begin.getRemoteChannel() + " which is outside the valid range of 0 to " + _channelMax + "."); connectionError(error); return; } if (endpoint != null) { if (_receivingSessions[channel] == null) { _receivingSessions[channel] = endpoint; endpoint.setReceivingChannel(channel); endpoint.setNextIncomingId(begin.getNextOutgoingId()); endpoint.setOutgoingSessionCredit(begin.getIncomingWindow()); } else { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription( "BEGIN received on channel " + channel + " which is already in use."); connectionError(error); } } else { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription( "BEGIN received on channel " + channel + " with given remote-channel " + begin.getRemoteChannel() + " which is not known as a begun session."); connectionError(error); } } else // Peer requesting session creation { myChannelId = getFirstFreeChannel(); if (myChannelId == -1) { // close any half open channel myChannelId = getFirstFreeChannel(); } if (_receivingSessions[channel] == null) { SessionEndpoint endpoint = new SessionEndpoint(this, begin); _receivingSessions[channel] = endpoint; _sendingSessions[myChannelId] = endpoint; Begin beginToSend = new Begin(); endpoint.setReceivingChannel(channel); endpoint.setSendingChannel(myChannelId); beginToSend.setRemoteChannel(UnsignedShort.valueOf(channel)); beginToSend.setNextOutgoingId(endpoint.getNextOutgoingId()); beginToSend.setOutgoingWindow(endpoint.getOutgoingWindowSize()); beginToSend.setIncomingWindow(endpoint.getIncomingWindowSize()); send(myChannelId, beginToSend); _connectionEventListener.remoteSessionCreation(endpoint); } else { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription("BEGIN received on channel " + channel + " which is already in use."); connectionError(error); } } }