From 664867496905cdb78a908869d70672e41dee0832 Mon Sep 17 00:00:00 2001 From: Hylke Visser Date: Mon, 18 Feb 2019 10:09:04 +0100 Subject: [PATCH 1/3] Make NetworkServer support ADR payloads for more regions --- core/networkserver/adr.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/core/networkserver/adr.go b/core/networkserver/adr.go index a6e8f4c07..1e332a060 100644 --- a/core/networkserver/adr.go +++ b/core/networkserver/adr.go @@ -303,11 +303,18 @@ func (n *networkServer) handleDownlinkADR(message *pb_broker.DownlinkMessage, de func getAdrReqPayloads(dev *device.Device, frequencyPlan *band.FrequencyPlan, drIdx int, powerIdx int) []lorawan.LinkADRReqPayload { payloads := []lorawan.LinkADRReqPayload{} switch dev.ADR.Band { - case pb_lorawan.FrequencyPlan_EU_863_870.String(): - if dev.ADR.Failed > 0 && powerIdx > 5 { + + // Frequency plans with three mandatory channels: + case pb_lorawan.FrequencyPlan_EU_863_870.String(), + pb_lorawan.FrequencyPlan_EU_433.String(), + pb_lorawan.FrequencyPlan_KR_920_923.String(), + pb_lorawan.FrequencyPlan_IN_865_867.String(): + + if dev.ADR.Band == pb_lorawan.FrequencyPlan_EU_863_870.String() && dev.ADR.Failed > 0 && powerIdx > 5 { // fall back to txPower 5 for LoRaWAN 1.0 powerIdx = 5 } + payloads = []lorawan.LinkADRReqPayload{ { DataRate: uint8(drIdx), @@ -332,7 +339,12 @@ func getAdrReqPayloads(dev *device.Device, frequencyPlan *band.FrequencyPlan, dr } } } - case pb_lorawan.FrequencyPlan_RU_864_870.String(): + + // Frequency plans with two default channels: + case pb_lorawan.FrequencyPlan_AS_923.String(), + pb_lorawan.FrequencyPlan_AS_920_923.String(), + pb_lorawan.FrequencyPlan_AS_923_925.String(), + pb_lorawan.FrequencyPlan_RU_864_870.String(): payloads = []lorawan.LinkADRReqPayload{ { DataRate: uint8(drIdx), @@ -344,7 +356,7 @@ func getAdrReqPayloads(dev *device.Device, frequencyPlan *band.FrequencyPlan, dr }, } if dev.ADR.Failed > 0 { - // Fall back to the mandatory RU_864_870 LoRaWAN channels + // Fall back to the mandatory LoRaWAN channels payloads[0].ChMask[0] = true payloads[0].ChMask[1] = true } else { @@ -356,6 +368,8 @@ func getAdrReqPayloads(dev *device.Device, frequencyPlan *band.FrequencyPlan, dr } } } + + // Frequency plans with 8 FSBs: case pb_lorawan.FrequencyPlan_US_902_928.String(), pb_lorawan.FrequencyPlan_AU_915_928.String(): var dr500 uint8 switch dev.ADR.Band { From 6f69b7e20249a36e5defaf879ce17bf31aa0f9c2 Mon Sep 17 00:00:00 2001 From: Hylke Visser Date: Mon, 18 Feb 2019 10:09:33 +0100 Subject: [PATCH 2/3] Add ADR config for KR frequency plan --- core/band/band.go | 1 + core/band/band_test.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/band/band.go b/core/band/band.go index 4d2cc7b52..59c686160 100644 --- a/core/band/band.go +++ b/core/band/band.go @@ -171,6 +171,7 @@ func Get(region string) (frequencyPlan FrequencyPlan, err error) { } frequencyPlan.DownlinkChannels = frequencyPlan.UplinkChannels frequencyPlan.CFList = &lorawan.CFList{922700000, 922900000, 923100000, 923300000, 0} + frequencyPlan.ADR = &ADRConfig{MinDataRate: 0, MaxDataRate: 5, MinTXPower: 2, MaxTXPower: 14, StepTXPower: 2} case pb_lorawan.FrequencyPlan_IN_865_867.String(): frequencyPlan.Band, err = lora.GetConfig(lora.IN_865_867, false, lorawan.DwellTimeNoLimit) case pb_lorawan.FrequencyPlan_RU_864_870.String(): diff --git a/core/band/band_test.go b/core/band/band_test.go index 577cbc9a8..1261a4869 100644 --- a/core/band/band_test.go +++ b/core/band/band_test.go @@ -100,7 +100,7 @@ func TestGet(t *testing.T) { fp, err := Get("KR_920_923") a.So(err, ShouldBeNil) a.So(fp.CFList, ShouldNotBeNil) - a.So(fp.ADR, ShouldBeNil) + a.So(fp.ADR, ShouldNotBeNil) } { From 843ed14e1c183cafeb2ebd419dd417bc487a7187 Mon Sep 17 00:00:00 2001 From: Hylke Visser Date: Mon, 18 Feb 2019 10:20:56 +0100 Subject: [PATCH 3/3] Add ADR unit tests for AS and KR --- core/networkserver/adr_test.go | 86 ++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/core/networkserver/adr_test.go b/core/networkserver/adr_test.go index 905774ade..49ae599a7 100644 --- a/core/networkserver/adr_test.go +++ b/core/networkserver/adr_test.go @@ -298,6 +298,92 @@ func TestHandleDownlinkADR(t *testing.T) { a.So(payload.ChMask[8], ShouldBeFalse) // 9th channel (FSK) disabled } + ns.Component.Ctx.Info("Start AS ADR Test") + + dev.ADR.DataRate = "SF10BW125" + dev.ADR.TxPower = 10 + + { + dev.ADR.Band = "AS_923" + message := adrInitDownlinkMessage() + err := ns.handleDownlinkADR(message, dev) + a.So(err, ShouldBeNil) + fOpts := message.Message.GetLoRaWAN().GetMACPayload().FOpts + a.So(fOpts, ShouldHaveLength, 2) + a.So(fOpts[1].CID, ShouldEqual, lorawan.LinkADRReq) + payload := new(lorawan.LinkADRReqPayload) + payload.UnmarshalBinary(fOpts[1].Payload) + a.So(payload.DataRate, ShouldEqual, 5) // SF7BW125 + a.So(payload.TXPower, ShouldEqual, 2) // 10 + for i := 0; i < 1; i++ { // First 2 channels enabled + a.So(payload.ChMask[i], ShouldBeTrue) + } + for i := 2; i < 8; i++ { // Next 6 channels disabled + a.So(payload.ChMask[i], ShouldBeFalse) + } + } + + dev.ADR.DataRate = "SF10BW125" + dev.ADR.TxPower = 10 + + { + dev.ADR.Band = "AS_920_923" + message := adrInitDownlinkMessage() + err := ns.handleDownlinkADR(message, dev) + a.So(err, ShouldBeNil) + fOpts := message.Message.GetLoRaWAN().GetMACPayload().FOpts + a.So(fOpts, ShouldHaveLength, 2) + a.So(fOpts[1].CID, ShouldEqual, lorawan.LinkADRReq) + payload := new(lorawan.LinkADRReqPayload) + payload.UnmarshalBinary(fOpts[1].Payload) + a.So(payload.DataRate, ShouldEqual, 5) // SF7BW125 + a.So(payload.TXPower, ShouldEqual, 2) // 10 + for i := 0; i < 8; i++ { // First 8 channels enabled + a.So(payload.ChMask[i], ShouldBeTrue) + } + } + + dev.ADR.DataRate = "SF10BW125" + dev.ADR.TxPower = 10 + + { + dev.ADR.Band = "AS_923_925" + message := adrInitDownlinkMessage() + err := ns.handleDownlinkADR(message, dev) + a.So(err, ShouldBeNil) + fOpts := message.Message.GetLoRaWAN().GetMACPayload().FOpts + a.So(fOpts, ShouldHaveLength, 2) + a.So(fOpts[1].CID, ShouldEqual, lorawan.LinkADRReq) + payload := new(lorawan.LinkADRReqPayload) + payload.UnmarshalBinary(fOpts[1].Payload) + a.So(payload.DataRate, ShouldEqual, 5) // SF7BW125 + a.So(payload.TXPower, ShouldEqual, 2) // 10 + for i := 0; i < 8; i++ { // First 8 channels enabled + a.So(payload.ChMask[i], ShouldBeTrue) + } + } + + dev.ADR.DataRate = "SF10BW125" + dev.ADR.TxPower = 10 + + { + dev.ADR.Band = "KR_920_923" + message := adrInitDownlinkMessage() + err := ns.handleDownlinkADR(message, dev) + a.So(err, ShouldBeNil) + fOpts := message.Message.GetLoRaWAN().GetMACPayload().FOpts + a.So(fOpts, ShouldHaveLength, 2) + a.So(fOpts[1].CID, ShouldEqual, lorawan.LinkADRReq) + payload := new(lorawan.LinkADRReqPayload) + payload.UnmarshalBinary(fOpts[1].Payload) + a.So(payload.DataRate, ShouldEqual, 5) // SF7BW125 + a.So(payload.TXPower, ShouldEqual, 2) // 10 + for i := 0; i < 7; i++ { // First 7 channels enabled + a.So(payload.ChMask[i], ShouldBeTrue) + } + a.So(payload.ChMask[7], ShouldBeFalse) // 8th channel disabled + } + dev.ADR.DataRate = "SF10BW125" dev.ADR.TxPower = 20