From d97da8ed504859ff3503c822fa22cc0b4aae3f98 Mon Sep 17 00:00:00 2001 From: Orne Brocaar Date: Sun, 21 Aug 2022 21:48:27 +0100 Subject: [PATCH] Fix c > 64 to c >= 64 typo in channel-mask calculation. Depending the channel-configuration, this would send three LinkADRReq mac-commands while the same configuration could be send to the device in two LinkADRReq mac-commands. --- lrwn/src/region/au915.rs | 49 ++++++++++++++++++++++++++++++++++++---- lrwn/src/region/us915.rs | 49 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 88 insertions(+), 10 deletions(-) diff --git a/lrwn/src/region/au915.rs b/lrwn/src/region/au915.rs index c8d4f6f2..4d6b65ac 100644 --- a/lrwn/src/region/au915.rs +++ b/lrwn/src/region/au915.rs @@ -1107,7 +1107,7 @@ impl Region for Configuration { // use the ChMask of the first LinkADRReqPayload, besides // turning off all 125 kHz this payload contains the ChMask // for the last block of channels. - if c > 64 { + if c >= 64 { out[0].ch_mask.set(c % 16, true); continue; } @@ -1419,11 +1419,11 @@ pub mod test { expected_uplink_channels: c.get_uplink_channel_indices(), expected_link_adr_req_payloads: vec![], }, - // Only activate 0 - 7. + // Only activate 0 - 7 + 64. Test { device_channels: c.get_uplink_channel_indices(), - enabled_channels: vec![0, 1, 2, 3, 4, 5, 6, 7], - expected_uplink_channels: vec![0, 1, 2, 3, 4, 5, 6, 7], + enabled_channels: vec![0, 1, 2, 3, 4, 5, 6, 7, 64], + expected_uplink_channels: vec![0, 1, 2, 3, 4, 5, 6, 7, 64], expected_link_adr_req_payloads: vec![ LinkADRReqPayload { dr: 0, @@ -1432,7 +1432,10 @@ pub mod test { ch_mask_cntl: 7, nb_rep: 0, }, - ch_mask: ChMask::new([false; 16]), + ch_mask: ChMask::new([ + true, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, + ]), }, LinkADRReqPayload { dr: 0, @@ -1448,6 +1451,42 @@ pub mod test { }, ], }, + // Only activate 0 - 15 + 64 & 65. + Test { + device_channels: c.get_uplink_channel_indices(), + enabled_channels: vec![ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 64, 65, + ], + expected_uplink_channels: vec![ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 64, 65, + ], + expected_link_adr_req_payloads: vec![ + LinkADRReqPayload { + dr: 0, + tx_power: 0, + redundancy: Redundancy { + ch_mask_cntl: 7, + nb_rep: 0, + }, + ch_mask: ChMask::new([ + true, true, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, + ]), + }, + LinkADRReqPayload { + dr: 0, + tx_power: 0, + redundancy: Redundancy { + ch_mask_cntl: 0, + nb_rep: 0, + }, + ch_mask: ChMask::new([ + true, true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, + ]), + }, + ], + }, ]; for tst in &tests { diff --git a/lrwn/src/region/us915.rs b/lrwn/src/region/us915.rs index 27d163f1..763bbd50 100644 --- a/lrwn/src/region/us915.rs +++ b/lrwn/src/region/us915.rs @@ -797,7 +797,7 @@ impl Region for Configuration { // use the ChMask of the first LinkADRReqPayload, besides // turning off all 125 kHz this payload contains the ChMask // for the last block of channels. - if c > 64 { + if c >= 64 { out[0].ch_mask.set(c % 16, true); continue; } @@ -1111,11 +1111,11 @@ pub mod test { expected_uplink_channels: c.get_uplink_channel_indices(), expected_link_adr_req_payloads: vec![], }, - // Only activate 0 - 7. + // Only activate 0 - 7 + 64. Test { device_channels: c.get_uplink_channel_indices(), - enabled_channels: vec![0, 1, 2, 3, 4, 5, 6, 7], - expected_uplink_channels: vec![0, 1, 2, 3, 4, 5, 6, 7], + enabled_channels: vec![0, 1, 2, 3, 4, 5, 6, 7, 64], + expected_uplink_channels: vec![0, 1, 2, 3, 4, 5, 6, 7, 64], expected_link_adr_req_payloads: vec![ LinkADRReqPayload { dr: 0, @@ -1124,7 +1124,10 @@ pub mod test { ch_mask_cntl: 7, nb_rep: 0, }, - ch_mask: ChMask::new([false; 16]), + ch_mask: ChMask::new([ + true, false, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, + ]), }, LinkADRReqPayload { dr: 0, @@ -1140,6 +1143,42 @@ pub mod test { }, ], }, + // Only activate 0 - 15 + 64 & 65. + Test { + device_channels: c.get_uplink_channel_indices(), + enabled_channels: vec![ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 64, 65, + ], + expected_uplink_channels: vec![ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 64, 65, + ], + expected_link_adr_req_payloads: vec![ + LinkADRReqPayload { + dr: 0, + tx_power: 0, + redundancy: Redundancy { + ch_mask_cntl: 7, + nb_rep: 0, + }, + ch_mask: ChMask::new([ + true, true, false, false, false, false, false, false, false, false, + false, false, false, false, false, false, + ]), + }, + LinkADRReqPayload { + dr: 0, + tx_power: 0, + redundancy: Redundancy { + ch_mask_cntl: 0, + nb_rep: 0, + }, + ch_mask: ChMask::new([ + true, true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, + ]), + }, + ], + }, ]; for tst in &tests {