( ctx context.Context, dev *ttnpb.EndDevice, phy *band.Band, defaults *ttnpb.MACSettings, )
| 477 | } |
| 478 | |
| 479 | func adrDataRateRange( |
| 480 | ctx context.Context, dev *ttnpb.EndDevice, phy *band.Band, defaults *ttnpb.MACSettings, |
| 481 | ) (min, max ttnpb.DataRateIndex, allowed map[ttnpb.DataRateIndex]struct{}, ok bool, err error) { |
| 482 | macState := dev.MacState |
| 483 | min, max, allowed, ok = channelDataRateRange( |
| 484 | macState.DesiredParameters.Channels..., |
| 485 | ) |
| 486 | if !ok { |
| 487 | return 0, 0, nil, false, internal.ErrCorruptedMACState. |
| 488 | WithCause(internal.ErrChannelDataRateRange) |
| 489 | } |
| 490 | min, max = clampDataRateRange(dev, defaults, min, max) |
| 491 | if min > max { |
| 492 | log.FromContext(ctx).Debug("No common data rate index range available, avoid ADR") |
| 493 | return 0, 0, nil, false, nil |
| 494 | } |
| 495 | if max > phy.MaxADRDataRateIndex { |
| 496 | max = phy.MaxADRDataRateIndex |
| 497 | } |
| 498 | for _, idx := range macState.RejectedAdrDataRateIndexes { |
| 499 | delete(allowed, idx) |
| 500 | } |
| 501 | _, ok = allowed[min] |
| 502 | for !ok && min <= max { |
| 503 | min++ |
| 504 | _, ok = allowed[min] |
| 505 | } |
| 506 | _, ok = allowed[max] |
| 507 | for !ok && max >= min { |
| 508 | max-- |
| 509 | _, ok = allowed[max] |
| 510 | } |
| 511 | if min > max { |
| 512 | log.FromContext(ctx).Debug( |
| 513 | "Device has rejected all possible data rate values given the channels enabled, avoid ADR", |
| 514 | ) |
| 515 | return 0, 0, nil, false, nil |
| 516 | } |
| 517 | return min, max, allowed, true, nil |
| 518 | } |
| 519 | |
| 520 | func adrTxPowerRange( |
| 521 | ctx context.Context, dev *ttnpb.EndDevice, phy *band.Band, defaults *ttnpb.MACSettings, |
no test coverage detected