示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
        //[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);
            }
        }
示例#4
0
        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));
            }
        }