/// <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); }
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]; } } }