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; } }
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; } } }