示例#1
0
        public void ConstructPacket_MultipleRelayPackets()
        {
            IPv6HeaderInformation header = new IPv6HeaderInformation(IPv6Address.FromString("fe80::1"), IPv6Address.FromString("fe80::2"));

            Int32 depth = 10;

            DHCPv6Packet receivedInnerPacket = DHCPv6Packet.AsInner(1, DHCPv6PacketTypes.Solicit, Array.Empty <DHCPv6PacketOption>());
            DHCPv6Packet innerPacket         = receivedInnerPacket;

            List <IPv6Address> expectedLinkAddresses = new List <IPv6Address>();

            for (int i = 0; i < depth; i++)
            {
                IPv6Address linkAddress = IPv6Address.FromString($"fe{i}::1");

                DHCPv6RelayPacket outerPacket = DHCPv6RelayPacket.AsInnerRelay(
                    true, 1,
                    linkAddress, IPv6Address.FromString($"fe{i}::2"),
                    Array.Empty <DHCPv6PacketOption>(),
                    innerPacket);

                innerPacket = outerPacket;
                expectedLinkAddresses.Insert(0, linkAddress);
            }

            DHCPv6RelayPacket inputPacket = DHCPv6RelayPacket.AsOuterRelay(
                header,
                true, 1,
                IPv6Address.FromString("ff70::1"), IPv6Address.FromString("fe80::2"),
                Array.Empty <DHCPv6PacketOption>(),
                innerPacket);

            expectedLinkAddresses.Insert(0, IPv6Address.FromString("ff70::1"));


            DHCPv6Packet sendInnerPacket = DHCPv6Packet.AsInner(1, DHCPv6PacketTypes.ADVERTISE, Array.Empty <DHCPv6PacketOption>());

            DHCPv6Packet packet = DHCPv6Packet.ConstructPacket(inputPacket, sendInnerPacket);

            Assert.IsAssignableFrom <DHCPv6RelayPacket>(packet);

            DHCPv6RelayPacket relayPacket = (DHCPv6RelayPacket)packet;

            DHCPv6Packet innerUsedPacket = relayPacket.GetInnerPacket();

            Assert.Equal(sendInnerPacket, innerUsedPacket);

            for (int i = 0; i < expectedLinkAddresses.Count; i++)
            {
                DHCPv6RelayPacket innerRelayPacket = GetInnerRelayPacket(relayPacket, i);
                Assert.Equal(innerRelayPacket.LinkAddress, expectedLinkAddresses[i]);
                Assert.Equal((Byte)(expectedLinkAddresses.Count - i - 1), innerRelayPacket.HopCount);
            }
        }