Example #1
0
        public DataChunk(byte flags, int length, ByteBuffer pkt) : base(ChunkType.DATA, flags, length, pkt)
        {
            //logger.LogDebug("read in chunk header " + length);
            //logger.LogDebug("body remaining " + _body.remaining());

            if (_body.remaining() >= 12)
            {
                _tsn      = _body.GetUInt();
                _streamId = _body.GetUShort();
                _sSeqNo   = _body.GetUShort();
                _ppid     = _body.GetInt();

                //logger.LogDebug(" _tsn : " + _tsn
                //        + " _streamId : " + _streamId
                //        + " _sSeqNo : " + _sSeqNo
                //        + " _ppid : " + _ppid);
                //logger.LogDebug("data size remaining " + _body.remaining());

                switch (_ppid)
                {
                case WEBRTCCONTROL:
                    ByteBuffer bb = _body.slice();
                    try
                    {
                        _open = new DataChannelOpen(bb);
                    }
                    catch (InvalidDataChunkException ex)
                    {
                        _invalid = ex;
                    }

                    //logger.LogDebug("Got an DCEP " + _open);
                    break;

                case WEBRTCstring:
                    // what format is a string ?
                    _data = new byte[_body.remaining()];
                    _body.GetBytes(_data, _data.Length);
                    _dataOffset = 0;
                    _dataLength = _data.Length;
                    //logger.LogDebug("string data is " + Encoding.ASCII.GetString(_data));
                    break;

                case WEBRTCBINARY:
                    _data = new byte[_body.remaining()];
                    _body.GetBytes(_data, _data.Length);
                    _dataOffset = 0;
                    _dataLength = _data.Length;
                    //logger.LogDebug("data is " + Packet.getHex(_data));
                    break;

                default:
                    logger.LogWarning($"Invalid payload protocol identifier Id in data chunk, ppid {_ppid}.");
                    _invalid = new InvalidDataChunkException(
                        $"Invalid payload protocol identifier in data chunk, ppid {_ppid}.");
                    break;
                }
            }
        }
Example #2
0
        public static DataChunk mkDataChannelOpen(string label)
        {
            DataChunk       open = new DataChunk();
            DataChannelOpen dope = new DataChannelOpen(label);

            open.setData(dope.getBytes());
            open._ppid = WEBRTCCONTROL;
            open.setFlags(SINGLEFLAG);
            return(open);
        }
Example #3
0
        public DataChunk mkAck(DataChannelOpen dcep)
        {
            DataChunk ack = new DataChunk();

            ack.setData(dcep.mkAck());
            ack._ppid = WEBRTCCONTROL;
            ack.setFlags(SINGLEFLAG);

            return(ack);
        }
Example #4
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);
        }