/// <summary> /// Send control packet /// </summary> /// <param name="flags">SMUX header flags</param> private void SendControlPacket(SNISMUXFlags flags) { Span <byte> headerBytes = stackalloc byte[SNISMUXHeader.HEADER_LENGTH]; lock (this) { GetSMUXHeaderBytes(0, flags, headerBytes); } SNIPacket packet = new SNIPacket(SNISMUXHeader.HEADER_LENGTH); packet.AppendData(headerBytes); _connection.Send(packet); }
/// <summary> /// Generate a packet with SMUX header /// </summary> /// <param name="packet">SNI packet</param> /// <returns>Encapsulated SNI packet</returns> private SNIPacket GetSMUXEncapsulatedPacket(SNIPacket packet) { uint xSequenceNumber = _sequenceNumber; Span <byte> header = stackalloc byte[SNISMUXHeader.HEADER_LENGTH]; GetSMUXHeaderBytes(packet.Length, SNISMUXFlags.SMUX_DATA, header); SNIPacket smuxPacket = new SNIPacket(SNISMUXHeader.HEADER_LENGTH + packet.Length); smuxPacket.AppendData(header); smuxPacket.AppendPacket(packet); packet.Dispose(); return(smuxPacket); }
/// <summary> /// Generate a packet with SMUX header /// </summary> /// <param name="packet">SNI packet</param> /// <returns>Encapsulated SNI packet</returns> private SNIPacket GetSMUXEncapsulatedPacket(SNIPacket packet) { uint xSequenceNumber = _sequenceNumber; byte[] headerBytes = null; GetSMUXHeaderBytes(packet.Length, (byte)SNISMUXFlags.SMUX_DATA, ref headerBytes); SNIPacket smuxPacket = new SNIPacket(16 + packet.Length); smuxPacket.Description = string.Format("({0}) SMUX packet {1}", packet.Description == null ? "" : packet.Description, xSequenceNumber); smuxPacket.AppendData(headerBytes, 16); smuxPacket.AppendPacket(packet); return(smuxPacket); }
/// <summary> /// Set packet data /// </summary> /// <param name="packet">SNI packet</param> /// <param name="data">Data</param> /// <param name="length">Length</param> public void PacketSetData(SNIPacket packet, byte[] data, int length) { packet.AppendData(data, length); }