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; } } }
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); }
public DataChunk mkAck(DataChannelOpen dcep) { DataChunk ack = new DataChunk(); ack.setData(dcep.mkAck()); ack._ppid = WEBRTCCONTROL; ack.setFlags(SINGLEFLAG); return(ack); }
// 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); }