예제 #1
0
        /// <summary>
        /// Lookup IP in ARP
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="DestMac"></param>
        /// <returns></returns>
        public static unsafe bool Lookup(byte[] IP, byte *DestMac)
        {
            // Broadcast?
            if (IP[0] == 0xFF && IP[1] == 0xFF && IP[2] == 0xFF && IP[3] == 0xFF)
            {
                if (DestMac != null)
                {
                    Memory.Memset(DestMac, 0xFF, 6);
                }

                return(true);
            }
            else
            {
                ARPEntry *entry = GetEntry(IP);

                if (entry != null)
                {
                    if (DestMac != null)
                    {
                        Memory.Memcpy(DestMac, entry->MAC, 6);
                    }

                    return(true);
                }
            }

            return(false);
        }
예제 #2
0
        public static unsafe void FindOrAdd(byte[] srcIP, byte[] srcHW)
        {
            ARPEntry *entry = GetEntry(srcIP);

            if (entry == null)
            {
                // Add entry

                fixed(byte *ip = m_arpTable[m_offset].IP)
                {
                    for (int i = 0; i < 4; i++)
                    {
                        ip[i] = srcIP[i];
                    }
                }

                fixed(byte *mac = m_arpTable[m_offset].MAC)
                {
                    for (int i = 0; i < 6; i++)
                    {
                        mac[i] = srcHW[i];
                    }
                }

                m_offset++;
            }
            else
            {
                for (int i = 0; i < 6; i++)
                {
                    entry->MAC[i] = srcHW[i];
                }
            }
        }