Skip to content

Commit 0ed91e6

Browse files
authored
Merge pull request #7704 from TheThingsNetwork/fix/adr-data-rate-index-range
Keep the ADR data rate index value between min and max values
2 parents ef3a5cc + 3899bb1 commit 0ed91e6

3 files changed

Lines changed: 69 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ For details about compatibility between different releases, see the **Commitment
2727

2828
- Parsers for newly added normalized payload fields.
2929

30+
### Fixed
31+
32+
- ADR respects the MAC settings `adr.mode.dynamic.min-data-rate-index` and `adr.mode.dynamic.max-data-rate-index` values
33+
3034
## [3.34.2] - 2025-07-24
3135

3236
### Added

pkg/networkserver/mac/adr.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,9 @@ func adrAdaptDataRate(
583583
) float32 {
584584
currentParameters, desiredParameters := macState.CurrentParameters, macState.DesiredParameters
585585
currentDataRateIndex := currentParameters.AdrDataRateIndex
586+
// Keep the data rate index between min and max
587+
currentDataRateIndex = max(currentDataRateIndex, minDataRateIndex)
588+
currentDataRateIndex = min(currentDataRateIndex, maxDataRateIndex)
586589
// NOTE: Network Server may only increase the data rate index of the device.
587590
if currentDataRateIndex > minDataRateIndex {
588591
minDataRateIndex = currentDataRateIndex

pkg/networkserver/mac/adr_test.go

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2185,8 +2185,69 @@ func TestADRAdaptDataRate(t *testing.T) {
21852185
},
21862186
OutputMargin: 5.0,
21872187
},
2188+
{
2189+
Name: "current index below min value",
2190+
2191+
MACState: &ttnpb.MACState{
2192+
CurrentParameters: &ttnpb.MACParameters{
2193+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_0,
2194+
AdrTxPowerIndex: 1,
2195+
},
2196+
DesiredParameters: &ttnpb.MACParameters{
2197+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_0,
2198+
AdrTxPowerIndex: 1,
2199+
},
2200+
},
2201+
Band: &band.EU_863_870_RP1_V1_0_3_Rev_A,
2202+
MinDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_2,
2203+
MaxDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_3,
2204+
AllowedDataRateIndices: newDataRateIndexRange(ttnpb.DataRateIndex_DATA_RATE_0, ttnpb.DataRateIndex_DATA_RATE_5),
2205+
InitialMargin: 0,
2206+
2207+
OutputMACState: &ttnpb.MACState{
2208+
CurrentParameters: &ttnpb.MACParameters{
2209+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_0,
2210+
AdrTxPowerIndex: 1,
2211+
},
2212+
DesiredParameters: &ttnpb.MACParameters{
2213+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_2,
2214+
AdrTxPowerIndex: 1,
2215+
},
2216+
},
2217+
OutputMargin: 0,
2218+
},
2219+
{
2220+
Name: "current index above max value",
2221+
2222+
MACState: &ttnpb.MACState{
2223+
CurrentParameters: &ttnpb.MACParameters{
2224+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_5,
2225+
AdrTxPowerIndex: 1,
2226+
},
2227+
DesiredParameters: &ttnpb.MACParameters{
2228+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_5,
2229+
AdrTxPowerIndex: 1,
2230+
},
2231+
},
2232+
Band: &band.EU_863_870_RP1_V1_0_3_Rev_A,
2233+
MinDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_2,
2234+
MaxDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_3,
2235+
AllowedDataRateIndices: newDataRateIndexRange(ttnpb.DataRateIndex_DATA_RATE_0, ttnpb.DataRateIndex_DATA_RATE_5),
2236+
InitialMargin: 0,
2237+
2238+
OutputMACState: &ttnpb.MACState{
2239+
CurrentParameters: &ttnpb.MACParameters{
2240+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_5,
2241+
AdrTxPowerIndex: 1,
2242+
},
2243+
DesiredParameters: &ttnpb.MACParameters{
2244+
AdrDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_3,
2245+
AdrTxPowerIndex: 1,
2246+
},
2247+
},
2248+
OutputMargin: 0,
2249+
},
21882250
} {
2189-
tc := tc
21902251
t.Run(tc.Name, func(t *testing.T) {
21912252
t.Parallel()
21922253

0 commit comments

Comments
 (0)