From 1d2c2cdd28a3d1dd8f29246113cc8c5513a35a12 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sat, 11 Feb 2023 22:14:30 +0100 Subject: [PATCH] feat(pcap): add options, replace magic numbers with options --- Pcap/NosSmooth.Pcap/PcapNostaleClient.cs | 15 +++++++----- Pcap/NosSmooth.Pcap/PcapNostaleManager.cs | 22 ++++++++++-------- Pcap/NosSmooth.Pcap/PcapNostaleOptions.cs | 28 +++++++++++++++++++++++ Pcap/NosSmooth.Pcap/ProcessTcpManager.cs | 9 +++++--- 4 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 Pcap/NosSmooth.Pcap/PcapNostaleOptions.cs diff --git a/Pcap/NosSmooth.Pcap/PcapNostaleClient.cs b/Pcap/NosSmooth.Pcap/PcapNostaleClient.cs index 812ae0a7edb8f7952aa9d202a91327205c0c1dab..a624852bd84d2c8569692f7fab537f4ea6882183 100644 --- a/Pcap/NosSmooth.Pcap/PcapNostaleClient.cs +++ b/Pcap/NosSmooth.Pcap/PcapNostaleClient.cs @@ -8,6 +8,7 @@ using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Text; +using Microsoft.Extensions.Options; using NosSmooth.Core.Client; using NosSmooth.Core.Commands; using NosSmooth.Core.Packets; @@ -35,11 +36,11 @@ public class PcapNostaleClient : BaseNostaleClient private readonly PcapNostaleManager _pcapManager; private readonly ProcessTcpManager _processTcpManager; private readonly IPacketHandler _handler; + private readonly PcapNostaleOptions _options; private CryptographyManager _crypto; - private int _localPort; - private long _localAddr; private CancellationToken? _stoppingToken; private bool _running; + private TcpConnection _connection; /// /// Initializes a new instance of the class. @@ -51,6 +52,7 @@ public class PcapNostaleClient : BaseNostaleClient /// The process manager. /// The packet handler. /// The command processor. + /// The options. public PcapNostaleClient ( Process process, @@ -59,7 +61,8 @@ public class PcapNostaleClient : BaseNostaleClient PcapNostaleManager pcapManager, ProcessTcpManager processTcpManager, IPacketHandler handler, - CommandProcessor commandProcessor + CommandProcessor commandProcessor, + IOptions options ) : base(commandProcessor) { @@ -68,6 +71,7 @@ public class PcapNostaleClient : BaseNostaleClient _pcapManager = pcapManager; _processTcpManager = processTcpManager; _handler = handler; + _options = options.Value; _crypto = new CryptographyManager(); _crypto.EncryptionKey = encryptionKey; } @@ -118,8 +122,7 @@ public class PcapNostaleClient : BaseNostaleClient var reverseConn = new TcpConnection (conn.RemoteAddr, conn.RemotePort, conn.LocalAddr, conn.LocalPort); - _localAddr = conn.LocalAddr; - _localPort = conn.LocalPort; + _connection = conn; _pcapManager.RegisterConnection(conn, this); _pcapManager.RegisterConnection(reverseConn, this); @@ -134,7 +137,7 @@ public class PcapNostaleClient : BaseNostaleClient } } - await Task.Delay(TimeSpan.FromMilliseconds(10), stopRequested); + await Task.Delay(TimeSpan.FromMilliseconds(_options.ProcessRefreshInterval), stopRequested); } } catch (OperationCanceledException) diff --git a/Pcap/NosSmooth.Pcap/PcapNostaleManager.cs b/Pcap/NosSmooth.Pcap/PcapNostaleManager.cs index e617545cbb977580ac45a9b67e6565cb8b02f518..41c03b3f659ab962f853600c22c298c33231c4f9 100644 --- a/Pcap/NosSmooth.Pcap/PcapNostaleManager.cs +++ b/Pcap/NosSmooth.Pcap/PcapNostaleManager.cs @@ -8,6 +8,8 @@ using System.Collections.Concurrent; using System.Diagnostics; using System.Net; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using PacketDotNet; using SharpPcap; using SharpPcap.LibPcap; @@ -19,6 +21,7 @@ namespace NosSmooth.Pcap; public class PcapNostaleManager { private readonly ILogger _logger; + private readonly PcapNostaleOptions _options; private readonly ConcurrentDictionary _connections; private readonly ConcurrentDictionary _clients; private Task? _deletionTask; @@ -30,9 +33,11 @@ public class PcapNostaleManager /// Initializes a new instance of the class. /// /// The logger. - public PcapNostaleManager(ILogger logger) + /// The options. + public PcapNostaleManager(ILogger logger, IOptions options) { _logger = logger; + _options = options.Value; _connections = new ConcurrentDictionary(); _clients = new ConcurrentDictionary(); } @@ -79,7 +84,7 @@ public class PcapNostaleManager { foreach (var sniffedPacket in data.SniffedData) { - client.OnPacketArrival(connection, sniffedPacket); + client.OnPacketArrival(null, connection, sniffedPacket); } } } @@ -147,7 +152,6 @@ public class PcapNostaleManager private void DeviceOnOnPacketArrival(object sender, PacketCapture e) { var rawPacket = e.GetPacket(); - var packet = PacketDotNet.Packet.ParsePacket(rawPacket.LinkLayerType, rawPacket.Data); var tcpPacket = packet.Extract(); @@ -188,14 +192,14 @@ public class PcapNostaleManager var data = _connections[tcpConnection]; if (data.SniffedData.Count < 5 && tcpPacket.PayloadData.Length < 500 - && data.FirstObservedAt.AddSeconds(10) > DateTimeOffset.Now) + && data.FirstObservedAt.AddMilliseconds(_options.CleanSniffedDataInterval) > DateTimeOffset.Now) { data.SniffedData.Add(tcpPacket.PayloadData); } if (_clients.TryGetValue(tcpConnection, out var client)) { - client.OnPacketArrival(tcpConnection, tcpPacket.PayloadData); + client.OnPacketArrival((LibPcapLiveDevice)e.Device, tcpConnection, tcpPacket.PayloadData); } } @@ -207,19 +211,19 @@ public class PcapNostaleManager { foreach (var connectionData in _connections) { - if (connectionData.Value.FirstObservedAt.AddMinutes(10) < DateTimeOffset.Now) + if (connectionData.Value.FirstObservedAt.AddMilliseconds(_options.ForgetConnectionInterval) < DateTimeOffset.Now) { _connections.TryRemove(connectionData); } - if (connectionData.Value.SniffedData.Count > 0 && connectionData.Value.FirstObservedAt.AddSeconds - (10) < DateTimeOffset.Now) + if (connectionData.Value.SniffedData.Count > 0 && connectionData.Value.FirstObservedAt.AddMilliseconds + (_options.CleanSniffedDataInterval) < DateTimeOffset.Now) { connectionData.Value.SniffedData.Clear(); } } - await Task.Delay(TimeSpan.FromSeconds(30), ct); + await Task.Delay(TimeSpan.FromSeconds(_options.CleanSniffedDataInterval * 3), ct); } catch (OperationCanceledException) { diff --git a/Pcap/NosSmooth.Pcap/PcapNostaleOptions.cs b/Pcap/NosSmooth.Pcap/PcapNostaleOptions.cs new file mode 100644 index 0000000000000000000000000000000000000000..d426b9ab11d66c7cfc7494a20c55163e3b615b36 --- /dev/null +++ b/Pcap/NosSmooth.Pcap/PcapNostaleOptions.cs @@ -0,0 +1,28 @@ +// +// PcapNostaleOptions.cs +// +// Copyright (c) František Boháček. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace NosSmooth.Pcap; + +/// +/// Options for and . +/// +public class PcapNostaleOptions +{ + /// + /// Gets or sets the refresh interval of connections of NosTale processes in milliseconds. Default 10 milliseconds. + /// + public long ProcessRefreshInterval { get; set; } = 10; + + /// + /// Gets or sets the time data from a connection should be kept in milliseconds. Default 10 seconds. + /// + public long CleanSniffedDataInterval { get; set; } = 10 * 1000; + + /// + /// Gets or sets the time tcp connection should be forgotten in milliseconds. Default 10 minutes. + /// + public long ForgetConnectionInterval { get; set; } = 10 * 60 * 1000; +} \ No newline at end of file diff --git a/Pcap/NosSmooth.Pcap/ProcessTcpManager.cs b/Pcap/NosSmooth.Pcap/ProcessTcpManager.cs index b26fef77e1bc709e5914e4f2d34054d854028f7b..9d12965f3932bc7c7290f093f68fab7aa121dfde 100644 --- a/Pcap/NosSmooth.Pcap/ProcessTcpManager.cs +++ b/Pcap/NosSmooth.Pcap/ProcessTcpManager.cs @@ -5,6 +5,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System.Diagnostics; +using Microsoft.Extensions.Options; namespace NosSmooth.Pcap; @@ -14,7 +15,7 @@ namespace NosSmooth.Pcap; /// public class ProcessTcpManager { - private static TimeSpan RefreshInterval = TimeSpan.FromMilliseconds(9.99); + private readonly PcapNostaleOptions _options; private readonly SemaphoreSlim _semaphore; private readonly List _processes; @@ -24,8 +25,10 @@ public class ProcessTcpManager /// /// Initializes a new instance of the class. /// - public ProcessTcpManager() + /// The options. + public ProcessTcpManager(IOptions options) { + _options = options.Value; _lastRefresh = DateTimeOffset.MinValue; _semaphore = new SemaphoreSlim(1, 1); _processes = new List(); @@ -92,7 +95,7 @@ public class ProcessTcpManager private async Task Refresh() { - if (_lastRefresh.Add(RefreshInterval) >= DateTimeOffset.Now) + if (_lastRefresh.AddMilliseconds(_options.ProcessRefreshInterval) >= DateTimeOffset.Now) { return; }