コード例 #1
0
        private void AnalyzeICMP(TrafficDescriptionFrame tdf)
        {
            IPFrame ipFrame = GetIPv6Frame(tdf);
            NeighborAdvertisment icmpNeighborAdvertisment = (NeighborAdvertisment)GetFrameByType(tdf, NeighborAdvertisment.DefaultFrameType);
            NeighborSolicitation icmpNeighborSolicitation = (NeighborSolicitation)GetFrameByType(tdf, NeighborSolicitation.DefaultFrameType);

            if (ipFrame != null && icmpNeighborAdvertisment != null && icmpNeighborAdvertisment.EncapsulatedFrame != null)
            {
                NeighborDiscoveryOption ndOption = (NeighborDiscoveryOption)GetFrameByType(icmpNeighborAdvertisment, NeighborDiscoveryOption.DefaultFrameType);
                if (ndOption.OptionData != null && ndOption.OptionType == NeighborDiscoveryOptionType.TargetLinkLayerAddress)
                {
                    MACAddress macTarget = new MACAddress(ndOption.OptionData);
                    if (!UsesSpoofedAddress(macTarget))
                    {
                        if (!(arpHostTable.Contains(icmpNeighborAdvertisment.TargetAddress) && !icmpNeighborAdvertisment.OverrideFlag))
                        {
                            UpdateAddressTable(macTarget, icmpNeighborAdvertisment.TargetAddress);
                        }
                    }
                }
            }
            else if (ipFrame != null && icmpNeighborSolicitation != null && icmpNeighborSolicitation.EncapsulatedFrame != null)
            {
                NeighborDiscoveryOption ndOption = (NeighborDiscoveryOption)GetFrameByType(icmpNeighborSolicitation, NeighborDiscoveryOption.DefaultFrameType);
                if (ndOption.OptionData != null && ndOption.OptionType == NeighborDiscoveryOptionType.SourceLinkLayerAddress)
                {
                    MACAddress macTarget = new MACAddress(ndOption.OptionData);
                    if (!UsesSpoofedAddress(macTarget))
                    {
                        UpdateAddressTable(macTarget, ipFrame.SourceAddress);
                    }
                }
            }
        }
コード例 #2
0
        private void SendICMPNeighborAdvertisment(IPAddress ipaDestination, IPAddress ipaSource)
        {
            if (ipaDestination.AddressFamily != System.Net.Sockets.AddressFamily.InterNetworkV6)
            {
                throw new InvalidOperationException("Cannot send an ICMP Neighbor Advertisement for a non IPv6 address.");
            }

            ICMPv6Frame icmpFrame = new ICMPv6Frame();

            icmpFrame.ICMPv6Type = ICMPv6Type.NeighborAdvertisement;
            icmpFrame.ICMPCode   = 0;

            NeighborAdvertisment icmpDiscoveryMessage = new NeighborAdvertisment();

            icmpDiscoveryMessage.SolicitedFlag = true;
            icmpDiscoveryMessage.OverrideFlag  = true;
            icmpDiscoveryMessage.TargetAddress = ipaSource;

            NeighborDiscoveryOption icmpDiscoveryOption = new NeighborDiscoveryOption();

            icmpDiscoveryOption.OptionType = ICMP.V6.NeighborDiscoveryOptionType.TargetLinkLayerAddress;
            icmpDiscoveryOption.OptionData = this.PrimaryMACAddress.AddressBytes;

            IPv6Frame ipFrame = new IPv6Frame();

            ipFrame.SourceAddress      = ipaSource;
            ipFrame.DestinationAddress = ipaDestination;
            ipFrame.NextHeader         = IPProtocol.IPv6_ICMP;

            ipFrame.EncapsulatedFrame              = icmpFrame;
            icmpFrame.EncapsulatedFrame            = icmpDiscoveryMessage;
            icmpDiscoveryMessage.EncapsulatedFrame = icmpDiscoveryOption;

            icmpFrame.Checksum = icmpFrame.CalculateChecksum(ipFrame.GetPseudoHeader());

            this.Send(ipFrame, ipaDestination);
        }