public Task <Boolean> ShouldPacketBeFiltered(DHCPv6Packet packet) { _logger.LogDebug("ShouldPacketBeFilterd"); if (packet.GetInnerPacket().IsClientRequest() == false) { return(Task.FromResult(true)); } Boolean result = packet.IsConsistent(); return(Task.FromResult(!result)); }
public Task <Boolean> ShouldPacketBeFiltered(DHCPv6Packet packet) { _logger.LogDebug("ShouldPacketBeFiltered"); DHCPv6Packet innerPacket = packet.GetInnerPacket(); Boolean couldHaveDuid = innerPacket.CouldHaveDuid(); if (couldHaveDuid == false && innerPacket.ShouldHaveDuid() == false) { return(Task.FromResult(false)); } DUID packetServerDuid = innerPacket.GetIdentifier(DHCPv6PacketOptionTypes.ServerIdentifer); if (couldHaveDuid == true && packetServerDuid == DUID.Empty) { return(Task.FromResult(false)); } Boolean result = packetServerDuid != _serverDuid; return(Task.FromResult(result)); }
//[Fact] public async Task SendAndReceive() { Random random = new Random(); String dbName = $"mydb-{random.Next()}"; String prefix = random.GetAlphanumericString(); try { UInt32 enterpriseNumber = (UInt32)random.Next(); StorageContext initicalContext = DatabaseTestingUtility.GetTestDatabaseContext(dbName); await initicalContext.Database.MigrateAsync(); await initicalContext.SaveInitialServerConfiguration(new DHCPv6ServerProperties { ServerDuid = new UUIDDUID(new Guid()) }); initicalContext.Dispose(); IPv6Address expectedAdress = IPv6Address.FromString("fe80::0"); var services = new ServiceCollection(); services.AddScoped <ServiceFactory>(p => p.GetService); services.AddSingleton <DHCPv6RootScope>(sp => { var storageEngine = sp.GetRequiredService <IDHCPv6StorageEngine>(); var scope = storageEngine.GetRootScope().GetAwaiter().GetResult(); return(scope); }); services.AddTransient <IDHCPv6ServerPropertiesResolver, DatabaseDHCPv6ServerPropertiesResolver>(); services.AddSingleton <ISerializer, JSONBasedSerializer>(); services.AddSingleton <IScopeResolverManager <DHCPv6Packet, IPv6Address>, DHCPv6ScopeResolverManager>(); services.AddSingleton <IServiceBus, MediaRBasedServiceBus>(); services.AddSingleton <IDHCPv6PacketFilterEngine, SimpleDHCPv6PacketFilterEngine>(); services.AddSingleton <IDHCPv6InterfaceEngine, DHCPv6InterfaceEngine>(); services.AddSingleton <IDHCPv6LeaseEngine, DHCPv6LeaseEngine>(); services.AddSingleton <IDHCPv6StorageEngine, DHCPv6StorageEngine>(); services.AddSingleton <IDHCPv6ReadStore, StorageContext>(); services.AddSingleton(new EventStoreBasedStoreConnenctionOptions(new EventStoreClient(EventStoreClientSettings.Create("esdb://127.0.0.1:2113?tls=false")), prefix)); services.AddSingleton <IDHCPv6EventStore, EventStoreBasedStore>(); services.AddSingleton(DatabaseTestingUtility.GetTestDbContextOptions(dbName)); services.AddTransient <INotificationHandler <DHCPv6PacketArrivedMessage> >(sp => new DHCPv6PacketArrivedMessageHandler( sp.GetRequiredService <IServiceBus>(), sp.GetRequiredService <IDHCPv6PacketFilterEngine>(), sp.GetService <ILogger <DHCPv6PacketArrivedMessageHandler> >())); services.AddTransient <INotificationHandler <ValidDHCPv6PacketArrivedMessage> >(sp => new ValidDHCPv6PacketArrivedMessageHandler( sp.GetRequiredService <IServiceBus>(), sp.GetRequiredService <IDHCPv6LeaseEngine>(), sp.GetService <ILogger <ValidDHCPv6PacketArrivedMessageHandler> >())); services.AddTransient <INotificationHandler <DHCPv6PacketReadyToSendMessage> >(sp => new DHCPv6PacketReadyToSendMessageHandler( sp.GetRequiredService <IDHCPv6InterfaceEngine>(), sp.GetService <ILogger <DHCPv6PacketReadyToSendMessageHandler> >())); services.AddTransient <DHCPv6RateLimitBasedFilter>(); services.AddTransient <DHCPv6PacketConsistencyFilter>(); services.AddTransient <DHCPv6PacketServerIdentifierFilter>((sp) => new DHCPv6PacketServerIdentifierFilter( new UUIDDUID(new Guid()), sp.GetService <ILogger <DHCPv6PacketServerIdentifierFilter> >())); services.AddLogging(); var provider = services.BuildServiceProvider(); DHCPv6RootScope initialRootScope = provider.GetService <DHCPv6RootScope>(); initialRootScope.AddScope(new DHCPv6ScopeCreateInstruction { AddressProperties = new DHCPv6ScopeAddressProperties( IPv6Address.FromString("fe80::0"), IPv6Address.FromString("fe80::ff"), new List <IPv6Address> { IPv6Address.FromString("fe80::1") }, preferredLifeTime: TimeSpan.FromDays(0.5), validLifeTime: TimeSpan.FromDays(1), rapitCommitEnabled: true, informsAreAllowd: true, supportDirectUnicast: true, reuseAddressIfPossible: false, acceptDecline: true, t1: DHCPv6TimeScale.FromDouble(0.6), t2: DHCPv6TimeScale.FromDouble(0.8), addressAllocationStrategy: DHCPv6ScopeAddressProperties.AddressAllocationStrategies.Next), ScopeProperties = DHCPv6ScopeProperties.Empty, ResolverInformation = new CreateScopeResolverInformation { Typename = nameof(DHCPv6RemoteIdentifierEnterpriseNumberResolver), PropertiesAndValues = new Dictionary <String, String> { { nameof(DHCPv6RemoteIdentifierEnterpriseNumberResolver.EnterpriseNumber), enterpriseNumber.ToString() }, { nameof(DHCPv6RemoteIdentifierEnterpriseNumberResolver.RelayAgentIndex), 0.ToString() }, } }, Name = "Testscope", Id = Guid.NewGuid(), }); IDHCPv6PacketFilterEngine packetFilterEngine = provider.GetService <IDHCPv6PacketFilterEngine>(); packetFilterEngine.AddFilter(provider.GetService <DHCPv6RateLimitBasedFilter>()); packetFilterEngine.AddFilter(provider.GetService <DHCPv6PacketConsistencyFilter>()); packetFilterEngine.AddFilter(provider.GetService <DHCPv6PacketServerIdentifierFilter>()); IDHCPv6InterfaceEngine interfaceEngine = provider.GetService <IDHCPv6InterfaceEngine>(); var possibleListener = interfaceEngine.GetPossibleListeners(); var listener = possibleListener.First(); interfaceEngine.OpenListener(listener); IPAddress address = new IPAddress(listener.Address.GetBytes()); IPEndPoint ownEndPoint = new IPEndPoint(address, 546); IPEndPoint serverEndPoint = new IPEndPoint(address, 547); UdpClient client = new UdpClient(ownEndPoint); DHCPv6Packet packet = DHCPv6Packet.AsInner(14, DHCPv6PacketTypes.Solicit, new List <DHCPv6PacketOption> { new DHCPv6PacketTrueOption(DHCPv6PacketOptionTypes.RapitCommit), new DHCPv6PacketIdentifierOption(DHCPv6PacketOptionTypes.ClientIdentifier, new UUIDDUID(Guid.NewGuid())), new DHCPv6PacketIdentityAssociationNonTemporaryAddressesOption(15, TimeSpan.Zero, TimeSpan.Zero, new List <DHCPv6PacketSuboption>()), }); DHCPv6RelayPacket outerPacket = DHCPv6RelayPacket.AsOuterRelay(new IPv6HeaderInformation(listener.Address, listener.Address), true, 0, IPv6Address.FromString("fe80::2"), IPv6Address.FromString("fe80::2"), new DHCPv6PacketOption[] { new DHCPv6PacketRemoteIdentifierOption(enterpriseNumber, new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }), }, packet); byte[] packetStream = outerPacket.GetAsStream(); await client.SendAsync(packetStream, packetStream.Length, serverEndPoint); await Task.Delay(2000); var content = await client.ReceiveAsync(); Byte[] receivedBytes = content.Buffer; DHCPv6Packet response = DHCPv6Packet.FromByteArray(receivedBytes, new IPv6HeaderInformation(listener.Address, listener.Address)); var iaOption = response.GetInnerPacket().GetNonTemporaryIdentiyAssocation(15); Assert.NotNull(iaOption); Assert.Single(iaOption.Suboptions); Assert.IsAssignableFrom <DHCPv6PacketIdentityAssociationAddressSuboption>(iaOption.Suboptions.First()); Assert.Equal(expectedAdress, ((DHCPv6PacketIdentityAssociationAddressSuboption)iaOption.Suboptions.First()).Address); } finally { await DatabaseTestingUtility.DeleteDatabase(dbName); await EventStoreClientDisposer.CleanUp(prefix, null); } }
protected static void CheckErrorPacket(DHCPv6Packet request, IPv6Address expectedAdress, UInt32 iaId, DHCPv6Packet response, DHCPv6PrefixDelegation prefixDelegation, DHCPv6StatusCodes expectedStatusCode) { Assert.NotNull(response); Assert.NotEqual(DHCPv6Packet.Empty, response); Assert.True(response.IsValid); Assert.Equal(DHCPv6PacketTypes.REPLY, response.GetInnerPacket().PacketType); CheckIfPacketIsCorrectReply(request, response); if (iaId != 0) { var iaOption = response.GetInnerPacket().GetNonTemporaryIdentiyAssocation(iaId); Assert.NotNull(iaOption); Assert.Equal(TimeSpan.Zero, iaOption.T1); Assert.Equal(TimeSpan.Zero, iaOption.T2); var uncastedSuboption = iaOption.Suboptions.First(); Assert.NotNull(uncastedSuboption); Assert.IsAssignableFrom <DHCPv6PacketIdentityAssociationAddressSuboption>(uncastedSuboption); var addressSubOption = (DHCPv6PacketIdentityAssociationAddressSuboption)uncastedSuboption; Assert.Equal(expectedAdress, addressSubOption.Address); Assert.Equal(TimeSpan.Zero, addressSubOption.PreferredLifetime); Assert.Equal(TimeSpan.Zero, addressSubOption.ValidLifetime); Assert.NotEmpty(addressSubOption.Suboptions); Assert.Single(addressSubOption.Suboptions); var uncastedSubSuboption = addressSubOption.Suboptions.First(); Assert.NotNull(uncastedSubSuboption); Assert.IsAssignableFrom <DHCPv6PacketStatusCodeSuboption>(uncastedSubSuboption); var statusSubOption = (DHCPv6PacketStatusCodeSuboption)uncastedSubSuboption; Assert.Equal((UInt16)expectedStatusCode, statusSubOption.StatusCode); //Assert.False(String.IsNullOrEmpty(statusSubOption.Message)); } if (prefixDelegation != DHCPv6PrefixDelegation.None) { var iaOption = response.GetInnerPacket().GetPrefixDelegationIdentiyAssocation(prefixDelegation.IdentityAssociation); Assert.NotNull(iaOption); Assert.Equal(prefixDelegation.IdentityAssociation, iaOption.Id); Assert.Equal(TimeSpan.Zero, iaOption.T1); Assert.Equal(TimeSpan.Zero, iaOption.T2); Assert.NotEmpty(iaOption.Suboptions); Assert.Single(iaOption.Suboptions); var uncastedSuboption = iaOption.Suboptions.First(); Assert.NotNull(uncastedSuboption); Assert.IsAssignableFrom <DHCPv6PacketIdentityAssociationPrefixDelegationSuboption>(uncastedSuboption); var addressSubOption = (DHCPv6PacketIdentityAssociationPrefixDelegationSuboption)uncastedSuboption; Assert.Equal(prefixDelegation.Mask.Identifier, addressSubOption.PrefixLength); Assert.NotEmpty(addressSubOption.Suboptions); Assert.Single(addressSubOption.Suboptions); Assert.Equal(TimeSpan.Zero, addressSubOption.PreferredLifetime); Assert.Equal(TimeSpan.Zero, addressSubOption.ValidLifetime); var uncastedSubSuboption = addressSubOption.Suboptions.First(); Assert.NotNull(uncastedSubSuboption); Assert.IsAssignableFrom <DHCPv6PacketStatusCodeSuboption>(uncastedSubSuboption); var statusSubOption = (DHCPv6PacketStatusCodeSuboption)uncastedSubSuboption; Assert.Equal((UInt16)(expectedStatusCode == DHCPv6StatusCodes.NoAddrsAvail ? DHCPv6StatusCodes.NoPrefixAvail : expectedStatusCode), statusSubOption.StatusCode); //Assert.False(String.IsNullOrEmpty(statusSubOption.Message)); } }