public void IPv4Address_Equals() { Random random = new Random(); Byte[] firstAddressBytes = random.NextBytes(4); Byte[] secondAddressBytes = new Byte[4]; firstAddressBytes.CopyTo(secondAddressBytes, 0); IPv4Address firstAddress = IPv4Address.FromByteArray(firstAddressBytes); IPv4Address secondAddress = IPv4Address.FromByteArray(secondAddressBytes); Boolean result = firstAddress.Equals(secondAddress); Assert.True(result); Assert.Equal(firstAddress, secondAddress); Byte[] thirdAddressBytes = random.NextBytes(4); IPv4Address thirdAddress = IPv4Address.FromByteArray(thirdAddressBytes); Boolean nonEqualResult = firstAddress.Equals(thirdAddress); Assert.False(nonEqualResult); Assert.NotEqual(firstAddress, thirdAddress); Assert.True(firstAddress == secondAddress); Assert.False(firstAddress != secondAddress); Assert.False(firstAddress == thirdAddress); Assert.True(firstAddress != thirdAddress); }
public static IPv4Address GetIPv4NetworkAddress(this Random random, IPv4SubnetMask mask) { IPv4Address start = random.GetIPv4Address(); Byte[] rawResult = ByteHelper.AndArray(start.GetBytes(), mask.GetBytes()); IPv4Address result = IPv4Address.FromByteArray(rawResult); return(result); }
public static DHCPv4PacketAddressOption FromByteArray(Byte[] data, Int32 offset) { if (data == null || data.Length < offset + 2 + _expectedDataLength) { throw new ArgumentException(nameof(data)); } if (data[offset + 1] != _expectedDataLength) { throw new ArgumentException(nameof(data)); } IPv4Address address = IPv4Address.FromByteArray(data, offset + 2); return(new DHCPv4PacketAddressOption(data[offset], address)); }
public static DHCPv4PacketAddressListOption FromByteArray(Byte[] data, Int32 offset) { if (data == null || data.Length < offset + 4) { throw new ArgumentException(nameof(data)); } Byte length = data[offset + 1]; Int32 addressAmount = length / 4; Int32 index = offset + 2; IPv4Address[] addresses = new IPv4Address[addressAmount]; for (int i = 0; i < addressAmount; i++, index += 4) { IPv4Address address = IPv4Address.FromByteArray(data, index); addresses[i] = address; } return(new DHCPv4PacketAddressListOption(data[offset], addresses)); }
public static DHCPv4PacketRouteListOption FromByteArray(Byte[] data, Int32 offset) { if (data == null || data.Length < offset + 10) { throw new ArgumentException(nameof(data)); } Byte length = data[offset + 1]; Int32 routeAmount = length / 8; Int32 index = offset + 2; IPv4Route[] routes = new IPv4Route[routeAmount]; for (int i = 0; i < routeAmount; i++, index += 8) { IPv4Address network = IPv4Address.FromByteArray(data, index); IPv4SubnetMask mask = IPv4SubnetMask.FromByteArray(data, index + 4); routes[i] = new IPv4Route(network, mask); } return(new DHCPv4PacketRouteListOption(data[offset], routes)); }
public static IPv4Address GetIPv4Address(this Random random) { return(IPv4Address.FromByteArray(random.NextBytes(4))); }
public async Task SeedDatabase(Boolean reset, StorageContext storageContext) { if (reset == true) { { var packets = await storageContext.DHCPv6PacketEntries.AsQueryable().ToListAsync(); var entries = await storageContext.DHCPv6LeaseEntries.AsQueryable().ToListAsync(); storageContext.RemoveRange(packets); storageContext.RemoveRange(entries); } { var packets = await storageContext.DHCPv4PacketEntries.AsQueryable().ToListAsync(); var entries = await storageContext.DHCPv4LeaseEntries.AsQueryable().ToListAsync(); storageContext.RemoveRange(packets); storageContext.RemoveRange(entries); } await storageContext.SaveChangesAsync(); } if (storageContext.DHCPv6PacketEntries.Count() == 0) { DateTime start = DateTime.UtcNow.AddDays(-20); DateTime end = DateTime.UtcNow.AddDays(20); Int32 diff = (Int32)(end - start).TotalMinutes; Random random = new Random(); List <DHCPv6PacketHandledEntryDataModel> dhcpv6PacketEntries = new List <DHCPv6PacketHandledEntryDataModel>(); var requestPacketTypes = new[] { DHCPv6PacketTypes.Solicit, DHCPv6PacketTypes.CONFIRM, DHCPv6PacketTypes.DECLINE, DHCPv6PacketTypes.REBIND, DHCPv6PacketTypes.RELEASE, DHCPv6PacketTypes.RENEW, DHCPv6PacketTypes.REQUEST }; for (int i = 0; i < 30_000; i++) { var request = DHCPv6RelayPacket.AsOuterRelay(new IPv6HeaderInformation(IPv6Address.FromString("fe80::1"), IPv6Address.FromString("fe80::2")), true, 2, IPv6Address.FromString("faf::2"), IPv6Address.FromString("fefc::23"), new DHCPv6PacketOption[] { new DHCPv6PacketRemoteIdentifierOption((UInt32)random.Next(), GetRandomBytes(random)), new DHCPv6PacketByteArrayOption(DHCPv6PacketOptionTypes.InterfaceId, GetRandomBytes(random)), }, DHCPv6RelayPacket.AsInnerRelay(true, 1, IPv6Address.FromString("fe70::2"), IPv6Address.FromString("fecc::23"), new DHCPv6PacketOption[] { new DHCPv6PacketByteArrayOption(DHCPv6PacketOptionTypes.InterfaceId, GetRandomBytes(random)), }, DHCPv6Packet.AsInner( (UInt16)random.Next(0, UInt16.MaxValue), random.NextDouble() > 0.3 ? DHCPv6PacketTypes.Solicit : DHCPv6PacketTypes.RELEASE, new DHCPv6PacketOption[] { new DHCPv6PacketIdentifierOption(DHCPv6PacketOptionTypes.ServerIdentifer, new UUIDDUID(Guid.NewGuid())), new DHCPv6PacketIdentifierOption(DHCPv6PacketOptionTypes.ClientIdentifier, new UUIDDUID(Guid.NewGuid())), new DHCPv6PacketIdentityAssociationNonTemporaryAddressesOption((UInt32)random.Next()), }))); var entry = new DHCPv6PacketHandledEntryDataModel { Id = Guid.NewGuid(), Timestamp = start.AddMinutes(random.Next(0, diff)), ScopeId = Guid.NewGuid(), RequestType = requestPacketTypes[random.Next(0, requestPacketTypes.Length)], RequestSize = request.GetSize(), RequestStream = request.GetAsStream(), RequestDestination = request.Header.Destionation.ToString(), RequestSource = request.Header.Source.ToString(), }; if (random.NextDouble() > 0.8) { entry.FilteredBy = "something"; } else { if (random.NextDouble() > 0.8) { entry.InvalidRequest = true; } else { if (random.NextDouble() > 0.5) { entry.HandledSuccessfully = true; entry.ErrorCode = 0; var response = DHCPv6Packet.AsOuter( new IPv6HeaderInformation(IPv6Address.FromString("fe80::1"), IPv6Address.FromString("fe80::2")), (UInt16)random.Next(0, UInt16.MaxValue), random.NextDouble() > 0.3 ? DHCPv6PacketTypes.REPLY : DHCPv6PacketTypes.ADVERTISE, new DHCPv6PacketOption[] { new DHCPv6PacketIdentifierOption(DHCPv6PacketOptionTypes.ServerIdentifer, new UUIDDUID(Guid.NewGuid())), new DHCPv6PacketIdentifierOption(DHCPv6PacketOptionTypes.ClientIdentifier, new UUIDDUID(Guid.NewGuid())), DHCPv6PacketIdentityAssociationNonTemporaryAddressesOption.AsSuccess( (UInt16)random.Next(0, UInt16.MaxValue), TimeSpan.FromMinutes(random.Next(30, 100)), TimeSpan.FromMinutes(random.Next(30, 100)), IPv6Address.FromString("fe80::100"), TimeSpan.FromMinutes(random.Next(30, 100)), TimeSpan.FromMinutes(random.Next(30, 100))), DHCPv6PacketIdentityAssociationPrefixDelegationOption.AsSuccess((UInt32)random.Next(), TimeSpan.FromMinutes(random.Next(30, 100)), TimeSpan.FromMinutes(random.Next(30, 100)), (Byte)random.Next(30, 68), IPv6Address.FromString("fc:12::0"), TimeSpan.FromMinutes(random.Next(30, 100)), TimeSpan.FromMinutes(random.Next(30, 100))), new DHCPv6PacketBooleanOption(DHCPv6PacketOptionTypes.Auth, random.NextDouble() > 0.5), new DHCPv6PacketByteOption(DHCPv6PacketOptionTypes.Preference, (Byte)random.Next(0, 256)), new DHCPv6PacketTrueOption(DHCPv6PacketOptionTypes.RapitCommit), new DHCPv6PacketIPAddressOption(DHCPv6PacketOptionTypes.ServerUnicast, IPv6Address.FromString("fd::1")), new DHCPv6PacketIPAddressListOption(48, new [] { IPv6Address.FromString("2001::1"), IPv6Address.FromString("2001::1") }), }); entry.ResponseDestination = response.Header.Destionation.ToString(); entry.ResponseSource = response.Header.Source.ToString(); entry.ResponseStream = response.GetAsStream(); entry.ResponseSize = response.GetSize(); entry.ResponseType = random.NextDouble() > 0.3 ? DHCPv6PacketTypes.REPLY : DHCPv6PacketTypes.ADVERTISE; } else { entry.HandledSuccessfully = false; entry.ErrorCode = random.Next(0, 5); } } } entry.SetTimestampDates(); dhcpv6PacketEntries.Add(entry); } List <DHCPv4PacketHandledEntryDataModel> dhcpv4PacketEntries = new(); var requestDHCPv4PacketTypes = new[] { DHCPv4MessagesTypes.Discover, DHCPv4MessagesTypes.Decline, DHCPv4MessagesTypes.Inform, DHCPv4MessagesTypes.Release, DHCPv4MessagesTypes.Request }; for (int i = 0; i < 30_000; i++) { var hwAddress = new Byte[6]; random.NextBytes(hwAddress); var option82Value = new Byte[30]; random.NextBytes(option82Value); var request = new DHCPv4Packet(new IPv4HeaderInformation(IPv4Address.FromString("192.168.0.1"), IPv4Address.FromString("10.10.10.10")), hwAddress, (UInt32)random.Next(), IPv4Address.FromString("0.0.0.0"), IPv4Address.FromString("192.168.0.5"), IPv4Address.FromString("0.0.0.0"), DHCPv4PacketFlags.Unicast, new DHCPv4PacketParameterRequestListOption(new DHCPv4OptionTypes[] { DHCPv4OptionTypes.NetworkTimeProtocolServers, DHCPv4OptionTypes.DNSServers, DHCPv4OptionTypes.Router, DHCPv4OptionTypes.DomainName }), new DHCPv4PacketRawByteOption((Byte)DHCPv4OptionTypes.Option82, option82Value) ); var entry = new DHCPv4PacketHandledEntryDataModel { Id = Guid.NewGuid(), Timestamp = start.AddMinutes(random.Next(0, diff)), ScopeId = Guid.NewGuid(), RequestType = requestDHCPv4PacketTypes[random.Next(0, requestDHCPv4PacketTypes.Length)], RequestSize = request.GetSize(), RequestStream = request.GetAsStream(), RequestDestination = request.Header.Destionation.ToString(), RequestSource = request.Header.Source.ToString(), }; if (random.NextDouble() > 0.8) { entry.FilteredBy = "something"; } else { if (random.NextDouble() > 0.8) { entry.InvalidRequest = true; } else { if (random.NextDouble() > 0.5) { entry.HandledSuccessfully = true; entry.ErrorCode = 0; var response = new DHCPv4Packet(new IPv4HeaderInformation(IPv4Address.FromString("10.10.10.10"), IPv4Address.FromString("192.168.0.1")), hwAddress, (UInt32)random.Next(), IPv4Address.FromString("0.0.0.0"), IPv4Address.FromString("192.168.0.5"), IPv4Address.FromString("192.168.0.15"), DHCPv4PacketFlags.Unicast, new DHCPv4PacketAddressListOption(DHCPv4OptionTypes.DNSServers, new[] { IPv4Address.FromString("1.1.1.1"), IPv4Address.FromString("8.8.8.8") }), new DHCPv4PacketAddressOption(DHCPv4OptionTypes.Router, IPv4Address.FromString("192.168.0.253")) ); entry.ResponseDestination = response.Header.Destionation.ToString(); entry.ResponseSource = response.Header.Source.ToString(); entry.ResponseStream = response.GetAsStream(); entry.ResponseSize = response.GetSize(); entry.ResponseType = random.NextDouble() > 0.3 ? DHCPv4MessagesTypes.Offer : DHCPv4MessagesTypes.Acknowledge; } else { entry.HandledSuccessfully = false; entry.ErrorCode = random.Next(0, 5); } } } entry.SetTimestampDates(); dhcpv4PacketEntries.Add(entry); } List <DHCPv6LeaseEntryDataModel> dhcpv6LeaseEntries = new List <DHCPv6LeaseEntryDataModel>(); for (int i = 0; i < 30_000; i++) { Byte[] addressBytes = new byte[16]; Byte[] prefixBytes = new byte[16]; random.NextBytes(addressBytes); random.NextBytes(prefixBytes); DHCPv6LeaseEntryDataModel entryDataModel = new DHCPv6LeaseEntryDataModel { Id = Guid.NewGuid(), Timestamp = start.AddMinutes(random.Next(0, diff)), LeaseId = Guid.NewGuid(), Address = IPv6Address.FromByteArray(addressBytes).ToString(), EndReason = StatisticsControllerResponses.V1.ReasonToEndLease.Nothing, ScopeId = Guid.NewGuid(), Start = start.AddMinutes(random.Next(0, diff - 50)), }; Int32 leaseDiff = (Int32)(end.AddDays(4) - entryDataModel.Start).TotalMinutes; entryDataModel.End = entryDataModel.Start.AddMinutes(random.Next(10, leaseDiff)); TimeSpan lifetime = entryDataModel.End - entryDataModel.Start; TimeSpan renewalTime = lifetime / 2; TimeSpan rebindingTime = lifetime * (2.0 / 3.0); entryDataModel.EndOfRenewalTime = entryDataModel.Start + renewalTime; entryDataModel.EndOfPreferredLifetime = entryDataModel.Start + rebindingTime; if (random.NextDouble() > 0.5) { entryDataModel.Prefix = IPv6Address.FromByteArray(prefixBytes).ToString(); entryDataModel.PrefixLength = (Byte)random.Next(48, 76); } dhcpv6LeaseEntries.Add(entryDataModel); } List <DHCPv4LeaseEntryDataModel> dhcpv4LeaseEntries = new(); for (int i = 0; i < 30_000; i++) { Byte[] addressBytes = new byte[4]; random.NextBytes(addressBytes); DHCPv4LeaseEntryDataModel entryDataModel = new DHCPv4LeaseEntryDataModel { Id = Guid.NewGuid(), Timestamp = start.AddMinutes(random.Next(0, diff)), LeaseId = Guid.NewGuid(), Address = IPv4Address.FromByteArray(addressBytes).ToString(), EndReason = StatisticsControllerResponses.V1.ReasonToEndLease.Nothing, ScopeId = Guid.NewGuid(), Start = start.AddMinutes(random.Next(0, diff - 50)), }; Int32 leaseDiff = (Int32)(end.AddDays(4) - entryDataModel.Start).TotalMinutes; entryDataModel.End = entryDataModel.Start.AddMinutes(random.Next(10, leaseDiff)); TimeSpan lifetime = entryDataModel.End - entryDataModel.Start; TimeSpan renewalTime = lifetime / 2; TimeSpan rebindingTime = lifetime * (2.0 / 3.0); entryDataModel.EndOfRenewalTime = entryDataModel.Start + renewalTime; entryDataModel.EndOfPreferredLifetime = entryDataModel.Start + rebindingTime; dhcpv4LeaseEntries.Add(entryDataModel); } storageContext.AddRange(dhcpv6PacketEntries); storageContext.AddRange(dhcpv6LeaseEntries); storageContext.AddRange(dhcpv4PacketEntries); storageContext.AddRange(dhcpv4LeaseEntries); storageContext.SaveChanges(); } }