// todo should be in a behave block // then we wouldn't be messing with stream seq numbers. private Chunk[] dcepDeal(SCTPStream s, DataChunk dc, DataChannelOpen dcep) { Chunk[] rep = null; //logger.LogDebug("dealing with a decp for stream " + dc.getDataAsString()); if (!dcep.isAck()) { //logger.LogDebug("decp is not an ack... "); SCTPStreamBehaviour behave = dcep.mkStreamBehaviour(); s.setBehave(behave); s.setLabel(dcep.getLabel()); lock (s) { int seqIn = s.getNextMessageSeqIn(); s.setNextMessageSeqIn(seqIn + 1); int seqOut = s.getNextMessageSeqOut(); s.setNextMessageSeqOut(seqOut + 1); } rep = new Chunk[1]; DataChunk ack = dc.mkAck(dcep); s.outbound(ack); ack.setTsn(_nearTSN++); // check rollover - will break at maxint. rep[0] = ack; } else { //logger.LogDebug("got a dcep ack for " + s.getLabel()); SCTPStreamBehaviour behave = dcep.mkStreamBehaviour(); s.setBehave(behave); lock (s) { int seqIn = s.getNextMessageSeqIn(); s.setNextMessageSeqIn(seqIn + 1); int seqOut = s.getNextMessageSeqOut(); s.setNextMessageSeqOut(seqOut + 1); } } return(rep); }
/** * available datachunks are put here to be filled with data from this * outbound message * * @param dc */ public void fill(DataChunk dc) { int dsz = dc.getCapacity(); int remain = _data.Length - _offset; if (_offset == 0) { if (remain <= dsz) { // only one chunk dc.setFlags(DataChunk.SINGLEFLAG); dc.setData(_data); _offset = _data.Length; } else { // first chunk of many dc.setFlags(DataChunk.BEGINFLAG); dc.setData(_data, _offset, dsz); _offset += dsz; } } else // not first if (remain <= dsz) { // last chunk, this will all fit. dc.setFlags(DataChunk.ENDFLAG); dc.setData(_data, _offset, remain); _offset += remain; // should be _data_length now } else { // middle chunk. dc.setFlags(0); dc.setData(_data, _offset, dsz); _offset += dsz; } dc.setPpid(_pPid); dc.setsSeqNo(_mseq); _stream.outbound(dc); }