Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 public PendingRequest(IPv4 address,
                       ArpRequestCallback callback,
                       object cookie,
                       DateTime expiry)
 {
     this.address  = address;
     this.callback = callback;
     this.cookie   = cookie;
     this.expiry   = expiry;
 }
Ejemplo n.º 3
0
        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
                    );
            }
        }