public void ArpRequest(IPv4 sourceIP, IPv4 targetIP, Multiplexer !targetMux, ArpRequestCallback callback, object cookie, TimeSpan timeout) { // //XXXX Check pending request does not already exist! // EthernetAddress localMac = targetMux.Adapter.HardwareAddress; AddPendingRequest(targetIP, callback, cookie, timeout); // initiate an arp request... DebugPrint("Initiating request " + "({0},{1}) --> ({2},{3})\n", sourceIP, localMac, targetIP, EthernetAddress.Zero); byte[] data = new byte[ArpFormat.Size + EthernetFormat.Size]; int pos = EthernetFormat.Write(data, 0, localMac, EthernetAddress.Broadcast, EthernetFormat.PROTOCOL_ARP); ArpFormat.Write(data, pos, localMac, sourceIP, ArpFormat.Type.ARP_REQUEST, EthernetAddress.Zero, targetIP); NetPacket pkt = new NetPacket(data); pkt.Mux = targetMux; OnProtocolSend(pkt); }
public PendingRequest(IPv4 address, ArpRequestCallback callback, object cookie, DateTime expiry) { this.address = address; this.callback = callback; this.cookie = cookie; this.expiry = expiry; }
private void AddPendingRequest(IPv4 address, ArpRequestCallback callback, object cookie, TimeSpan timeout) { DateTime expiry = DateTime.UtcNow + timeout; pendingRequests.Add( new PendingRequest(address, callback, cookie, expiry) ); if (pendingRequests.Count == 1) { DateTime nextPoll = DateTime.UtcNow + PollPeriod; Core.Instance().TheDispatcher.AddCallback( new Dispatcher.Callback(OnRequestTimeout), new TimeoutArgument(nextPoll), (ulong)nextPoll.Ticks ); } }