From 2c486aacd7141615bbcded7843f3f3f3fcc53357 Mon Sep 17 00:00:00 2001 From: Fredrik Osterlind Date: Fri, 9 Mar 2012 15:23:16 +0100 Subject: [PATCH] radio medium bugfix: a combination of changing channels while radio is off and with a nearby ongoing transmission, and then immediately turning on the radio caused it to incorrectly detect the ongoing transmission (bug reported by Beshr Al Nahas) --- tools/cooja/apps/mrm/java/se/sics/mrm/MRM.java | 10 ++++++++++ .../sics/cooja/radiomediums/AbstractRadioMedium.java | 11 ++++++++++- .../cooja/java/se/sics/cooja/radiomediums/UDGM.java | 12 ++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/tools/cooja/apps/mrm/java/se/sics/mrm/MRM.java b/tools/cooja/apps/mrm/java/se/sics/mrm/MRM.java index f56647837..415447472 100644 --- a/tools/cooja/apps/mrm/java/se/sics/mrm/MRM.java +++ b/tools/cooja/apps/mrm/java/se/sics/mrm/MRM.java @@ -300,6 +300,11 @@ public class MRM extends AbstractRadioMedium { for (RadioConnection conn : conns) { for (Radio dstRadio : ((MRMRadioConnection) conn).getDestinations()) { double signalStrength = ((MRMRadioConnection) conn).getDestinationSignalStrength(dstRadio); + if (conn.getSource().getChannel() >= 0 && + dstRadio.getChannel() >= 0 && + conn.getSource().getChannel() != dstRadio.getChannel()) { + continue; + } if (dstRadio.getCurrentSignalStrength() < signalStrength) { dstRadio.setCurrentSignalStrength(signalStrength); } @@ -313,6 +318,11 @@ public class MRM extends AbstractRadioMedium { if (intfRadio.getCurrentSignalStrength() < signalStrength) { intfRadio.setCurrentSignalStrength(signalStrength); } + if (conn.getSource().getChannel() >= 0 && + intfRadio.getChannel() >= 0 && + conn.getSource().getChannel() != intfRadio.getChannel()) { + continue; + } if (!intfRadio.isInterfered()) { /*logger.warn("Radio was not interfered: " + intfRadio);*/ diff --git a/tools/cooja/java/se/sics/cooja/radiomediums/AbstractRadioMedium.java b/tools/cooja/java/se/sics/cooja/radiomediums/AbstractRadioMedium.java index e404a80ef..b0b4d1e0a 100644 --- a/tools/cooja/java/se/sics/cooja/radiomediums/AbstractRadioMedium.java +++ b/tools/cooja/java/se/sics/cooja/radiomediums/AbstractRadioMedium.java @@ -147,6 +147,11 @@ public abstract class AbstractRadioMedium extends RadioMedium { conn.getSource().setCurrentSignalStrength(SS_STRONG); } for (Radio dstRadio : conn.getDestinations()) { + if (conn.getSource().getChannel() >= 0 && + dstRadio.getChannel() >= 0 && + conn.getSource().getChannel() != dstRadio.getChannel()) { + continue; + } if (dstRadio.getCurrentSignalStrength() < SS_STRONG) { dstRadio.setCurrentSignalStrength(SS_STRONG); } @@ -159,7 +164,11 @@ public abstract class AbstractRadioMedium extends RadioMedium { if (intfRadio.getCurrentSignalStrength() < SS_STRONG) { intfRadio.setCurrentSignalStrength(SS_STRONG); } - + if (conn.getSource().getChannel() >= 0 && + intfRadio.getChannel() >= 0 && + conn.getSource().getChannel() != intfRadio.getChannel()) { + continue; + } if (!intfRadio.isInterfered()) { /*logger.warn("Radio was not interfered");*/ intfRadio.interfereAnyReception(); diff --git a/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java b/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java index c0f273883..5981d4e80 100644 --- a/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java +++ b/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java @@ -287,6 +287,12 @@ public class UDGM extends AbstractRadioMedium { conn.getSource().setCurrentSignalStrength(SS_STRONG); } for (Radio dstRadio : conn.getDestinations()) { + if (conn.getSource().getChannel() >= 0 && + dstRadio.getChannel() >= 0 && + conn.getSource().getChannel() != dstRadio.getChannel()) { + continue; + } + double dist = conn.getSource().getPosition().getDistanceTo(dstRadio.getPosition()); double maxTxDist = TRANSMITTING_RANGE @@ -303,6 +309,12 @@ public class UDGM extends AbstractRadioMedium { /* Set signal strength to below weak on interfered */ for (RadioConnection conn : conns) { for (Radio intfRadio : conn.getInterfered()) { + if (conn.getSource().getChannel() >= 0 && + intfRadio.getChannel() >= 0 && + conn.getSource().getChannel() != intfRadio.getChannel()) { + continue; + } + double dist = conn.getSource().getPosition().getDistanceTo(intfRadio.getPosition()); double maxTxDist = TRANSMITTING_RANGE