diff --git a/.gitignore b/.gitignore index 9354cbf8..9ef71cd3 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ # API /api/js/node_modules + +# Bitbake recipes +*.bb diff --git a/chirpstack/Cargo.toml b/chirpstack/Cargo.toml index 06e69188..71287af3 100644 --- a/chirpstack/Cargo.toml +++ b/chirpstack/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "chirpstack" description = "ChirpStack is an open-source LoRaWAN(TM) Network Server" +repository="https://github.com/chirpstack/chirpstack/" version = "4.0.0-test.1" authors = ["Orne Brocaar "] -edition = "2021" +edition = "2018" publish = false license = "MIT" diff --git a/chirpstack/src/api/device.rs b/chirpstack/src/api/device.rs index 2a483ab7..bb600048 100644 --- a/chirpstack/src/api/device.rs +++ b/chirpstack/src/api/device.rs @@ -1,3 +1,4 @@ +use std::convert::TryFrom; use std::str::FromStr; use std::time::SystemTime; diff --git a/chirpstack/src/api/gateway.rs b/chirpstack/src/api/gateway.rs index 1b33c818..d3950b94 100644 --- a/chirpstack/src/api/gateway.rs +++ b/chirpstack/src/api/gateway.rs @@ -1,3 +1,4 @@ +use std::convert::TryFrom; use std::str::FromStr; use std::time::SystemTime; diff --git a/chirpstack/src/certificate.rs b/chirpstack/src/certificate.rs index 56d6cddc..0d18d676 100644 --- a/chirpstack/src/certificate.rs +++ b/chirpstack/src/certificate.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::ops::Add; use std::time::{SystemTime, UNIX_EPOCH}; diff --git a/chirpstack/src/downlink/data.rs b/chirpstack/src/downlink/data.rs index 672eb0fe..49357ac8 100644 --- a/chirpstack/src/downlink/data.rs +++ b/chirpstack/src/downlink/data.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::convert::TryInto; use std::sync::Arc; use std::time::Duration; diff --git a/chirpstack/src/integration/azure_service_bus.rs b/chirpstack/src/integration/azure_service_bus.rs index f1b5ba10..50896492 100644 --- a/chirpstack/src/integration/azure_service_bus.rs +++ b/chirpstack/src/integration/azure_service_bus.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::convert::TryFrom; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use anyhow::Result; diff --git a/chirpstack/src/integration/http.rs b/chirpstack/src/integration/http.rs index 88b2ca4f..7470b66b 100644 --- a/chirpstack/src/integration/http.rs +++ b/chirpstack/src/integration/http.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::convert::TryFrom; use std::time::Duration; use anyhow::Result; diff --git a/chirpstack/src/integration/loracloud/buffer.rs b/chirpstack/src/integration/loracloud/buffer.rs index 3a42f67e..11d0a663 100644 --- a/chirpstack/src/integration/loracloud/buffer.rs +++ b/chirpstack/src/integration/loracloud/buffer.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::io::Cursor; use anyhow::{Context, Result}; diff --git a/chirpstack/src/integration/loracloud/client.rs b/chirpstack/src/integration/loracloud/client.rs index e4a1e88a..7591854d 100644 --- a/chirpstack/src/integration/loracloud/client.rs +++ b/chirpstack/src/integration/loracloud/client.rs @@ -1,3 +1,4 @@ +use std::convert::TryFrom; use std::fmt; use std::time::Duration; diff --git a/chirpstack/src/integration/loracloud/mod.rs b/chirpstack/src/integration/loracloud/mod.rs index a86139a0..67cb5d9c 100644 --- a/chirpstack/src/integration/loracloud/mod.rs +++ b/chirpstack/src/integration/loracloud/mod.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::convert::TryInto; use std::str::FromStr; use anyhow::{Context, Result}; diff --git a/chirpstack/src/storage/multicast.rs b/chirpstack/src/storage/multicast.rs index 809c1ae5..71ca214b 100644 --- a/chirpstack/src/storage/multicast.rs +++ b/chirpstack/src/storage/multicast.rs @@ -341,6 +341,7 @@ pub async fn enqueue( qi: MulticastGroupQueueItem, gateway_ids: &[EUI64], ) -> Result<(Vec, u32), Error> { + let mg_id = qi.multicast_group_id; let (ids, f_cnt) = task::spawn_blocking({ let gateway_ids = gateway_ids.to_vec(); move || -> Result<(Vec, u32), Error> { @@ -503,7 +504,7 @@ pub async fn enqueue( } }) .await??; - info!(multicast_group_id = %qi.multicast_group_id, f_cnt = f_cnt, "Multicast-group queue item created"); + info!(multicast_group_id = %mg_id, f_cnt = f_cnt, "Multicast-group queue item created"); Ok((ids, f_cnt)) } diff --git a/chirpstack/src/test/class_a_test.rs b/chirpstack/src/test/class_a_test.rs index bcacaf43..12f89cc9 100644 --- a/chirpstack/src/test/class_a_test.rs +++ b/chirpstack/src/test/class_a_test.rs @@ -1421,21 +1421,25 @@ async fn test_lorawan_10_uplink() { Test { name: "uplink of class-c device sets lock".into(), device_queue_items: vec![], - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_c = true; - device_profile::update(dp.clone()).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_c = true; + device_profile::update(dp.clone()).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_c = false; - device_profile::update(dp).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_c = false; + device_profile::update(dp).await.unwrap(); + }) + } })), device_session: Some(ds.clone()), tx_info: tx_info.clone(), @@ -2012,21 +2016,25 @@ async fn test_lorawan_10_mac_commands() { Test { name: "unconfirmed uplink + device-status request downlink (FOpts)".into(), device_queue_items: vec![], - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.device_status_req_interval = 1; - device_profile::update(dp.clone()).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.device_status_req_interval = 1; + device_profile::update(dp.clone()).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.device_status_req_interval = 0; - device_profile::update(dp.clone()).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.device_status_req_interval = 0; + device_profile::update(dp.clone()).await.unwrap(); + }) + } })), device_session: Some(ds.clone()), tx_info: tx_info.clone(), @@ -2110,21 +2118,25 @@ async fn test_lorawan_10_mac_commands() { data: vec![1, 2, 3, 4], ..Default::default() }], - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.device_status_req_interval = 1; - device_profile::update(dp.clone()).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.device_status_req_interval = 1; + device_profile::update(dp.clone()).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.device_status_req_interval = 0; - device_profile::update(dp.clone()).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.device_status_req_interval = 0; + device_profile::update(dp.clone()).await.unwrap(); + }) + } })), device_session: Some(ds.clone()), tx_info: tx_info.clone(), @@ -3670,30 +3682,32 @@ async fn test_lorawan_10_adr() { Test { name: "acknowledgement of pending adr request".into(), device_queue_items: vec![], - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - mac_command::set_pending( - &dev_eui, - lrwn::CID::LinkADRReq, - &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( - lrwn::LinkADRReqPayload { - dr: 0, - tx_power: 3, - ch_mask: lrwn::ChMask::new([ - true, true, true, false, false, false, false, false, false, - false, false, false, false, false, false, false, - ]), - redundancy: lrwn::Redundancy { - ch_mask_cntl: 0, - nb_rep: 1, + move || { + Box::pin(async move { + mac_command::set_pending( + &dev_eui, + lrwn::CID::LinkADRReq, + &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( + lrwn::LinkADRReqPayload { + dr: 0, + tx_power: 3, + ch_mask: lrwn::ChMask::new([ + true, true, true, false, false, false, false, false, false, + false, false, false, false, false, false, false, + ]), + redundancy: lrwn::Redundancy { + ch_mask_cntl: 0, + nb_rep: 1, + }, }, - }, - )]), - ) - .await - .unwrap(); - }) + )]), + ) + .await + .unwrap(); + }) + } })), after_func: None, device_session: Some(ds.clone()), @@ -3737,30 +3751,32 @@ async fn test_lorawan_10_adr() { Test { name: "negative acknowledgement of pending adr request".into(), device_queue_items: vec![], - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - mac_command::set_pending( - &dev_eui, - lrwn::CID::LinkADRReq, - &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( - lrwn::LinkADRReqPayload { - dr: 0, - tx_power: 3, - ch_mask: lrwn::ChMask::new([ - true, true, true, false, false, false, false, false, false, - false, false, false, false, false, false, false, - ]), - redundancy: lrwn::Redundancy { - ch_mask_cntl: 0, - nb_rep: 1, + move || { + Box::pin(async move { + mac_command::set_pending( + &dev_eui, + lrwn::CID::LinkADRReq, + &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( + lrwn::LinkADRReqPayload { + dr: 0, + tx_power: 3, + ch_mask: lrwn::ChMask::new([ + true, true, true, false, false, false, false, false, false, + false, false, false, false, false, false, false, + ]), + redundancy: lrwn::Redundancy { + ch_mask_cntl: 0, + nb_rep: 1, + }, }, - }, - )]), - ) - .await - .unwrap(); - }) + )]), + ) + .await + .unwrap(); + }) + } })), after_func: None, device_session: Some(ds.clone()), @@ -3978,30 +3994,32 @@ async fn test_lorawan_10_adr() { Test { name: "new channel re-configuration ack-ed".into(), device_queue_items: vec![], - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - mac_command::set_pending( - &dev_eui, - lrwn::CID::LinkADRReq, - &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( - lrwn::LinkADRReqPayload { - dr: 0, - tx_power: 1, - ch_mask: lrwn::ChMask::new([ - true, true, true, false, false, false, false, false, false, - false, false, false, false, false, false, false, - ]), - redundancy: lrwn::Redundancy { - ch_mask_cntl: 0, - nb_rep: 0, + move || { + Box::pin(async move { + mac_command::set_pending( + &dev_eui, + lrwn::CID::LinkADRReq, + &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( + lrwn::LinkADRReqPayload { + dr: 0, + tx_power: 1, + ch_mask: lrwn::ChMask::new([ + true, true, true, false, false, false, false, false, false, + false, false, false, false, false, false, false, + ]), + redundancy: lrwn::Redundancy { + ch_mask_cntl: 0, + nb_rep: 0, + }, }, - }, - )]), - ) - .await - .unwrap(); - }) + )]), + ) + .await + .unwrap(); + }) + } })), after_func: None, device_session: Some(ds_7chan.clone()), @@ -4043,30 +4061,32 @@ async fn test_lorawan_10_adr() { Test { name: "new channel re-configuration not ack-ed".into(), device_queue_items: vec![], - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - mac_command::set_pending( - &dev_eui, - lrwn::CID::LinkADRReq, - &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( - lrwn::LinkADRReqPayload { - dr: 0, - tx_power: 1, - ch_mask: lrwn::ChMask::new([ - true, true, true, false, false, false, false, false, false, - false, false, false, false, false, false, false, - ]), - redundancy: lrwn::Redundancy { - ch_mask_cntl: 0, - nb_rep: 0, + move || { + Box::pin(async move { + mac_command::set_pending( + &dev_eui, + lrwn::CID::LinkADRReq, + &lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq( + lrwn::LinkADRReqPayload { + dr: 0, + tx_power: 1, + ch_mask: lrwn::ChMask::new([ + true, true, true, false, false, false, false, false, false, + false, false, false, false, false, false, false, + ]), + redundancy: lrwn::Redundancy { + ch_mask_cntl: 0, + nb_rep: 0, + }, }, - }, - )]), - ) - .await - .unwrap(); - }) + )]), + ) + .await + .unwrap(); + }) + } })), after_func: None, device_session: Some(ds_7chan.clone()), diff --git a/chirpstack/src/test/otaa_test.rs b/chirpstack/src/test/otaa_test.rs index c46be5ae..ea448559 100644 --- a/chirpstack/src/test/otaa_test.rs +++ b/chirpstack/src/test/otaa_test.rs @@ -150,11 +150,13 @@ async fn test_gateway_filtering() { let tests = vec![ Test { name: "private gateway of same tenant".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); - }) + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); + }) + } })), after_func: None, rx_info: rx_info_a.clone(), @@ -194,11 +196,13 @@ async fn test_gateway_filtering() { }, Test { name: "private gateway other tenant".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); - }) + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); + }) + } })), after_func: None, rx_info: rx_info_b.clone(), @@ -383,11 +387,13 @@ async fn test_lorawan_10() { }, Test { name: "join-request accepted".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); - }) + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); + }) + } })), after_func: None, rx_info: rx_info.clone(), @@ -567,23 +573,27 @@ async fn test_lorawan_10() { }, Test { name: "join-request accepted + skip fcnt check".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); - let mut dev = device::get(&dev_eui).await.unwrap(); - dev.skip_fcnt_check = true; - let _ = device::update(dev).await.unwrap(); - }) + let mut dev = device::get(&dev_eui).await.unwrap(); + dev.skip_fcnt_check = true; + let _ = device::update(dev).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - let mut dev = device::get(&dev_eui).await.unwrap(); - dev.skip_fcnt_check = false; - let _ = device::update(dev).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dev = device::get(&dev_eui).await.unwrap(); + dev.skip_fcnt_check = false; + let _ = device::update(dev).await.unwrap(); + }) + } })), rx_info: rx_info.clone(), tx_info: tx_info.clone(), @@ -623,11 +633,13 @@ async fn test_lorawan_10() { }, Test { name: "join-request accepted + cflist".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); - }) + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); + }) + } })), after_func: None, rx_info: rx_info.clone(), @@ -775,24 +787,28 @@ async fn test_lorawan_10() { }, Test { name: "join-request accepted + class-b supported".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); let dp_id = dp.id.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_b = true; - let _ = device_profile::update(dp).await.unwrap(); - }) + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_b = true; + let _ = device_profile::update(dp).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_b = false; - let _ = device_profile::update(dp).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_b = false; + let _ = device_profile::update(dp).await.unwrap(); + }) + } })), rx_info: rx_info.clone(), tx_info: tx_info.clone(), @@ -802,24 +818,28 @@ async fn test_lorawan_10() { }, Test { name: "join-request accepted + class-c supported".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); let dp_id = dp.id.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_c = true; - let _ = device_profile::update(dp).await.unwrap(); - }) + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_c = true; + let _ = device_profile::update(dp).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_c = false; - let _ = device_profile::update(dp).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_c = false; + let _ = device_profile::update(dp).await.unwrap(); + }) + } })), rx_info: rx_info.clone(), tx_info: tx_info.clone(), @@ -829,23 +849,27 @@ async fn test_lorawan_10() { }, Test { name: "device disabled".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); - let mut dev = device::get(&dev_eui).await.unwrap(); - dev.is_disabled = true; - let _ = device::update(dev).await.unwrap(); - }) + let mut dev = device::get(&dev_eui).await.unwrap(); + dev.is_disabled = true; + let _ = device::update(dev).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - let mut dev = device::get(&dev_eui).await.unwrap(); - dev.is_disabled = false; - let _ = device::update(dev).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dev = device::get(&dev_eui).await.unwrap(); + dev.is_disabled = false; + let _ = device::update(dev).await.unwrap(); + }) + } })), rx_info: rx_info.clone(), tx_info: tx_info.clone(), @@ -998,11 +1022,13 @@ async fn test_lorawan_11() { }, Test { name: "join-request accepted".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); - }) + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); + }) + } })), after_func: None, rx_info: rx_info.clone(), @@ -1177,24 +1203,28 @@ async fn test_lorawan_11() { }, Test { name: "join-request accepted + class-c supported".into(), - before_func: Some(Box::new(move || { + before_func: Some(Box::new({ let dev_eui = dev.dev_eui.clone(); let dp_id = dp.id.clone(); - Box::pin(async move { - device_keys::reset_nonces(&dev_eui).await.unwrap(); + move || { + Box::pin(async move { + device_keys::reset_nonces(&dev_eui).await.unwrap(); - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_c = true; - let _ = device_profile::update(dp).await.unwrap(); - }) + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_c = true; + let _ = device_profile::update(dp).await.unwrap(); + }) + } })), - after_func: Some(Box::new(move || { + after_func: Some(Box::new({ let dp_id = dp.id.clone(); - Box::pin(async move { - let mut dp = device_profile::get(&dp_id).await.unwrap(); - dp.supports_class_c = false; - let _ = device_profile::update(dp).await.unwrap(); - }) + move || { + Box::pin(async move { + let mut dp = device_profile::get(&dp_id).await.unwrap(); + dp.supports_class_c = false; + let _ = device_profile::update(dp).await.unwrap(); + }) + } })), rx_info: rx_info.clone(), tx_info: tx_info.clone(), diff --git a/chirpstack/src/uplink/data.rs b/chirpstack/src/uplink/data.rs index 51017c83..d6da7447 100644 --- a/chirpstack/src/uplink/data.rs +++ b/chirpstack/src/uplink/data.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::convert::TryInto; use anyhow::{Context, Result}; use chrono::{DateTime, Duration, Local, Utc}; diff --git a/chirpstack/src/uplink/helpers.rs b/chirpstack/src/uplink/helpers.rs index 8597996d..223a9b96 100644 --- a/chirpstack/src/uplink/helpers.rs +++ b/chirpstack/src/uplink/helpers.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::time::{Duration, SystemTime}; use anyhow::Result; diff --git a/chirpstack/src/uplink/stats.rs b/chirpstack/src/uplink/stats.rs index 0f1c7a1e..735b9ac2 100644 --- a/chirpstack/src/uplink/stats.rs +++ b/chirpstack/src/uplink/stats.rs @@ -1,5 +1,6 @@ use std::collections::hash_map::DefaultHasher; use std::collections::HashMap; +use std::convert::TryFrom; use std::hash::{Hash, Hasher}; use anyhow::{Context, Result};