Exemple #1
0
 public void PushPacket(Bytes packet)
 {
     DebugPrint("Pushing packet\n");
     using (thisLock.Lock()) {
         byteCount += packet.Length;
         VectorQueueByte incomingPacketQueue = packetContainer.Acquire();
         incomingPacketQueue.AddTail(packet);
         packetContainer.Release(incomingPacketQueue);
     }
 }
Exemple #2
0
        private AutoResetEvent AddPendingRequest(IPv4 address,
                                                 TimeSpan timeout,
                                                 EthernetAddress localMac,
                                                 Bytes header,
                                                 Bytes buffer,
                                                 IAdapter adapter
                                                 )
        {
            PendingArpRequest pendingRequest = (PendingArpRequest)pendingRequestsFreelist.Dequeue();

            VTable.Assert(pendingRequest != null);
            pendingRequest.address  = address;
            pendingRequest.active   = true;
            pendingRequest.localMac = localMac;
            pendingRequest.adapter  = adapter;
            VectorQueueByte txBuffer = pendingRequest.txContainer.Acquire();

            txBuffer.AddTail(header);
            txBuffer.AddTail(buffer);
            pendingRequest.txContainer.Release(txBuffer);

            using (pendingRequestsLock.Lock()) {
                pendingRequests.Enqueue(pendingRequest);
            }

            SchedulerTime expiration = SchedulerTime.Now;

            expiration = expiration.Add(timeout);
            pendingRequest.requestExpiration = expiration;

            //poke the wait thread
            if (pendingRequests.Count == 1)
            {
                arpHandle.Set();
            }
            return(pendingRequest.requestEvent);
        }