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);
                    }
                }
            }
        }
        private void HandleICMP(EthernetFrame fFrame)
        {
            IPFrame ipFrame = GetIPFrame(fFrame);
            NeighborSolicitation icmpNeighborSolicitation = (NeighborSolicitation)GetFrameByType(fFrame, NeighborSolicitation.DefaultFrameType);

            if (ipFrame != null && icmpNeighborSolicitation != null)
            {
                if (this.ContainsAddress(icmpNeighborSolicitation.TargetAddress))
                {
                    SendICMPNeighborAdvertisment(ipFrame.SourceAddress, icmpNeighborSolicitation.TargetAddress);
                }
            }
        }
        private void SendICMPNeighborSolicitation(IPAddress ipaQuery, IPAddress ipaSource)
        {
            if (ipaQuery.AddressFamily != System.Net.Sockets.AddressFamily.InterNetworkV6)
            {
                throw new InvalidOperationException("Cannot send an ICMP Neighbor Solicitation for a non IPv6 address.");
            }

            ICMPv6Frame icmpFrame = new ICMPv6Frame();

            icmpFrame.ICMPv6Type = ICMPv6Type.NeighborSolicitation;
            icmpFrame.ICMPCode   = 0;

            NeighborSolicitation icmpDiscoveryMessage = new NeighborSolicitation();

            icmpDiscoveryMessage.TargetAddress = ipaQuery;

            NeighborDiscoveryOption icmpDiscoveryOption = new NeighborDiscoveryOption();

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

            IPv6Frame ipFrame = new IPv6Frame();

            ipFrame.SourceAddress      = ipaSource;
            ipFrame.DestinationAddress = IPAddressAnalysis.GetSolicitedNodeMulticastAddress(ipaQuery);
            ipFrame.NextHeader         = IPProtocol.IPv6_ICMP;

            EthernetFrame ethFrame = new EthernetFrame();

            ethFrame.Destination = MACAddress.MulticastFromIPv6Address(ipaQuery);
            ethFrame.Source      = PrimaryMACAddress;
            ethFrame.EtherType   = EtherType.IPv6;

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

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

            this.Send(ethFrame);
        }