private void AddOutgoingPacket(OutgoingPacket packet, PacketFlags flags = PacketFlags.None) { lock (sendLoopLock) { var ids = GetPacketCounter(packet.PacketType); if (ts3Crypt.CryptoInitComplete) { IncPacketCounter(packet.PacketType); } packet.PacketId = ids.Id; packet.GenerationId = ids.Generation; packet.ClientId = ClientId; packet.PacketFlags |= flags; switch (packet.PacketType) { case PacketType.Voice: case PacketType.VoiceWhisper: packet.PacketFlags |= PacketFlags.Unencrypted; NetUtil.H2N(packet.PacketId, packet.Data, 0); break; case PacketType.Command: case PacketType.CommandLow: packet.PacketFlags |= PacketFlags.Newprotocol; packetAckManager.Add(packet.PacketId, packet); break; case PacketType.Ping: lastSentPingId = packet.PacketId; packet.PacketFlags |= PacketFlags.Unencrypted; break; case PacketType.Pong: packet.PacketFlags |= PacketFlags.Unencrypted; break; case PacketType.Ack: case PacketType.AckLow: break; // Nothing to do case PacketType.Init1: packet.PacketFlags |= PacketFlags.Unencrypted; packetAckManager.Add(packet.PacketId, packet); break; default: throw Util.UnhandledDefault(packet.PacketType); } ColorDbg.WritePkgOut(packet); ts3Crypt.Encrypt(packet); packet.FirstSendTime = Util.Now; SendRaw(packet); } }
private void AddOutgoingPacket(OutgoingPacket packet, PacketFlags flags = PacketFlags.None) { lock (sendLoopLock) { if (packet.PacketType == PacketType.Init1) { packet.PacketFlags |= flags | PacketFlags.Unencrypted; packet.PacketId = 101; packet.ClientId = 0; } else { if (packet.PacketType == PacketType.Ping || packet.PacketType == PacketType.Pong || packet.PacketType == PacketType.Voice || packet.PacketType == PacketType.VoiceWhisper) { packet.PacketFlags |= flags | PacketFlags.Unencrypted; } else if (packet.PacketType == PacketType.Ack) { packet.PacketFlags |= flags; } else { packet.PacketFlags |= flags | PacketFlags.Newprotocol; } var ids = GetPacketCounter(packet.PacketType); packet.PacketId = ids.Item1; packet.GenerationId = ids.Item2; if (packet.PacketType == PacketType.Voice || packet.PacketType == PacketType.VoiceWhisper) { NetUtil.H2N(packet.PacketId, packet.Data, 0); } if (ts3Crypt.CryptoInitComplete) { IncPacketCounter(packet.PacketType); } packet.ClientId = ClientId; } ts3Crypt.Encrypt(packet); if (packet.PacketType == PacketType.Command || packet.PacketType == PacketType.CommandLow || packet.PacketType == PacketType.Init1) { packetAckManager.Add(packet.PacketId, packet); } else if (packet.PacketType == PacketType.Ping) { packetPingManager.Add(packet.PacketId, packet); } SendRaw(packet); } }
private void AddOutgoingPacket(OutgoingPacket packet, PacketFlags flags = PacketFlags.None) { lock (sendLoopLock) { if (packet.PacketType == PacketType.Init1) { packet.PacketFlags |= flags | PacketFlags.Unencrypted; packet.PacketId = 101; packet.ClientId = 0; } else { if (packet.PacketType == PacketType.Ping || packet.PacketType == PacketType.Pong || packet.PacketType == PacketType.Voice || packet.PacketType == PacketType.VoiceWhisper) { packet.PacketFlags |= flags | PacketFlags.Unencrypted; } else if (packet.PacketType == PacketType.Ack) { packet.PacketFlags |= flags; } else { packet.PacketFlags |= flags | PacketFlags.Newprotocol; } packet.PacketId = GetPacketCounter(packet.PacketType); if (packet.PacketType == PacketType.Voice || packet.PacketType == PacketType.VoiceWhisper) { NetUtil.H2N(packet.PacketId, packet.Data, 0); } if (ts3Crypt.CryptoInitComplete) { IncPacketCounter(packet.PacketType); } packet.ClientId = ClientId; } ts3Crypt.Encrypt(packet); if (packet.PacketType == PacketType.Command || packet.PacketType == PacketType.CommandLow || packet.PacketType == PacketType.Init1) { packetAckManager.Add(packet.PacketId, packet); } else if (packet.PacketType == PacketType.Ping) { try { packetPingManager.Add(packet.PacketId, packet); } catch { Console.WriteLine("Error with ping packet"); } } SendRaw(packet); } }
private void SendOutgoingData(ReadOnlySpan <byte> data, PacketType packetType, PacketFlags flags = PacketFlags.None) { var packet = new C2SPacket(data.ToArray(), packetType); lock (sendLoopLock) { var ids = GetPacketCounter(packet.PacketType); if (ts3Crypt.CryptoInitComplete) { IncPacketCounter(packet.PacketType); } packet.PacketId = ids.Id; packet.GenerationId = ids.Generation; packet.ClientId = ClientId; packet.PacketFlags |= flags; switch (packet.PacketType) { case PacketType.Voice: case PacketType.VoiceWhisper: packet.PacketFlags |= PacketFlags.Unencrypted; BinaryPrimitives.WriteUInt16BigEndian(packet.Data.AsSpan(), packet.PacketId); LoggerRawVoice.Trace("[O] {0}", packet); break; case PacketType.Command: case PacketType.CommandLow: packet.PacketFlags |= PacketFlags.Newprotocol; packetAckManager.Add(packet.PacketId, packet); LoggerRaw.Debug("[O] {0}", packet); break; case PacketType.Ping: lastSentPingId = packet.PacketId; packet.PacketFlags |= PacketFlags.Unencrypted; LoggerRaw.Trace("[O] Ping {0}", packet.PacketId); break; case PacketType.Pong: packet.PacketFlags |= PacketFlags.Unencrypted; LoggerRaw.Trace("[O] Pong {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); break; case PacketType.Ack: case PacketType.AckLow: LoggerRaw.Debug("[O] Acking {1}: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data), packet.PacketType); break; case PacketType.Init1: packet.PacketFlags |= PacketFlags.Unencrypted; initPacketCheck = packet; LoggerRaw.Debug("[O] InitID: {0}", packet.Data[4]); LoggerRaw.Trace("[O] {0}", packet); break; default: throw Util.UnhandledDefault(packet.PacketType); } ts3Crypt.Encrypt(packet); packet.FirstSendTime = Util.Now; SendRaw(packet); } }
// is always locked on 'sendLoopLock' from a higher call private E <string> SendOutgoingData(ReadOnlySpan <byte> data, PacketType packetType, PacketFlags flags = PacketFlags.None) { var ids = GetPacketCounter(packetType); IncPacketCounter(packetType); var packet = new Packet <TOut>(data, packetType, ids.Id, ids.Generation) { PacketType = packetType }; if (typeof(TOut) == typeof(C2S)) // TODO: XXX { var meta = (C2S)(object)packet.HeaderExt; meta.ClientId = ClientId; packet.HeaderExt = (TOut)(object)meta; } packet.PacketFlags |= flags; switch (packet.PacketType) { case PacketType.Voice: case PacketType.VoiceWhisper: packet.PacketFlags |= PacketFlags.Unencrypted; BinaryPrimitives.WriteUInt16BigEndian(packet.Data, packet.PacketId); LoggerRawVoice.Trace("[O] {0}", packet); break; case PacketType.Command: case PacketType.CommandLow: packet.PacketFlags |= PacketFlags.Newprotocol; var resendPacket = new ResendPacket <TOut>(packet); packetAckManager.Add(packet.PacketId, resendPacket); LoggerRaw.Debug("[O] {0}", packet); break; case PacketType.Ping: lastSentPingId = packet.PacketId; packet.PacketFlags |= PacketFlags.Unencrypted; LoggerRaw.Trace("[O] Ping {0}", packet.PacketId); break; case PacketType.Pong: packet.PacketFlags |= PacketFlags.Unencrypted; LoggerRaw.Trace("[O] Pong {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); break; case PacketType.Ack: LoggerRaw.Debug("[O] Acking Ack: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); break; case PacketType.AckLow: packet.PacketFlags |= PacketFlags.Unencrypted; LoggerRaw.Debug("[O] Acking AckLow: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data)); break; case PacketType.Init1: packet.PacketFlags |= PacketFlags.Unencrypted; initPacketCheck = new ResendPacket <TOut>(packet); LoggerRaw.Debug("[O] InitID: {0}", packet.Data[4]); LoggerRaw.Trace("[O] {0}", packet); break; default: throw Util.UnhandledDefault(packet.PacketType); } ts3Crypt.Encrypt(ref packet); return(SendRaw(ref packet)); }