//adding ARP log private void handlerARP(Packet packet) { byte[] senderMACbyte = packet.Ethernet.Arp.SenderHardwareAddress.ToArray(); String senderMAC = (BitConverter.ToString(senderMACbyte)).Replace("-", ":"); byte[] senderIPbyte = packet.Ethernet.Arp.SenderProtocolAddress.ToArray(); String senderIP = "" + senderIPbyte[0] + "." + senderIPbyte[1] + "." + senderIPbyte[2] + "." + senderIPbyte[3]; logARP log = new logARP(senderIP, senderMAC, timeARP); int key = log.accessMAC.GetHashCode(); if (hashARP[key] == null) { addARPline(log); hashARP.Add(key, log); listMAC.Add(log.accessMAC); } else { logARP actual = (logARP)hashARP[key]; actual.accessIP = senderIP; actual.accessMAC = senderMAC; actual.accessTTL = timeARP; } String targetMAC = PcapDotNet.Core.Extensions.LivePacketDeviceExtensions.GetMacAddress(allDevices[DEV0]).ToString(); byte[] targetMACbyte = targetMAC.Split(':').Select(x => Convert.ToByte(x, 16)).ToArray(); String targetIP = textboxIP1.Text.ToString(); byte[] targetIPbyte = targetIP.Split('.').Select(x => Convert.ToByte(x, 10)).ToArray(); byte[] tempIPbyte = packet.Ethernet.Arp.TargetProtocolAddress.ToArray(); String tempIP = "" + tempIPbyte[0] + "." + tempIPbyte[1] + "." + tempIPbyte[2] + "." + tempIPbyte[3]; if (textboxIP1.Text.Equals(tempIP.ToString())) { if (packet.Ethernet.Arp.Operation.ToString().Equals("Request")) { Packet replyPacket = PacketBuilder.Build( DateTime.Now, new EthernetLayer { Source = new MacAddress(targetMAC), Destination = new MacAddress(senderMAC), EtherType = EthernetType.Arp }, new ArpLayer { ProtocolType = EthernetType.IpV4, Operation = ArpOperation.Reply, SenderHardwareAddress = targetMACbyte.AsReadOnly(), SenderProtocolAddress = targetIPbyte.AsReadOnly(), TargetHardwareAddress = senderMACbyte.AsReadOnly(), TargetProtocolAddress = senderIPbyte.AsReadOnly(), }); dev0.SendPacket(replyPacket); } } }
//adding ARPlog to ARP GUI table private void addARPline(logARP log) { ListViewItem lineARP = new ListViewItem(log.accessIP);//adding to GUI table lineARP.SubItems.Add(log.accessMAC.ToString()); lineARP.SubItems.Add(log.accessTTL.ToString()); Invoke(new MethodInvoker(delegate() { tableARP.Items.Add(lineARP); })); }
//Function: Return the ARP log of current destination mathich nexthop private logARP lookupARP(String nexthop) { foreach (String actual in listMAC) { logARP log = (logARP)hashARP[actual.GetHashCode()]; if (log.accessIP.Equals(nexthop)) { return(log); } } return(null); }
public void periodARP(Object source, ElapsedEventArgs e) { for (int i = listMAC.Count - 1; i >= 0; i--) { logARP log = (logARP)hashARP[listMAC[i].GetHashCode()]; if (log.accessTTL > 1) { log.reduce(); } else { lock (hashARP) { hashARP.Remove(listMAC[i].GetHashCode()); } lock (listMAC) { listMAC.RemoveAt(i); }; } } }
private void pinger() { Route route = findNexthopRoute(textboxARPtarget.Text); logARP log = null; if (route.Nexthop.Equals("directly connected")) { log = lookupARP(textboxARPtarget.Text); } else { log = lookupARP(route.Nexthop); } if (log == null) { requestARP(); } Thread.Sleep(10); if (route.Nexthop.Equals("directly connected")) { log = lookupARP(textboxARPtarget.Text); } else { log = lookupARP(route.Nexthop); } try { ping.Request(dev0, myMAC1.ToString(), log.accessMAC, textboxIP1.Text, log.accessIP); } catch (Exception delay) { } }