From c71b856c78643203f59016ef3b6bc9ce424823f0 Mon Sep 17 00:00:00 2001 From: Orne Brocaar Date: Tue, 26 Mar 2024 16:45:24 +0000 Subject: [PATCH] Align multicast class-b ping-slot config. This aligns the multicast class-b ping-slot configuration with the way how it is configured in the device-profile. This deprecates the class_b_ping_slot_period field in favor of the class_b_ping_slot_nb_k field, which should be a value between 0 - 7 (this is defined and explained by the LoRaWAN specification). Closes #255. --- api/proto/api/multicast_group.proto | 7 ++++ .../chirpstack/api/multicast_group.proto | 7 ++++ .../down.sql | 8 +++++ .../up.sql | 8 +++++ chirpstack/src/api/multicast.rs | 32 +++++++++++++++---- chirpstack/src/storage/gateway.rs | 2 +- chirpstack/src/storage/multicast.rs | 22 ++++++------- chirpstack/src/storage/schema.rs | 2 +- chirpstack/src/test/multicast_test.rs | 2 +- .../multicast-groups/MulticastGroupForm.tsx | 20 ++++++------ 10 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/down.sql create mode 100644 chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/up.sql diff --git a/api/proto/api/multicast_group.proto b/api/proto/api/multicast_group.proto index 4111c184..7548e046 100644 --- a/api/proto/api/multicast_group.proto +++ b/api/proto/api/multicast_group.proto @@ -164,8 +164,15 @@ message MulticastGroup { uint32 frequency = 11; // Ping-slot period (only for Class-B). + // Deprecated: use class_b_ping_slot_nb_k. uint32 class_b_ping_slot_period = 12; + // Class-B ping-slots per beacon period (only for Class-B). + // Valid options are: 0 - 7; + // + // The actual number of ping-slots per beacon period equals to 2^k. + uint32 class_b_ping_slot_nb_k = 14; + // Scheduling type (only for Class-C). MulticastGroupSchedulingType class_c_scheduling_type = 13; } diff --git a/api/rust/proto/chirpstack/api/multicast_group.proto b/api/rust/proto/chirpstack/api/multicast_group.proto index 4111c184..7548e046 100644 --- a/api/rust/proto/chirpstack/api/multicast_group.proto +++ b/api/rust/proto/chirpstack/api/multicast_group.proto @@ -164,8 +164,15 @@ message MulticastGroup { uint32 frequency = 11; // Ping-slot period (only for Class-B). + // Deprecated: use class_b_ping_slot_nb_k. uint32 class_b_ping_slot_period = 12; + // Class-B ping-slots per beacon period (only for Class-B). + // Valid options are: 0 - 7; + // + // The actual number of ping-slots per beacon period equals to 2^k. + uint32 class_b_ping_slot_nb_k = 14; + // Scheduling type (only for Class-C). MulticastGroupSchedulingType class_c_scheduling_type = 13; } diff --git a/chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/down.sql b/chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/down.sql new file mode 100644 index 00000000..0c0ad782 --- /dev/null +++ b/chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/down.sql @@ -0,0 +1,8 @@ +alter table multicast_group + alter column class_b_ping_slot_nb_k type integer; + +update multicast_group set class_b_ping_slot_nb_k = pow(2, class_b_ping_slot_nb_k) * 32; + +alter table multicast_group + rename column class_b_ping_slot_nb_k to class_b_ping_slot_period; + diff --git a/chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/up.sql b/chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/up.sql new file mode 100644 index 00000000..f280ef1f --- /dev/null +++ b/chirpstack/migrations/2024-03-26-134652_align_multicast_ping_slot_config/up.sql @@ -0,0 +1,8 @@ +alter table multicast_group + rename column class_b_ping_slot_period to class_b_ping_slot_nb_k; + +update multicast_group set class_b_ping_slot_nb_k = log(2, class_b_ping_slot_nb_k / 32); + +alter table multicast_group + alter column class_b_ping_slot_nb_k type smallint; + diff --git a/chirpstack/src/api/multicast.rs b/chirpstack/src/api/multicast.rs index 8ce58733..aa6fbedb 100644 --- a/chirpstack/src/api/multicast.rs +++ b/chirpstack/src/api/multicast.rs @@ -61,7 +61,14 @@ impl MulticastGroupService for MulticastGroup { .to_string(), dr: req_mg.dr as i16, frequency: req_mg.frequency as i64, - class_b_ping_slot_period: req_mg.class_b_ping_slot_period as i32, + class_b_ping_slot_nb_k: if req_mg.class_b_ping_slot_period != 0 { + // For backwards compatibility. + (req_mg.class_b_ping_slot_period / 32) + .checked_ilog2() + .unwrap_or_default() + } else { + req_mg.class_b_ping_slot_nb_k + } as i16, class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(), ..Default::default() }; @@ -114,7 +121,8 @@ impl MulticastGroupService for MulticastGroup { .into(), dr: mg.dr as u32, frequency: mg.frequency as u32, - class_b_ping_slot_period: mg.class_b_ping_slot_period as u32, + class_b_ping_slot_period: (1 << (mg.class_b_ping_slot_nb_k as u32)) * 32, + class_b_ping_slot_nb_k: mg.class_b_ping_slot_nb_k as u32, class_c_scheduling_type: mg.class_c_scheduling_type.to_proto().into(), }), created_at: Some(helpers::datetime_to_prost_timestamp(&mg.created_at)), @@ -160,7 +168,14 @@ impl MulticastGroupService for MulticastGroup { .to_string(), dr: req_mg.dr as i16, frequency: req_mg.frequency as i64, - class_b_ping_slot_period: req_mg.class_b_ping_slot_period as i32, + class_b_ping_slot_nb_k: if req_mg.class_b_ping_slot_period != 0 { + // For backwards compatibility. + (req_mg.class_b_ping_slot_period / 32) + .checked_ilog2() + .unwrap_or_default() + } else { + req_mg.class_b_ping_slot_nb_k + } as i16, class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(), ..Default::default() }) @@ -579,7 +594,7 @@ pub mod test { group_type: api::MulticastGroupType::ClassC.into(), dr: 3, frequency: 868300000, - class_b_ping_slot_period: 1, + class_b_ping_slot_nb_k: 1, class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(), ..Default::default() }), @@ -609,7 +624,8 @@ pub mod test { group_type: api::MulticastGroupType::ClassC.into(), dr: 3, frequency: 868300000, - class_b_ping_slot_period: 1, + class_b_ping_slot_nb_k: 1, + class_b_ping_slot_period: 64, class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(), }), get_resp.get_ref().multicast_group @@ -631,7 +647,8 @@ pub mod test { group_type: api::MulticastGroupType::ClassB.into(), dr: 2, frequency: 868200000, - class_b_ping_slot_period: 2, + class_b_ping_slot_nb_k: 2, + class_b_ping_slot_period: 0, class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(), }), }, @@ -659,7 +676,8 @@ pub mod test { group_type: api::MulticastGroupType::ClassB.into(), dr: 2, frequency: 868200000, - class_b_ping_slot_period: 2, + class_b_ping_slot_nb_k: 2, + class_b_ping_slot_period: 128, class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(), }), get_resp.get_ref().multicast_group diff --git a/chirpstack/src/storage/gateway.rs b/chirpstack/src/storage/gateway.rs index 292c9be8..6404fddb 100644 --- a/chirpstack/src/storage/gateway.rs +++ b/chirpstack/src/storage/gateway.rs @@ -376,7 +376,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_period: 1, + class_b_ping_slot_nb_k: 1, ..Default::default() }) .await diff --git a/chirpstack/src/storage/multicast.rs b/chirpstack/src/storage/multicast.rs index 27560c97..02feb0b7 100644 --- a/chirpstack/src/storage/multicast.rs +++ b/chirpstack/src/storage/multicast.rs @@ -33,7 +33,7 @@ pub struct MulticastGroup { pub group_type: String, pub dr: i16, pub frequency: i64, - pub class_b_ping_slot_period: i32, + pub class_b_ping_slot_nb_k: i16, pub class_c_scheduling_type: fields::MulticastGroupSchedulingType, } @@ -64,7 +64,7 @@ impl Default for MulticastGroup { group_type: "".into(), dr: 0, frequency: 0, - class_b_ping_slot_period: 0, + class_b_ping_slot_nb_k: 0, class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY, } } @@ -165,7 +165,7 @@ pub async fn update(mg: MulticastGroup) -> Result { multicast_group::group_type.eq(&mg.group_type), multicast_group::dr.eq(&mg.dr), multicast_group::frequency.eq(&mg.frequency), - multicast_group::class_b_ping_slot_period.eq(&mg.class_b_ping_slot_period), + multicast_group::class_b_ping_slot_nb_k.eq(&mg.class_b_ping_slot_nb_k), multicast_group::class_c_scheduling_type.eq(&mg.class_c_scheduling_type), )) .get_result(&mut get_async_db_conn().await?) @@ -405,11 +405,7 @@ pub async fn enqueue( match mg.group_type.as_ref() { "B" => { // get ping nb - let ping_nb = if mg.class_b_ping_slot_period != 0 { - (1 << 12) / mg.class_b_ping_slot_period - } else { - 0 - } as usize; + let ping_nb = 1 << mg.class_b_ping_slot_nb_k as usize; // get max. gps epoch time. let res: Option = @@ -684,7 +680,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_period: 1, + class_b_ping_slot_nb_k: 1, ..Default::default() }) .await @@ -697,7 +693,7 @@ pub mod test { // update mg.name = "test-mg-updated".into(); mg.group_type = "B".into(); - mg.class_b_ping_slot_period = 3; + mg.class_b_ping_slot_nb_k = 4; mg = update(mg).await.unwrap(); let mg_get = get(&mg.id).await.unwrap(); assert_eq!(mg, mg_get); @@ -822,7 +818,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_period: 1, + class_b_ping_slot_nb_k: 1, ..Default::default() }) .await @@ -880,7 +876,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_period: 1, + class_b_ping_slot_nb_k: 1, ..Default::default() }) .await @@ -938,7 +934,7 @@ pub mod test { group_type: "C".into(), dr: 1, frequency: 868100000, - class_b_ping_slot_period: 1, + class_b_ping_slot_nb_k: 1, class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY, ..Default::default() }) diff --git a/chirpstack/src/storage/schema.rs b/chirpstack/src/storage/schema.rs index b8ef82d8..2a5b3aad 100644 --- a/chirpstack/src/storage/schema.rs +++ b/chirpstack/src/storage/schema.rs @@ -243,7 +243,7 @@ diesel::table! { group_type -> Bpchar, dr -> Int2, frequency -> Int8, - class_b_ping_slot_period -> Int4, + class_b_ping_slot_nb_k -> Int2, #[max_length = 20] class_c_scheduling_type -> Varchar, } diff --git a/chirpstack/src/test/multicast_test.rs b/chirpstack/src/test/multicast_test.rs index 9eaba079..5ceb3488 100644 --- a/chirpstack/src/test/multicast_test.rs +++ b/chirpstack/src/test/multicast_test.rs @@ -82,7 +82,7 @@ async fn test_multicast() { group_type: "C".into(), dr: 3, frequency: 868300000, - class_b_ping_slot_period: 32, + class_b_ping_slot_nb_k: 0, ..Default::default() }) .await diff --git a/ui/src/views/multicast-groups/MulticastGroupForm.tsx b/ui/src/views/multicast-groups/MulticastGroupForm.tsx index 0669b01b..0929785f 100644 --- a/ui/src/views/multicast-groups/MulticastGroupForm.tsx +++ b/ui/src/views/multicast-groups/MulticastGroupForm.tsx @@ -47,7 +47,7 @@ function MulticastGroupForm(props: IProps) { mg.setFrequency(v.frequency); mg.setRegion(v.region); mg.setGroupType(v.groupType); - mg.setClassBPingSlotPeriod(v.classBPingSlotPeriod); + mg.setClassBPingSlotNbK(v.classBPingSlotNbK); mg.setClassCSchedulingType(v.classCSchedulingType); props.onFinish(mg); @@ -146,16 +146,16 @@ function MulticastGroupForm(props: IProps) { - +