From 7ee3c5d2515cbffd74a6b117e4926dbdfad49114 Mon Sep 17 00:00:00 2001 From: Denny Sheirer Date: Sat, 26 Sep 2026 04:05:26 -0400 Subject: [PATCH] #2473 P25P1 bad frequency bands messages contaminating channel frequency calculation map (#2474) Co-authored-by: denny --- .../p25/phase1/P25P1MessageProcessor.java | 9 +++----- .../p25/phase1/message/IFrequencyBand.java | 22 ++++++++++++------- .../p25/phase1/message/P25FrequencyBand.java | 6 +++++ .../mac/structure/FrequencyBandUpdate.java | 7 ++++++ .../FrequencyBandUpdateTDMAAbbreviated.java | 7 ++++++ .../FrequencyBandUpdateTDMAExtended.java | 7 ++++++ .../structure/FrequencyBandUpdateVUHF.java | 7 ++++++ 7 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1MessageProcessor.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1MessageProcessor.java index 03b9c812..aab05ffd 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1MessageProcessor.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1MessageProcessor.java @@ -306,10 +306,8 @@ public class P25P1MessageProcessor implements Listener private void processForFrequencyBands(AbstractMessage message) { //Insert frequency band identifier update messages into channel-type messages */ - if(message instanceof IFrequencyBandReceiver) + if(message instanceof IFrequencyBandReceiver receiver) { - IFrequencyBandReceiver receiver = (IFrequencyBandReceiver)message; - List channels = receiver.getChannels(); for(IBandChannelDescriptor channel : channels) @@ -327,10 +325,9 @@ public class P25P1MessageProcessor implements Listener } //Store band identifiers so that they can be injected into channel type messages - if(message instanceof IFrequencyBand) + if(message instanceof IFrequencyBand band && band.isValid()) { - IFrequencyBand bandIdentifier = (IFrequencyBand)message; - mFrequencyBandMap.put(bandIdentifier.getIdentifier(), bandIdentifier); + mFrequencyBandMap.put(band.getIdentifier(), band); } } diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/IFrequencyBand.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/IFrequencyBand.java index 387fbf1f..4064a117 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/IFrequencyBand.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/IFrequencyBand.java @@ -19,43 +19,49 @@ */ package io.github.dsheirer.module.decode.p25.phase1.message; +/** + * P25 frequency band provider interface. + */ public interface IFrequencyBand { + /** + * Indicates if the band is valid and passes CRC checks. + */ + boolean isValid(); /** * (Band) Identifier */ - public abstract int getIdentifier(); + int getIdentifier(); /** * Channel spacing in hertz */ - public abstract long getChannelSpacing(); + long getChannelSpacing(); /** * Base frequency in hertz */ - public abstract long getBaseFrequency(); - + long getBaseFrequency(); /** * Channel bandwidth in hertz */ - public abstract int getBandwidth(); + int getBandwidth(); /** * Transmit offset in hertz */ - public abstract long getTransmitOffset(); + long getTransmitOffset(); /** * Downlink (tower to mobile) Frequency for the specified channel */ - public abstract long getDownlinkFrequency(int channelNumber); + long getDownlinkFrequency(int channelNumber); /** * Uplink (mobile to tower) Frequency for the specified channel */ - public abstract long getUplinkFrequency(int channelNumber); + long getUplinkFrequency(int channelNumber); /** * Indicates if this band is an FDMA (false) or TDMA (true) band diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/P25FrequencyBand.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/P25FrequencyBand.java index 7623c4dd..1ee9fbe5 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/P25FrequencyBand.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/message/P25FrequencyBand.java @@ -34,6 +34,12 @@ public class P25FrequencyBand implements IFrequencyBand mTimeslotCount = timeslotCount; } + @Override + public boolean isValid() + { + return true; + } + @Override public int getIdentifier() { diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdate.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdate.java index 1b8a9dec..3a05b2b9 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdate.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdate.java @@ -50,6 +50,13 @@ public class FrequencyBandUpdate extends MacStructure implements IFrequencyBand super(message, offset); } + @Override + public boolean isValid() + { + //Note: this message is only created when the parent passes CRC, therefore it should be valid. + return true; + } + /** * Textual representation of this message */ diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAAbbreviated.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAAbbreviated.java index 6a6281f1..f4fd18a8 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAAbbreviated.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAAbbreviated.java @@ -53,6 +53,13 @@ public class FrequencyBandUpdateTDMAAbbreviated extends MacStructure implements super(message, offset); } + @Override + public boolean isValid() + { + //Note: this message is only created when the parent passes CRC, therefore it should be valid. + return true; + } + /** * Textual representation of this message */ diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAExtended.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAExtended.java index 62b61a9c..b39f9d70 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAExtended.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateTDMAExtended.java @@ -59,6 +59,13 @@ public class FrequencyBandUpdateTDMAExtended extends MacStructure implements IFr super(message, offset); } + @Override + public boolean isValid() + { + //Note: this message is only created when the parent passes CRC, therefore it should be valid. + return true; + } + /** * Textual representation of this message */ diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateVUHF.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateVUHF.java index 1e7267b6..77a87ff5 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateVUHF.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/message/mac/structure/FrequencyBandUpdateVUHF.java @@ -50,6 +50,13 @@ public class FrequencyBandUpdateVUHF extends MacStructure implements IFrequencyB super(message, offset); } + @Override + public boolean isValid() + { + //Note: this message is only created when the parent passes CRC, therefore it should be valid. + return true; + } + /** * Textual representation of this message */