示例#1
0
        public void StartReceiving(Event cause, Relay sender)
        {
            // if skipping events, wake up as it receives any transmission (can be optimized to wake up only when actually necessary)
            if (sim.simulationParameters.skipCycleEvents && this.status == RelayStatus.Asleep && this.ShouldBeAwake)
            {
                this.AwakeMidtime(cause);
            }

            bool interested = false;

            switch (this.status)
            {
            case RelayStatus.Sensing:
                this.hasSensed = true;
                break;

            case RelayStatus.Free:
                this.PostponeSleep(cause);
                interested = true;
                break;

            case RelayStatus.Awaiting_Signal:
                interested = true;
                break;

            case RelayStatus.Awaiting_region:
                interested = true;
                break;

            case RelayStatus.Asleep:
                break;

            case RelayStatus.Transmitting:
                break;

            case RelayStatus.Backoff_Sensing:
                break;

            case RelayStatus.Backoff_CTS:
                break;

            case RelayStatus.Backoff_SinkRTS:
                break;

            default:
                throw new Exception("Unexpected relay status");
            }

            // every one else failes anyway
            foreach (var transmitter in receivingTransmissions.Keys.ToList())
            {
                receivingTransmissions[transmitter] = false;
            }

            if (interested)
            {
                bool failed = receivingTransmissions.Count > 0;
                this.receivingTransmissions[sender] = failed;
            }
        }
示例#2
0
        private void HandleRTS(Event cause, Relay sender)
        {
            var packetContentID = sender.packetToSend.content_id;

            if (sim.protocolParameters.avoid_back_flow && passedPacketsSet.Contains(packetContentID))
            {
                // do not reply
                return;
            }
            bool failed = this.receivingTransmissions[sender];

            // if free or awaiting for ITS correct region
            if (failed == false && (this.status == RelayStatus.Free || (this.status == RelayStatus.Awaiting_region && this.busyWith == sender)))
            {
                int myIndex = CalculateRegionIndex(sender);
                // if I'm in the correct region
                if (myIndex == sender.REGION_index)
                {
                    this.Reserve(sender, cause);
                    sim.eventQueue.Add(new StartCTSEvent()
                    {
                        relay             = this,
                        time              = sim.clock,
                        actualDestination = sender,
                        sim      = sim,
                        previous = cause
                    });
                }
                // i'm early
                else if (myIndex > sender.REGION_index && myIndex < sim.protocolParameters.n_regions)
                {
                    this.Reserve(sender, cause);
                    this.status = RelayStatus.Awaiting_region;
                }
            }
        }