示例#1
0
        // 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);
        }
示例#2
0
        /**
         * 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);
        }