Compare commits

...

8 Commits

Author SHA1 Message Date
Orne Brocaar
7b4f94375c Replace remaining _nb_k fields by _periodicity. 2025-06-06 11:37:44 +01:00
Orne Brocaar
29674fc318 Fix mixing of Class-B _k vs _periodicity.
In the UI the k value (LoRaWAN < 1.0.4) was used as periodicity
(LoRaWAN 1.0.4). This renames the `_nb_k` fields to `_periodicity` to
align with the LoRaWAN 1.0.4 spec and updates the backend code to use
this value as periodicity as defined by the LoRaWAN 1.0.4 spec.

Fixes #670.
2025-06-05 12:13:49 +01:00
Orne Brocaar
8804f774fb lrwn-filters: Update m_type > f_type. 2025-06-02 12:13:51 +01:00
Orne Brocaar
3a0de8196f Rename m_type > f_type to align with LW 1.0.4 naming. 2025-06-02 12:02:32 +01:00
Orne Brocaar
46bb01ccdc Sort NULL values as smallest value (devices and gateways last seen).
Fixes #683.
2025-05-26 14:50:26 +01:00
Alexandre Bertrand
26cca09ce8 Fix custom root ca certificates not taken into account (#684) 2025-05-26 14:03:37 +01:00
Orne Brocaar
c016cd1f7d Update dependencies. 2025-05-26 14:02:39 +01:00
dependabot[bot]
1ead82e8a5 Bump golang.org/x/net from 0.36.0 to 0.38.0 in /api/go (#653)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.36.0 to 0.38.0.
- [Commits](https://github.com/golang/net/compare/v0.36.0...v0.38.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.38.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-26 13:51:30 +01:00
78 changed files with 764 additions and 671 deletions

View File

@@ -28,7 +28,7 @@ jobs:
name: Install Nix
uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-24.11
nix_path: nixpkgs=channel:nixos-25.05
-
name: Cargo cache
uses: actions/cache@v4
@@ -69,7 +69,7 @@ jobs:
name: Install Nix
uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-24.11
nix_path: nixpkgs=channel:nixos-25.05
-
name: Cargo cache
uses: actions/cache@v4

444
Cargo.lock generated

File diff suppressed because it is too large Load Diff

6
api/go/go.mod vendored
View File

@@ -11,8 +11,8 @@ require (
require (
github.com/golang/protobuf v1.5.4 // indirect
golang.org/x/net v0.36.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/net v0.38.0 // indirect
golang.org/x/sys v0.31.0 // indirect
golang.org/x/text v0.23.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa // indirect
)

12
api/go/go.sum vendored
View File

@@ -2,12 +2,12 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
google.golang.org/genproto/googleapis/api v0.0.0-20240325203815-454cdb8f5daa h1:Jt1XW5PaLXF1/ePZrznsh/aAUvI7Adfc3LY1dAKlzRs=
google.golang.org/genproto/googleapis/api v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:K4kfzHtI0kqWA79gecJarFtDn/Mls+GxQcg3Zox91Ac=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa h1:RBgMaUMP+6soRkik4VoN8ojR2nex2TqZwjSSogic+eo=

View File

@@ -240,11 +240,15 @@ message DeviceProfile {
// from the device (if requested).
uint32 class_b_timeout = 16;
// Class-B ping-slots per beacon period.
// Class-B ping-slot periodicity.
// 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 = 17;
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 class_b_ping_slot_periodicity = 17;
// Class-B ping-slot DR.
uint32 class_b_ping_slot_dr = 18;

View File

@@ -117,11 +117,15 @@ message DeviceProfileTemplate {
// This is the maximum time ChirpStack will wait to receive an acknowledgement from the device (if requested).
uint32 class_b_timeout = 18;
// Class-B ping-slots per beacon period.
// Class-B ping-slot periodicity (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 = 19;
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 class_b_ping_slot_periodicity = 19;
// Class-B ping-slot DR.
uint32 class_b_ping_slot_dr = 20;

View File

@@ -104,7 +104,14 @@ message FuotaDeployment {
uint32 multicast_dr = 7;
// Multicast ping-slot period (Class-B only).
uint32 multicast_class_b_ping_slot_nb_k = 8;
// Valid options are: 0 - 7.
//
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 multicast_class_b_ping_slot_periodicity = 8;
// Multicast frequency (Hz).
uint32 multicast_frequency = 9;

View File

@@ -165,15 +165,15 @@ message MulticastGroup {
// Frequency (Hz).
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;
// Class-B ping-slot periodicity (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;
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 class_b_ping_slot_periodicity = 14;
// Scheduling type (only for Class-C).
MulticastGroupSchedulingType class_c_scheduling_type = 13;

View File

@@ -67,7 +67,7 @@ enum Region {
ISM2400 = 11;
}
enum MType {
enum FType {
// JoinRequest.
JOIN_REQUEST = 0;

View File

@@ -24,8 +24,8 @@ message UplinkFrameLog {
// RX meta-data.
repeated gw.UplinkRxInfo rx_info = 3;
// Message type.
common.MType m_type = 4;
// Frame type.
common.FType f_type = 4;
// Device address (optional).
string dev_addr = 5;
@@ -59,8 +59,8 @@ message DownlinkFrameLog {
// Gateway ID (EUI64).
string gateway_id = 5;
// Message type.
common.MType m_type = 6;
// Frame type.
common.FType f_type = 6;
// Device address (optional).
string dev_addr = 7;

View File

@@ -32,8 +32,8 @@ message UplinkMeta {
// Application payload byte count.
uint32 application_payload_byte_count = 6;
// Message type.
common.MType message_type = 7;
// Frame type.
common.FType frame_type = 7;
}
message DownlinkMeta {
@@ -55,8 +55,8 @@ message DownlinkMeta {
// Application payload byte count.
uint32 application_payload_byte_count = 6;
// Message type.
common.MType message_type = 7;
// Frame type.
common.FType frame_type = 7;
// Gateway ID (EUI64).
string gateway_id = 8;

View File

@@ -240,11 +240,15 @@ message DeviceProfile {
// from the device (if requested).
uint32 class_b_timeout = 16;
// Class-B ping-slots per beacon period.
// Class-B ping-slot periodicity.
// 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 = 17;
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 class_b_ping_slot_periodicity = 17;
// Class-B ping-slot DR.
uint32 class_b_ping_slot_dr = 18;

View File

@@ -117,11 +117,15 @@ message DeviceProfileTemplate {
// This is the maximum time ChirpStack will wait to receive an acknowledgement from the device (if requested).
uint32 class_b_timeout = 18;
// Class-B ping-slots per beacon period.
// Class-B ping-slot periodicity (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 = 19;
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 class_b_ping_slot_periodicity = 19;
// Class-B ping-slot DR.
uint32 class_b_ping_slot_dr = 20;

View File

@@ -104,7 +104,14 @@ message FuotaDeployment {
uint32 multicast_dr = 7;
// Multicast ping-slot period (Class-B only).
uint32 multicast_class_b_ping_slot_nb_k = 8;
// Valid options are: 0 - 7.
//
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 multicast_class_b_ping_slot_periodicity = 8;
// Multicast frequency (Hz).
uint32 multicast_frequency = 9;

View File

@@ -165,15 +165,15 @@ message MulticastGroup {
// Frequency (Hz).
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;
// Class-B ping-slot periodicity (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;
// Number of ping-slots per beacon-period:
// pingNb = 2^(7-periodicity)
//
// Periodicity: 0 = 128 ping-slots per beacon period = ~ every 1 sec
// Periodicity: 7 = 1 ping-slot per beacon period = ~ every 128 sec
uint32 class_b_ping_slot_periodicity = 14;
// Scheduling type (only for Class-C).
MulticastGroupSchedulingType class_c_scheduling_type = 13;

View File

@@ -67,7 +67,7 @@ enum Region {
ISM2400 = 11;
}
enum MType {
enum FType {
// JoinRequest.
JOIN_REQUEST = 0;

View File

@@ -24,8 +24,8 @@ message UplinkFrameLog {
// RX meta-data.
repeated gw.UplinkRxInfo rx_info = 3;
// Message type.
common.MType m_type = 4;
// Frame type.
common.FType f_type = 4;
// Device address (optional).
string dev_addr = 5;
@@ -59,8 +59,8 @@ message DownlinkFrameLog {
// Gateway ID (EUI64).
string gateway_id = 5;
// Message type.
common.MType m_type = 6;
// Frame type.
common.FType f_type = 6;
// Device address (optional).
string dev_addr = 7;

View File

@@ -32,8 +32,8 @@ message UplinkMeta {
// Application payload byte count.
uint32 application_payload_byte_count = 6;
// Message type.
common.MType message_type = 7;
// Frame type.
common.FType frame_type = 7;
}
message DownlinkMeta {
@@ -55,8 +55,8 @@ message DownlinkMeta {
// Application payload byte count.
uint32 application_payload_byte_count = 6;
// Message type.
common.MType message_type = 7;
// Frame type.
common.FType frame_type = 7;
// Gateway ID (EUI64).
string gateway_id = 8;

View File

@@ -7,17 +7,17 @@ include!(concat!(env!("OUT_DIR"), "/common/common.rs"));
include!(concat!(env!("OUT_DIR"), "/common/common.serde.rs"));
#[allow(clippy::from_over_into)]
impl Into<String> for MType {
impl Into<String> for FType {
fn into(self) -> String {
match self {
MType::JoinRequest => "JoinRequest",
MType::JoinAccept => "JoinAccept",
MType::UnconfirmedDataUp => "UnconfirmedDataUp",
MType::UnconfirmedDataDown => "UnconfirmedDataDown",
MType::ConfirmedDataUp => "ConfirmedDataUp",
MType::ConfirmedDataDown => "ConfirmedDataDown",
MType::RejoinRequest => "RejoinRequest",
MType::Proprietary => "Proprietary",
FType::JoinRequest => "JoinRequest",
FType::JoinAccept => "JoinAccept",
FType::UnconfirmedDataUp => "UnconfirmedDataUp",
FType::UnconfirmedDataDown => "UnconfirmedDataDown",
FType::ConfirmedDataUp => "ConfirmedDataUp",
FType::ConfirmedDataDown => "ConfirmedDataDown",
FType::RejoinRequest => "RejoinRequest",
FType::Proprietary => "Proprietary",
}
.to_string()
}

View File

@@ -10,7 +10,7 @@
[dependencies]
chirpstack_api = { path = "../api/rust", version = "4.13.0-test.1" }
redis = { version = "0.29", features = [
redis = { version = "0.31", features = [
"cluster-async",
"tokio-rustls-comp",
] }

View File

@@ -34,8 +34,8 @@
tokio-postgres = { version = "0.7", optional = true }
tokio-postgres-rustls = { version = "0.13", optional = true }
bigdecimal = "0.4"
redis = { version = "0.29", features = ["tls-rustls", "tokio-rustls-comp"] }
deadpool-redis = { version = "0.20", features = ["cluster", "serde"] }
redis = { version = "0.31", features = ["tls-rustls", "tokio-rustls-comp"] }
deadpool-redis = { version = "0.21", features = ["cluster", "serde"] }
# Logging
tracing = "0.1"
@@ -137,7 +137,7 @@
] }
# Misc
uuid = { version = "1.16", features = ["v4", "serde"] }
uuid = { version = "1.17", features = ["v4", "serde"] }
chrono = "0.4"
async-trait = "0.1"
aes = "0.8"

View File

@@ -0,0 +1,8 @@
alter table fuota_deployment
rename column multicast_class_b_ping_slot_periodicity to multicast_class_b_ping_slot_nb_k;
alter table multicast_group
rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k;
alter table device_profile_template
rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k;

View File

@@ -0,0 +1,8 @@
alter table device_profile_template
rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity;
alter table multicast_group
rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity;
alter table fuota_deployment
rename column multicast_class_b_ping_slot_nb_k to multicast_class_b_ping_slot_periodicity;

View File

@@ -0,0 +1,8 @@
alter table fuota_deployment
rename column multicast_class_b_ping_slot_periodicity to multicast_class_b_ping_slot_nb_k;
alter table multicast_group
rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k;
alter table device_profile_template
rename column class_b_ping_slot_periodicity to class_b_ping_slot_nb_k;

View File

@@ -0,0 +1,8 @@
alter table device_profile_template
rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity;
alter table multicast_group
rename column class_b_ping_slot_nb_k to class_b_ping_slot_periodicity;
alter table fuota_deployment
rename column multicast_class_b_ping_slot_nb_k to multicast_class_b_ping_slot_periodicity;

View File

@@ -252,7 +252,7 @@ async fn _handle_pr_start_req(b: &[u8]) -> Result<backend::PRStartAnsPayload> {
let pl: backend::PRStartReqPayload = serde_json::from_slice(b)?;
let phy = lrwn::PhyPayload::from_slice(&pl.phy_payload)?;
if phy.mhdr.m_type == lrwn::MType::JoinRequest {
if phy.mhdr.f_type == lrwn::FType::JoinRequest {
_handle_pr_start_req_join(pl, phy).await
} else {
_handle_pr_start_req_data(pl, phy).await

View File

@@ -94,7 +94,7 @@ impl DeviceProfileService for DeviceProfile {
class_b_params: if req_dp.supports_class_b {
Some(fields::ClassBParams {
timeout: req_dp.class_b_timeout as u16,
ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as u8,
ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as u8,
ping_slot_dr: req_dp.class_b_ping_slot_dr as u8,
ping_slot_freq: req_dp.class_b_ping_slot_freq,
})
@@ -205,7 +205,7 @@ impl DeviceProfileService for DeviceProfile {
supports_class_b: dp.supports_class_b,
supports_class_c: dp.supports_class_c,
class_b_timeout: class_b_params.timeout as u32,
class_b_ping_slot_nb_k: class_b_params.ping_slot_nb_k as u32,
class_b_ping_slot_periodicity: class_b_params.ping_slot_periodicity as u32,
class_b_ping_slot_dr: class_b_params.ping_slot_dr as u32,
class_b_ping_slot_freq: class_b_params.ping_slot_freq as u32,
class_c_timeout: class_c_params.timeout as u32,
@@ -350,7 +350,7 @@ impl DeviceProfileService for DeviceProfile {
class_b_params: if req_dp.supports_class_b {
Some(fields::ClassBParams {
timeout: req_dp.class_b_timeout as u16,
ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as u8,
ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as u8,
ping_slot_dr: req_dp.class_b_ping_slot_dr as u8,
ping_slot_freq: req_dp.class_b_ping_slot_freq,
})

View File

@@ -60,7 +60,7 @@ impl DeviceProfileTemplateService for DeviceProfileTemplate {
supports_class_b: req_dp.supports_class_b,
supports_class_c: req_dp.supports_class_c,
class_b_timeout: req_dp.class_b_timeout as i32,
class_b_ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as i32,
class_b_ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as i32,
class_b_ping_slot_dr: req_dp.class_b_ping_slot_dr as i16,
class_b_ping_slot_freq: req_dp.class_b_ping_slot_freq as i64,
class_c_timeout: req_dp.class_c_timeout as i32,
@@ -132,7 +132,7 @@ impl DeviceProfileTemplateService for DeviceProfileTemplate {
supports_class_b: dp.supports_class_b,
supports_class_c: dp.supports_class_c,
class_b_timeout: dp.class_b_timeout as u32,
class_b_ping_slot_nb_k: dp.class_b_ping_slot_nb_k as u32,
class_b_ping_slot_periodicity: dp.class_b_ping_slot_periodicity as u32,
class_b_ping_slot_dr: dp.class_b_ping_slot_dr as u32,
class_b_ping_slot_freq: dp.class_b_ping_slot_freq as u32,
class_c_timeout: dp.class_c_timeout as u32,
@@ -201,7 +201,7 @@ impl DeviceProfileTemplateService for DeviceProfileTemplate {
supports_class_b: req_dp.supports_class_b,
supports_class_c: req_dp.supports_class_c,
class_b_timeout: req_dp.class_b_timeout as i32,
class_b_ping_slot_nb_k: req_dp.class_b_ping_slot_nb_k as i32,
class_b_ping_slot_periodicity: req_dp.class_b_ping_slot_periodicity as i32,
class_b_ping_slot_dr: req_dp.class_b_ping_slot_dr as i16,
class_b_ping_slot_freq: req_dp.class_b_ping_slot_freq as i64,
class_c_timeout: req_dp.class_c_timeout as i32,

View File

@@ -63,7 +63,8 @@ impl FuotaService for Fuota {
.multicast_class_c_scheduling_type()
.from_proto(),
multicast_dr: req_dp.multicast_dr as i16,
multicast_class_b_ping_slot_nb_k: req_dp.multicast_class_b_ping_slot_nb_k as i16,
multicast_class_b_ping_slot_periodicity: req_dp.multicast_class_b_ping_slot_periodicity
as i16,
multicast_frequency: req_dp.multicast_frequency as i64,
multicast_timeout: req_dp.multicast_timeout as i16,
unicast_max_retry_count: req_dp.unicast_max_retry_count as i16,
@@ -138,7 +139,8 @@ impl FuotaService for Fuota {
.to_proto()
.into(),
multicast_dr: dp.multicast_dr as u32,
multicast_class_b_ping_slot_nb_k: dp.multicast_class_b_ping_slot_nb_k as u32,
multicast_class_b_ping_slot_periodicity: dp.multicast_class_b_ping_slot_periodicity
as u32,
multicast_frequency: dp.multicast_frequency as u32,
multicast_timeout: dp.multicast_timeout as u32,
unicast_max_retry_count: dp.unicast_max_retry_count as u32,
@@ -217,7 +219,8 @@ impl FuotaService for Fuota {
.multicast_class_c_scheduling_type()
.from_proto(),
multicast_dr: req_dp.multicast_dr as i16,
multicast_class_b_ping_slot_nb_k: req_dp.multicast_class_b_ping_slot_nb_k as i16,
multicast_class_b_ping_slot_periodicity: req_dp.multicast_class_b_ping_slot_periodicity
as i16,
multicast_frequency: req_dp.multicast_frequency as i64,
multicast_timeout: req_dp.multicast_timeout as i16,
unicast_max_retry_count: req_dp.unicast_max_retry_count as i16,

View File

@@ -193,17 +193,17 @@ impl FromProto<Aggregation> for common::Aggregation {
}
}
impl ToProto<common::MType> for lrwn::MType {
fn to_proto(self) -> common::MType {
impl ToProto<common::FType> for lrwn::FType {
fn to_proto(self) -> common::FType {
match self {
lrwn::MType::JoinRequest => common::MType::JoinRequest,
lrwn::MType::JoinAccept => common::MType::JoinAccept,
lrwn::MType::UnconfirmedDataUp => common::MType::UnconfirmedDataUp,
lrwn::MType::UnconfirmedDataDown => common::MType::UnconfirmedDataDown,
lrwn::MType::ConfirmedDataUp => common::MType::ConfirmedDataUp,
lrwn::MType::ConfirmedDataDown => common::MType::ConfirmedDataDown,
lrwn::MType::RejoinRequest => common::MType::RejoinRequest,
lrwn::MType::Proprietary => common::MType::Proprietary,
lrwn::FType::JoinRequest => common::FType::JoinRequest,
lrwn::FType::JoinAccept => common::FType::JoinAccept,
lrwn::FType::UnconfirmedDataUp => common::FType::UnconfirmedDataUp,
lrwn::FType::UnconfirmedDataDown => common::FType::UnconfirmedDataDown,
lrwn::FType::ConfirmedDataUp => common::FType::ConfirmedDataUp,
lrwn::FType::ConfirmedDataDown => common::FType::ConfirmedDataDown,
lrwn::FType::RejoinRequest => common::FType::RejoinRequest,
lrwn::FType::Proprietary => common::FType::Proprietary,
}
}
}

View File

@@ -61,14 +61,7 @@ impl MulticastGroupService for MulticastGroup {
.to_string(),
dr: req_mg.dr as i16,
frequency: req_mg.frequency as i64,
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_b_ping_slot_periodicity: req_mg.class_b_ping_slot_periodicity as i16,
class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(),
..Default::default()
};
@@ -121,8 +114,7 @@ impl MulticastGroupService for MulticastGroup {
.into(),
dr: mg.dr as u32,
frequency: mg.frequency 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_b_ping_slot_periodicity: mg.class_b_ping_slot_periodicity 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)),
@@ -168,14 +160,7 @@ impl MulticastGroupService for MulticastGroup {
.to_string(),
dr: req_mg.dr as i16,
frequency: req_mg.frequency as i64,
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_b_ping_slot_periodicity: req_mg.class_b_ping_slot_periodicity as i16,
class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(),
..Default::default()
})
@@ -606,7 +591,7 @@ pub mod test {
group_type: api::MulticastGroupType::ClassC.into(),
dr: 3,
frequency: 868300000,
class_b_ping_slot_nb_k: 1,
class_b_ping_slot_periodicity: 1,
class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(),
..Default::default()
}),
@@ -636,8 +621,7 @@ pub mod test {
group_type: api::MulticastGroupType::ClassC.into(),
dr: 3,
frequency: 868300000,
class_b_ping_slot_nb_k: 1,
class_b_ping_slot_period: 64,
class_b_ping_slot_periodicity: 1,
class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(),
}),
get_resp.get_ref().multicast_group
@@ -659,8 +643,7 @@ pub mod test {
group_type: api::MulticastGroupType::ClassB.into(),
dr: 2,
frequency: 868200000,
class_b_ping_slot_nb_k: 2,
class_b_ping_slot_period: 0,
class_b_ping_slot_periodicity: 2,
class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(),
}),
},
@@ -688,8 +671,7 @@ pub mod test {
group_type: api::MulticastGroupType::ClassB.into(),
dr: 2,
frequency: 868200000,
class_b_ping_slot_nb_k: 2,
class_b_ping_slot_period: 128,
class_b_ping_slot_periodicity: 2,
class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(),
}),
get_resp.get_ref().multicast_group

View File

@@ -149,7 +149,9 @@ impl Flow {
group_type: self.fuota_deployment.multicast_group_type.clone(),
frequency: self.fuota_deployment.multicast_frequency,
dr: self.fuota_deployment.multicast_dr,
class_b_ping_slot_nb_k: self.fuota_deployment.multicast_class_b_ping_slot_nb_k,
class_b_ping_slot_periodicity: self
.fuota_deployment
.multicast_class_b_ping_slot_periodicity,
class_c_scheduling_type: self.fuota_deployment.multicast_class_c_scheduling_type,
..Default::default()
})
@@ -577,7 +579,7 @@ impl Flow {
time_out_periodicity:
multicastsetup::v1::McClassBSessionReqPayloadTimeOutPeriodicity {
time_out: self.fuota_deployment.multicast_timeout as u8,
periodicity: self.fuota_deployment.multicast_class_b_ping_slot_nb_k
periodicity: self.fuota_deployment.multicast_class_b_ping_slot_periodicity
as u8,
},
dl_frequ: self.fuota_deployment.multicast_frequency as u32,
@@ -619,7 +621,7 @@ impl Flow {
time_out_periodicity:
multicastsetup::v2::McClassBSessionReqPayloadTimeOutPeriodicity {
time_out: self.fuota_deployment.multicast_timeout as u8,
periodicity: self.fuota_deployment.multicast_class_b_ping_slot_nb_k
periodicity: self.fuota_deployment.multicast_class_b_ping_slot_periodicity
as u8,
},
dl_frequ: self.fuota_deployment.multicast_frequency as u32,

View File

@@ -265,7 +265,7 @@ async fn import_device(
supports_class_b: prof.supports_class_b,
supports_class_c: prof.supports_class_c,
class_b_timeout: prof.class_b_timeout as i32,
class_b_ping_slot_nb_k: match prof.ping_slot_period {
class_b_ping_slot_periodicity: match prof.ping_slot_period {
128 => 7,
64 => 6,
32 => 5,

View File

@@ -94,7 +94,7 @@ pub struct ProfileAbp {
#[derive(Default, Deserialize)]
pub struct ProfileClassB {
pub timeout_secs: usize,
pub ping_slot_nb_k: usize,
pub ping_slot_periodicity: usize,
pub ping_slot_dr: usize,
pub ping_slot_freq: usize,
}
@@ -239,7 +239,7 @@ async fn handle_profile(
supports_class_b: profile_conf.profile.supports_class_b,
supports_class_c: profile_conf.profile.supports_class_c,
class_b_timeout: profile_conf.profile.class_b.timeout_secs as i32,
class_b_ping_slot_nb_k: profile_conf.profile.class_b.ping_slot_nb_k as i32,
class_b_ping_slot_periodicity: profile_conf.profile.class_b.ping_slot_periodicity as i32,
class_b_ping_slot_dr: profile_conf.profile.class_b.ping_slot_dr as i16,
class_b_ping_slot_freq: profile_conf.profile.class_b.ping_slot_freq as i64,
class_c_timeout: profile_conf.profile.class_c.timeout_secs as i32,

View File

@@ -736,7 +736,7 @@ impl Data {
// LoRaWAN MHDR
let mut mhdr = lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
};
@@ -794,7 +794,7 @@ impl Data {
mac_pl.frm_payload = Some(lrwn::FRMPayload::Raw(qi.data.clone()));
if qi.confirmed {
mhdr.m_type = lrwn::MType::ConfirmedDataDown;
mhdr.f_type = lrwn::FType::ConfirmedDataDown;
}
item.remaining_payload_size -= qi.data.len();
@@ -867,7 +867,7 @@ impl Data {
for item in self.downlink_frame.items.iter_mut() {
let mut relay_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -915,7 +915,7 @@ impl Data {
for item in self.downlink_frame_items.iter_mut() {
let mut relay_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -466,7 +466,7 @@ impl JoinAccept<'_> {
let mut relay_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -199,7 +199,7 @@ impl Multicast {
let mut phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -3,7 +3,7 @@ use chrono::{Duration, Utc};
use tracing::{error, info, span, trace, Instrument, Level};
use uuid::Uuid;
use lrwn::{AES128Key, MType, Payload, PhyPayload, EUI64};
use lrwn::{AES128Key, FType, Payload, PhyPayload, EUI64};
use crate::api::helpers::ToProto;
use crate::storage::{
@@ -589,13 +589,13 @@ impl TxAck {
tx_info: dfi.tx_info.clone(),
downlink_id: gw_df.downlink_id,
gateway_id: gw_df.gateway_id.clone(),
m_type: match &phy.mhdr.m_type {
MType::JoinAccept => common::MType::JoinAccept,
MType::UnconfirmedDataDown => common::MType::UnconfirmedDataDown,
MType::ConfirmedDataDown => common::MType::ConfirmedDataDown,
MType::Proprietary => common::MType::Proprietary,
f_type: match &phy.mhdr.f_type {
FType::JoinAccept => common::FType::JoinAccept,
FType::UnconfirmedDataDown => common::FType::UnconfirmedDataDown,
FType::ConfirmedDataDown => common::FType::ConfirmedDataDown,
FType::Proprietary => common::FType::Proprietary,
_ => {
return Err(anyhow!("Unepxected MType: {}", phy.mhdr.m_type));
return Err(anyhow!("Unepxected FType: {}", phy.mhdr.f_type));
}
}
.into(),
@@ -658,7 +658,7 @@ impl TxAck {
tx_info: dfl.tx_info.clone(),
downlink_id: dfl.downlink_id,
gateway_id: dfl.gateway_id.clone(),
m_type: dfl.m_type,
f_type: dfl.f_type,
dev_addr: dfl.dev_addr.clone(),
dev_eui: dfl.dev_eui.clone(),
plaintext_f_opts: true,
@@ -719,7 +719,7 @@ impl TxAck {
} else {
0
} as u32,
message_type: phy.mhdr.m_type.to_proto().into(),
frame_type: phy.mhdr.f_type.to_proto().into(),
gateway_id: df.downlink_frame.as_ref().unwrap().gateway_id.clone(),
};
@@ -803,15 +803,15 @@ impl TxAck {
}
fn is_unconfirmed_downlink(&self) -> bool {
if self.phy_payload.as_ref().unwrap().mhdr.m_type == lrwn::MType::UnconfirmedDataDown {
if self.phy_payload.as_ref().unwrap().mhdr.f_type == lrwn::FType::UnconfirmedDataDown {
return true;
}
false
}
fn is_unconfirmed_downlink_relayed(&self) -> bool {
if self.phy_payload_relayed.as_ref().unwrap().mhdr.m_type
== lrwn::MType::UnconfirmedDataDown
if self.phy_payload_relayed.as_ref().unwrap().mhdr.f_type
== lrwn::FType::UnconfirmedDataDown
{
return true;
}
@@ -819,14 +819,14 @@ impl TxAck {
}
fn is_confirmed_downlink(&self) -> bool {
if self.phy_payload.as_ref().unwrap().mhdr.m_type == lrwn::MType::ConfirmedDataDown {
if self.phy_payload.as_ref().unwrap().mhdr.f_type == lrwn::FType::ConfirmedDataDown {
return true;
}
false
}
fn is_confirmed_downlink_relayed(&self) -> bool {
if self.phy_payload_relayed.as_ref().unwrap().mhdr.m_type == lrwn::MType::ConfirmedDataDown
if self.phy_payload_relayed.as_ref().unwrap().mhdr.f_type == lrwn::FType::ConfirmedDataDown
{
return true;
}

View File

@@ -20,6 +20,7 @@ fn get_client() -> Client {
.get_or_init(|| {
Client::builder()
.timeout(Duration::from_secs(5))
.use_rustls_tls()
.build()
.unwrap()
})

View File

@@ -106,7 +106,7 @@ pub mod test {
ch: 0,
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -53,7 +53,7 @@ pub mod test {
ch: 0,
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -338,7 +338,7 @@ pub mod test {
ch: 0,
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -77,7 +77,7 @@ pub mod test {
ch: 0,
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -175,7 +175,7 @@ pub mod test {
ch: 0,
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -80,7 +80,7 @@ pub mod test {
class_b_params: Some(fields::ClassBParams {
ping_slot_dr: 2,
ping_slot_freq: 868100000,
ping_slot_nb_k: 1,
ping_slot_periodicity: 6,
timeout: 0,
}),
..Default::default()

View File

@@ -730,17 +730,37 @@ pub async fn list(
true => match order_by {
OrderBy::Name => q.order_by(device::dsl::name.desc()),
OrderBy::DevEui => q.order_by(device::dsl::dev_eui.desc()),
OrderBy::LastSeenAt => q
.order_by(device::dsl::last_seen_at.desc())
.then_order_by(device::dsl::name),
OrderBy::LastSeenAt => {
#[cfg(feature = "postgres")]
{
q.order_by(device::dsl::last_seen_at.desc().nulls_last())
.then_order_by(device::dsl::name)
}
#[cfg(feature = "sqlite")]
{
q.order_by(device::dsl::last_seen_at.desc())
.then_order_by(device::dsl::name)
}
}
OrderBy::DeviceProfileName => q.order_by(device_profile::dsl::name.desc()),
},
false => match order_by {
OrderBy::Name => q.order_by(device::dsl::name),
OrderBy::DevEui => q.order_by(device::dsl::dev_eui),
OrderBy::LastSeenAt => q
.order_by(device::dsl::last_seen_at)
.then_order_by(device::dsl::name),
OrderBy::LastSeenAt => {
#[cfg(feature = "postgres")]
{
q.order_by(device::dsl::last_seen_at.asc().nulls_first())
.then_order_by(device::dsl::name)
}
#[cfg(feature = "sqlite")]
{
q.order_by(device::dsl::last_seen_at.asc())
.then_order_by(device::dsl::name)
}
}
OrderBy::DeviceProfileName => q.order_by(device_profile::dsl::name),
},
};
@@ -1662,7 +1682,7 @@ pub mod test {
println!("> {}", tst.name);
let mut phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -110,7 +110,7 @@ impl DeviceProfile {
if let Some(class_b_params) = &self.class_b_params {
ds.class_b_ping_slot_dr = class_b_params.ping_slot_dr as u32;
ds.class_b_ping_slot_freq = class_b_params.ping_slot_freq;
ds.class_b_ping_slot_nb = 1 << class_b_params.ping_slot_nb_k as u32;
ds.class_b_ping_slot_nb = 1 << (7 - class_b_params.ping_slot_periodicity) as u32;
}
if let Some(relay_params) = &self.relay_params {

View File

@@ -37,7 +37,7 @@ pub struct DeviceProfileTemplate {
pub supports_class_b: bool,
pub supports_class_c: bool,
pub class_b_timeout: i32,
pub class_b_ping_slot_nb_k: i32,
pub class_b_ping_slot_periodicity: i32,
pub class_b_ping_slot_dr: i16,
pub class_b_ping_slot_freq: i64,
pub class_c_timeout: i32,
@@ -100,7 +100,7 @@ impl Default for DeviceProfileTemplate {
supports_class_b: false,
supports_class_c: false,
class_b_timeout: 0,
class_b_ping_slot_nb_k: 0,
class_b_ping_slot_periodicity: 0,
class_b_ping_slot_dr: 0,
class_b_ping_slot_freq: 0,
class_c_timeout: 0,
@@ -169,7 +169,8 @@ pub async fn upsert(dp: DeviceProfileTemplate) -> Result<DeviceProfileTemplate,
device_profile_template::supports_class_b.eq(&dp.supports_class_b),
device_profile_template::supports_class_c.eq(&dp.supports_class_c),
device_profile_template::class_b_timeout.eq(&dp.class_b_timeout),
device_profile_template::class_b_ping_slot_nb_k.eq(&dp.class_b_ping_slot_nb_k),
device_profile_template::class_b_ping_slot_periodicity
.eq(&dp.class_b_ping_slot_periodicity),
device_profile_template::class_b_ping_slot_dr.eq(&dp.class_b_ping_slot_dr),
device_profile_template::class_b_ping_slot_freq.eq(&dp.class_b_ping_slot_freq),
device_profile_template::class_c_timeout.eq(&dp.class_c_timeout),
@@ -224,7 +225,8 @@ pub async fn update(dp: DeviceProfileTemplate) -> Result<DeviceProfileTemplate,
device_profile_template::supports_class_b.eq(&dp.supports_class_b),
device_profile_template::supports_class_c.eq(&dp.supports_class_c),
device_profile_template::class_b_timeout.eq(&dp.class_b_timeout),
device_profile_template::class_b_ping_slot_nb_k.eq(&dp.class_b_ping_slot_nb_k),
device_profile_template::class_b_ping_slot_periodicity
.eq(&dp.class_b_ping_slot_periodicity),
device_profile_template::class_b_ping_slot_dr.eq(&dp.class_b_ping_slot_dr),
device_profile_template::class_b_ping_slot_freq.eq(&dp.class_b_ping_slot_freq),
device_profile_template::class_c_timeout.eq(&dp.class_c_timeout),

View File

@@ -61,7 +61,8 @@ impl serialize::ToSql<Text, Sqlite> for AbpParams {
#[cfg_attr(feature = "sqlite", diesel(sql_type = Text))]
pub struct ClassBParams {
pub timeout: u16,
pub ping_slot_nb_k: u8,
#[serde(alias = "ping_slot_nb_k")]
pub ping_slot_periodicity: u8,
pub ping_slot_dr: u8,
pub ping_slot_freq: u32,
}

View File

@@ -33,7 +33,7 @@ pub struct FuotaDeployment {
pub multicast_group_type: String,
pub multicast_class_c_scheduling_type: fields::MulticastGroupSchedulingType,
pub multicast_dr: i16,
pub multicast_class_b_ping_slot_nb_k: i16,
pub multicast_class_b_ping_slot_periodicity: i16,
pub multicast_frequency: i64,
pub multicast_timeout: i16,
pub multicast_session_start: Option<DateTime<Utc>>,
@@ -68,7 +68,7 @@ impl Default for FuotaDeployment {
multicast_group_type: "".into(),
multicast_class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY,
multicast_dr: 0,
multicast_class_b_ping_slot_nb_k: 0,
multicast_class_b_ping_slot_periodicity: 0,
multicast_frequency: 0,
multicast_timeout: 0,
multicast_session_start: None,
@@ -222,8 +222,8 @@ pub async fn update_deployment(d: FuotaDeployment) -> Result<FuotaDeployment, Er
fuota_deployment::multicast_class_c_scheduling_type
.eq(&d.multicast_class_c_scheduling_type),
fuota_deployment::multicast_dr.eq(&d.multicast_dr),
fuota_deployment::multicast_class_b_ping_slot_nb_k
.eq(&d.multicast_class_b_ping_slot_nb_k),
fuota_deployment::multicast_class_b_ping_slot_periodicity
.eq(&d.multicast_class_b_ping_slot_periodicity),
fuota_deployment::multicast_frequency.eq(&d.multicast_frequency),
fuota_deployment::multicast_timeout.eq(&d.multicast_timeout),
fuota_deployment::multicast_session_start.eq(&d.multicast_session_start),
@@ -765,7 +765,7 @@ pub fn get_multicast_timeout(d: &FuotaDeployment) -> Result<usize> {
match d.multicast_group_type.as_ref() {
"B" => {
// Calculate number of ping-slots per beacon period.
let nb_ping_slots = 1 << (d.multicast_class_b_ping_slot_nb_k as usize);
let nb_ping_slots = 1 << (7 - d.multicast_class_b_ping_slot_periodicity as usize);
// Calculate number of beacon-periods needed.
// One beacon period is added as the first ping-slot might be in the next beacon-period.
@@ -1221,7 +1221,7 @@ mod test {
name: "Class-B - 1 / beacon period - 15 fragments".into(),
deployment: FuotaDeployment {
multicast_group_type: "B".into(),
multicast_class_b_ping_slot_nb_k: 0,
multicast_class_b_ping_slot_periodicity: 7,
fragmentation_fragment_size: 10,
fragmentation_redundancy_percentage: 50,
payload: vec![0; 100],
@@ -1234,7 +1234,7 @@ mod test {
name: "Class-B - 1 / beacon period - 16 fragments".into(),
deployment: FuotaDeployment {
multicast_group_type: "B".into(),
multicast_class_b_ping_slot_nb_k: 0,
multicast_class_b_ping_slot_periodicity: 7,
fragmentation_fragment_size: 10,
fragmentation_redundancy_percentage: 60,
payload: vec![0; 100],
@@ -1247,7 +1247,7 @@ mod test {
name: "Class-B - 16 / beacon period - 16 fragments".into(),
deployment: FuotaDeployment {
multicast_group_type: "B".into(),
multicast_class_b_ping_slot_nb_k: 4,
multicast_class_b_ping_slot_periodicity: 3,
fragmentation_fragment_size: 10,
fragmentation_redundancy_percentage: 60,
payload: vec![0; 100],
@@ -1260,7 +1260,7 @@ mod test {
name: "Class-B - 16 / beacon period - 17 fragments".into(),
deployment: FuotaDeployment {
multicast_group_type: "B".into(),
multicast_class_b_ping_slot_nb_k: 4,
multicast_class_b_ping_slot_periodicity: 3,
fragmentation_fragment_size: 10,
fragmentation_redundancy_percentage: 70,
payload: vec![0; 100],

View File

@@ -365,16 +365,36 @@ pub async fn list(
true => match order_by {
OrderBy::Name => q.order_by(gateway::dsl::name.desc()),
OrderBy::GatewayId => q.order_by(gateway::dsl::gateway_id.desc()),
OrderBy::LastSeenAt => q
.order_by(gateway::dsl::last_seen_at.desc())
.then_order_by(gateway::dsl::name),
OrderBy::LastSeenAt => {
#[cfg(feature = "postgres")]
{
q.order_by(gateway::dsl::last_seen_at.desc().nulls_last())
.then_order_by(gateway::dsl::name)
}
#[cfg(feature = "sqlite")]
{
q.order_by(gateway::dsl::last_seen_at.desc())
.then_order_by(gateway::dsl::name)
}
}
},
false => match order_by {
OrderBy::Name => q.order_by(gateway::dsl::name),
OrderBy::GatewayId => q.order_by(gateway::dsl::gateway_id),
OrderBy::LastSeenAt => q
.order_by(gateway::dsl::last_seen_at)
.then_order_by(gateway::dsl::name),
OrderBy::LastSeenAt => {
#[cfg(feature = "postgres")]
{
q.order_by(gateway::dsl::last_seen_at.asc().nulls_first())
.then_order_by(gateway::dsl::name)
}
#[cfg(feature = "sqlite")]
{
q.order_by(gateway::dsl::last_seen_at.asc())
.then_order_by(gateway::dsl::name)
}
}
},
};
@@ -599,7 +619,7 @@ pub mod test {
group_type: "C".into(),
dr: 1,
frequency: 868100000,
class_b_ping_slot_nb_k: 1,
class_b_ping_slot_periodicity: 1,
..Default::default()
})
.await

View File

@@ -33,7 +33,7 @@ pub struct MulticastGroup {
pub group_type: String,
pub dr: i16,
pub frequency: i64,
pub class_b_ping_slot_nb_k: i16,
pub class_b_ping_slot_periodicity: 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_nb_k: 0,
class_b_ping_slot_periodicity: 0,
class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY,
}
}
@@ -167,7 +167,7 @@ pub async fn update(mg: MulticastGroup) -> Result<MulticastGroup, Error> {
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_nb_k.eq(&mg.class_b_ping_slot_nb_k),
multicast_group::class_b_ping_slot_periodicity.eq(&mg.class_b_ping_slot_periodicity),
multicast_group::class_c_scheduling_type.eq(&mg.class_c_scheduling_type),
))
.get_result(&mut get_async_db_conn().await?)
@@ -429,7 +429,7 @@ pub async fn enqueue(
match mg.group_type.as_ref() {
"B" => {
// get ping nb
let ping_nb = 1 << mg.class_b_ping_slot_nb_k as usize;
let ping_nb = 1 << (7 - mg.class_b_ping_slot_periodicity) as usize;
// get max. gps epoch time.
let res: Option<i64> =
@@ -746,7 +746,7 @@ pub mod test {
group_type: "C".into(),
dr: 1,
frequency: 868100000,
class_b_ping_slot_nb_k: 1,
class_b_ping_slot_periodicity: 1,
..Default::default()
})
.await
@@ -759,7 +759,7 @@ pub mod test {
// update
mg.name = "test-mg-updated".into();
mg.group_type = "B".into();
mg.class_b_ping_slot_nb_k = 4;
mg.class_b_ping_slot_periodicity = 4;
mg = update(mg).await.unwrap();
let mg_get = get(&mg.id.into()).await.unwrap();
assert_eq!(mg, mg_get);
@@ -884,7 +884,7 @@ pub mod test {
group_type: "C".into(),
dr: 1,
frequency: 868100000,
class_b_ping_slot_nb_k: 1,
class_b_ping_slot_periodicity: 1,
..Default::default()
})
.await
@@ -942,7 +942,7 @@ pub mod test {
group_type: "C".into(),
dr: 1,
frequency: 868100000,
class_b_ping_slot_nb_k: 1,
class_b_ping_slot_periodicity: 1,
..Default::default()
})
.await
@@ -1002,7 +1002,7 @@ pub mod test {
group_type: "C".into(),
dr: 1,
frequency: 868100000,
class_b_ping_slot_nb_k: 1,
class_b_ping_slot_periodicity: 1,
class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY,
..Default::default()
})

View File

@@ -153,7 +153,7 @@ diesel::table! {
supports_class_b -> Bool,
supports_class_c -> Bool,
class_b_timeout -> Int4,
class_b_ping_slot_nb_k -> Int4,
class_b_ping_slot_periodicity -> Int4,
class_b_ping_slot_dr -> Int2,
class_b_ping_slot_freq -> Int8,
class_c_timeout -> Int4,
@@ -201,7 +201,7 @@ diesel::table! {
#[max_length = 20]
multicast_class_c_scheduling_type -> Varchar,
multicast_dr -> Int2,
multicast_class_b_ping_slot_nb_k -> Int2,
multicast_class_b_ping_slot_periodicity -> Int2,
multicast_frequency -> Int8,
multicast_timeout -> Int2,
multicast_session_start -> Nullable<Timestamptz>,
@@ -295,7 +295,7 @@ diesel::table! {
group_type -> Bpchar,
dr -> Int2,
frequency -> Int8,
class_b_ping_slot_nb_k -> Int2,
class_b_ping_slot_periodicity -> Int2,
#[max_length = 20]
class_c_scheduling_type -> Varchar,
}

View File

@@ -133,7 +133,7 @@ diesel::table! {
supports_class_b -> Bool,
supports_class_c -> Bool,
class_b_timeout -> Integer,
class_b_ping_slot_nb_k -> Integer,
class_b_ping_slot_periodicity -> Integer,
class_b_ping_slot_dr -> SmallInt,
class_b_ping_slot_freq -> BigInt,
class_c_timeout -> Integer,
@@ -178,7 +178,7 @@ diesel::table! {
multicast_group_type -> Text,
multicast_class_c_scheduling_type -> Text,
multicast_dr -> SmallInt,
multicast_class_b_ping_slot_nb_k -> SmallInt,
multicast_class_b_ping_slot_periodicity -> SmallInt,
multicast_frequency -> BigInt,
multicast_timeout -> SmallInt,
multicast_session_start -> Nullable<TimestamptzSqlite>,
@@ -266,7 +266,7 @@ diesel::table! {
group_type -> Text,
dr -> SmallInt,
frequency -> BigInt,
class_b_ping_slot_nb_k -> SmallInt,
class_b_ping_slot_periodicity -> SmallInt,
class_c_scheduling_type -> Text,
}
}

View File

@@ -27,7 +27,7 @@ pub async fn log_uplink_for_gateways(ufl: &stream::UplinkFrameLog) -> Result<()>
phy_payload: ufl.phy_payload.clone(),
tx_info: ufl.tx_info.clone(),
rx_info: vec![rx_info.clone()],
m_type: ufl.m_type,
f_type: ufl.f_type,
dev_addr: ufl.dev_addr.clone(),
dev_eui: ufl.dev_eui.clone(),
time: ufl.time,
@@ -299,7 +299,7 @@ async fn handle_stream(
seconds: t.seconds,
nanos: t.nanos,
}),
description: pl.m_type().into(),
description: pl.f_type().into(),
body: json!({
"phy_payload": phy,
"tx_info": pl.tx_info,
@@ -340,7 +340,7 @@ async fn handle_stream(
seconds: t.seconds,
nanos: t.nanos,
}),
description: pl.m_type().into(),
description: pl.f_type().into(),
body: json!({
"phy_payload": phy,
"tx_info": pl.tx_info,

View File

@@ -80,7 +80,7 @@ async fn test_fns_uplink() {
let data_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -266,7 +266,7 @@ async fn test_sns_uplink() {
let mut data_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -508,7 +508,7 @@ async fn test_sns_roaming_not_allowed() {
let mut data_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -631,7 +631,7 @@ async fn test_sns_dev_not_found() {
let data_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -150,7 +150,7 @@ async fn test_gateway_filtering() {
rx_info: rx_info_a.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -177,7 +177,7 @@ async fn test_gateway_filtering() {
rx_info: rx_info_b.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -292,7 +292,7 @@ async fn test_lorawan_10_errors() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -325,7 +325,7 @@ async fn test_lorawan_10_errors() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -357,7 +357,7 @@ async fn test_lorawan_10_errors() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -379,7 +379,7 @@ async fn test_lorawan_10_errors() {
rx_info: vec![rx_info.clone()],
dev_eui: "0000000000000000".into(),
dev_addr: "01020304".into(),
m_type: common::MType::UnconfirmedDataUp.into(),
f_type: common::FType::UnconfirmedDataUp.into(),
..Default::default()
}),
],
@@ -489,7 +489,7 @@ async fn test_lorawan_11_errors() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -516,7 +516,7 @@ async fn test_lorawan_11_errors() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -633,7 +633,7 @@ async fn test_lorawan_10_skip_f_cnt() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -683,7 +683,7 @@ async fn test_lorawan_10_skip_f_cnt() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -821,7 +821,7 @@ async fn test_lorawan_10_device_disabled() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -949,7 +949,7 @@ async fn test_lorawan_10_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1022,7 +1022,7 @@ async fn test_lorawan_10_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1081,7 +1081,7 @@ async fn test_lorawan_10_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1154,7 +1154,7 @@ async fn test_lorawan_10_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1206,7 +1206,7 @@ async fn test_lorawan_10_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataUp,
f_type: lrwn::FType::ConfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1319,7 +1319,7 @@ async fn test_lorawan_10_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataUp,
f_type: lrwn::FType::ConfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1457,7 +1457,7 @@ async fn test_lorawan_10_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1597,7 +1597,7 @@ async fn test_lorawan_10_end_to_end_enc() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1649,7 +1649,7 @@ async fn test_lorawan_10_end_to_end_enc() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1712,7 +1712,7 @@ async fn test_lorawan_10_end_to_end_enc() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1761,7 +1761,7 @@ async fn test_lorawan_10_end_to_end_enc() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1781,7 +1781,7 @@ async fn test_lorawan_10_end_to_end_enc() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1912,7 +1912,7 @@ async fn test_lorawan_11_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -1971,7 +1971,7 @@ async fn test_lorawan_11_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2145,7 +2145,7 @@ async fn test_lorawan_10_rx_delay() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataUp,
f_type: lrwn::FType::ConfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2267,7 +2267,7 @@ async fn test_lorawan_10_rx_delay() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataUp,
f_type: lrwn::FType::ConfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2389,7 +2389,7 @@ async fn test_lorawan_10_rx_delay() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataUp,
f_type: lrwn::FType::ConfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2431,7 +2431,7 @@ async fn test_lorawan_10_rx_delay() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2455,7 +2455,7 @@ async fn test_lorawan_10_rx_delay() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2602,7 +2602,7 @@ async fn test_lorawan_10_mac_commands() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2622,7 +2622,7 @@ async fn test_lorawan_10_mac_commands() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2645,7 +2645,7 @@ async fn test_lorawan_10_mac_commands() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2701,7 +2701,7 @@ async fn test_lorawan_10_mac_commands() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2721,7 +2721,7 @@ async fn test_lorawan_10_mac_commands() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2744,7 +2744,7 @@ async fn test_lorawan_10_mac_commands() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2779,7 +2779,7 @@ async fn test_lorawan_10_mac_commands() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2803,7 +2803,7 @@ async fn test_lorawan_10_mac_commands() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2823,7 +2823,7 @@ async fn test_lorawan_10_mac_commands() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2937,7 +2937,7 @@ async fn test_lorawan_11_mac_commands() {
let mut phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -2984,7 +2984,7 @@ async fn test_lorawan_11_mac_commands() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3008,7 +3008,7 @@ async fn test_lorawan_11_mac_commands() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3141,7 +3141,7 @@ async fn test_lorawan_10_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3161,7 +3161,7 @@ async fn test_lorawan_10_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3181,7 +3181,7 @@ async fn test_lorawan_10_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3228,7 +3228,7 @@ async fn test_lorawan_10_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3248,7 +3248,7 @@ async fn test_lorawan_10_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3270,7 +3270,7 @@ async fn test_lorawan_10_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3311,7 +3311,7 @@ async fn test_lorawan_10_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3331,7 +3331,7 @@ async fn test_lorawan_10_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataDown,
f_type: lrwn::FType::ConfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3351,7 +3351,7 @@ async fn test_lorawan_10_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataDown,
f_type: lrwn::FType::ConfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3389,7 +3389,7 @@ async fn test_lorawan_10_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3426,7 +3426,7 @@ async fn test_lorawan_10_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3450,7 +3450,7 @@ async fn test_lorawan_10_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3476,7 +3476,7 @@ async fn test_lorawan_10_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3613,7 +3613,7 @@ async fn test_lorawan_11_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3633,7 +3633,7 @@ async fn test_lorawan_11_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3653,7 +3653,7 @@ async fn test_lorawan_11_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3700,7 +3700,7 @@ async fn test_lorawan_11_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3720,7 +3720,7 @@ async fn test_lorawan_11_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3742,7 +3742,7 @@ async fn test_lorawan_11_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3783,7 +3783,7 @@ async fn test_lorawan_11_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3803,7 +3803,7 @@ async fn test_lorawan_11_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataDown,
f_type: lrwn::FType::ConfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3823,7 +3823,7 @@ async fn test_lorawan_11_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataDown,
f_type: lrwn::FType::ConfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3861,7 +3861,7 @@ async fn test_lorawan_11_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3898,7 +3898,7 @@ async fn test_lorawan_11_device_queue() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3924,7 +3924,7 @@ async fn test_lorawan_11_device_queue() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -3950,7 +3950,7 @@ async fn test_lorawan_11_device_queue() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4099,7 +4099,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4123,7 +4123,7 @@ async fn test_lorawan_10_adr() {
assert::downlink_phy_payloads_decoded_f_opts(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4157,7 +4157,7 @@ async fn test_lorawan_10_adr() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4203,7 +4203,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4258,7 +4258,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4323,7 +4323,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4367,7 +4367,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4392,7 +4392,7 @@ async fn test_lorawan_10_adr() {
assert::downlink_phy_payloads(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4412,7 +4412,7 @@ async fn test_lorawan_10_adr() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4444,7 +4444,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4464,7 +4464,7 @@ async fn test_lorawan_10_adr() {
assert::downlink_phy_payloads_decoded_f_opts(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4496,7 +4496,7 @@ async fn test_lorawan_10_adr() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4562,7 +4562,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4625,7 +4625,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4666,7 +4666,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4691,7 +4691,7 @@ async fn test_lorawan_10_adr() {
assert::downlink_phy_payloads_decoded_f_opts(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4723,7 +4723,7 @@ async fn test_lorawan_10_adr() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4768,7 +4768,7 @@ async fn test_lorawan_10_adr() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4911,7 +4911,7 @@ async fn test_lorawan_10_device_status_request() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4930,7 +4930,7 @@ async fn test_lorawan_10_device_status_request() {
assert::downlink_phy_payloads_decoded_f_opts(vec![
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4953,7 +4953,7 @@ async fn test_lorawan_10_device_status_request() {
},
lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -4988,7 +4988,7 @@ async fn test_lorawan_10_device_status_request() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -5019,7 +5019,7 @@ async fn test_lorawan_10_device_status_request() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -5181,7 +5181,7 @@ async fn test_lorawan_11_receive_window_selection() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -5251,7 +5251,7 @@ async fn test_lorawan_11_receive_window_selection() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -5321,7 +5321,7 @@ async fn test_lorawan_11_receive_window_selection() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -5420,7 +5420,7 @@ async fn test_lorawan_11_receive_window_selection() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -133,7 +133,7 @@ async fn test_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -168,7 +168,7 @@ async fn test_uplink() {
rx_info: rx_info.clone(),
phy_payload: lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -86,7 +86,7 @@ async fn test_multicast() {
group_type: "C".into(),
dr: 3,
frequency: 868300000,
class_b_ping_slot_nb_k: 0,
class_b_ping_slot_periodicity: 0,
..Default::default()
})
.await

View File

@@ -85,7 +85,7 @@ async fn test_js() {
let phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {
@@ -98,7 +98,7 @@ async fn test_js() {
let phy_ja = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinAccept,
f_type: lrwn::FType::JoinAccept,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinAccept(lrwn::JoinAcceptPayload {

View File

@@ -84,7 +84,7 @@ async fn test_fns() {
let mut jr_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {
@@ -319,7 +319,7 @@ async fn test_sns() {
let mut jr_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {
@@ -504,7 +504,7 @@ async fn test_sns_roaming_not_allowed() {
let mut jr_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {

View File

@@ -134,7 +134,7 @@ async fn test_gateway_filtering() {
let mut jr_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {
@@ -291,7 +291,7 @@ async fn test_lorawan_10() {
let mut jr_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {
@@ -305,7 +305,7 @@ async fn test_lorawan_10() {
let mut ja_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinAccept,
f_type: lrwn::FType::JoinAccept,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinAccept(lrwn::JoinAcceptPayload {
@@ -334,7 +334,7 @@ async fn test_lorawan_10() {
let mut ja_cflist_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinAccept,
f_type: lrwn::FType::JoinAccept,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinAccept(lrwn::JoinAcceptPayload {
@@ -561,7 +561,7 @@ async fn test_lorawan_10() {
tx_info: Some(tx_info.clone()),
rx_info: vec![rx_info.clone()],
phy_payload_byte_count: 23,
message_type: common::MType::JoinRequest.into(),
frame_type: common::FType::JoinRequest.into(),
..Default::default()
}),
],
@@ -942,7 +942,7 @@ async fn test_lorawan_11() {
let mut jr_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {
@@ -956,7 +956,7 @@ async fn test_lorawan_11() {
let mut ja_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinAccept,
f_type: lrwn::FType::JoinAccept,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinAccept(lrwn::JoinAcceptPayload {

View File

@@ -164,7 +164,7 @@ async fn test_lorawan_10() {
let mut phy_relay_ed_unconfirmed_up = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -196,7 +196,7 @@ async fn test_lorawan_10() {
let mut phy_relay_ed_confirmed_up = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataUp,
f_type: lrwn::FType::ConfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -228,7 +228,7 @@ async fn test_lorawan_10() {
let mut phy_relay_unconfirmed_up = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -267,7 +267,7 @@ async fn test_lorawan_10() {
let mut phy_relay_unconfirmed_up_adr_ack_req = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -310,7 +310,7 @@ async fn test_lorawan_10() {
let mut phy_relay_confirmed_up = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -349,7 +349,7 @@ async fn test_lorawan_10() {
let mut phy_relay_ed_unconfirmed_down_ack = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -378,7 +378,7 @@ async fn test_lorawan_10() {
let mut phy_relay_unconfirmed_down_ack = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -413,7 +413,7 @@ async fn test_lorawan_10() {
let mut phy_relay_unconfirmed_down_empty = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -138,7 +138,7 @@ async fn test_lorawan_10() {
let mut jr_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {
@@ -152,7 +152,7 @@ async fn test_lorawan_10() {
let mut ja_pl = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinAccept,
f_type: lrwn::FType::JoinAccept,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinAccept(lrwn::JoinAcceptPayload {
@@ -181,7 +181,7 @@ async fn test_lorawan_10() {
let mut phy_relay_jr = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -233,7 +233,7 @@ async fn test_lorawan_10() {
let mut phy_relay_ja = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
f_type: lrwn::FType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {

View File

@@ -716,7 +716,7 @@ impl Data {
0
}
} as u32,
message_type: self.phy_payload.mhdr.m_type.to_proto().into(),
frame_type: self.phy_payload.mhdr.f_type.to_proto().into(),
};
stream::meta::log_uplink(&um).await?;
@@ -907,7 +907,7 @@ impl Data {
dr: self.uplink_frame_set.dr as u32,
f_cnt: self.f_cnt_up_full,
f_port: mac.f_port.unwrap_or(0) as u32,
confirmed: self.phy_payload.mhdr.m_type == lrwn::MType::ConfirmedDataUp,
confirmed: self.phy_payload.mhdr.f_type == lrwn::FType::ConfirmedDataUp,
data: match &mac.frm_payload {
Some(lrwn::FRMPayload::Raw(b)) => b.clone(),
_ => Vec::new(),
@@ -1288,7 +1288,7 @@ impl Data {
self.device_profile.as_ref().cloned().unwrap(),
self.device.as_ref().cloned().unwrap(),
pl.fhdr.f_ctrl.adr_ack_req || self.must_send_downlink,
self.phy_payload.mhdr.m_type == lrwn::MType::ConfirmedDataUp,
self.phy_payload.mhdr.f_type == lrwn::FType::ConfirmedDataUp,
self.downlink_mac_commands.clone(),
)
.await?;
@@ -1331,7 +1331,7 @@ impl Data {
self.device_profile.as_ref().cloned().unwrap(),
self.device.as_ref().cloned().unwrap(),
pl.fhdr.f_ctrl.adr_ack_req || self.must_send_downlink,
self.phy_payload.mhdr.m_type == lrwn::MType::ConfirmedDataUp,
self.phy_payload.mhdr.f_type == lrwn::FType::ConfirmedDataUp,
self.downlink_mac_commands.clone(),
)
.await?;
@@ -1345,29 +1345,29 @@ impl Data {
if let lrwn::Payload::MACPayload(relay_pl) = &self.phy_payload.payload {
if let Some(lrwn::FRMPayload::ForwardUplinkReq(pl)) = &relay_pl.frm_payload {
match pl.payload.mhdr.m_type {
lrwn::MType::JoinRequest => {
match pl.payload.mhdr.f_type {
lrwn::FType::JoinRequest => {
super::join::JoinRequest::handle_relayed(
super::RelayContext {
req: pl.clone(),
device: self.device.as_ref().unwrap().clone(),
device_profile: self.device_profile.as_ref().unwrap().clone(),
must_ack: self.phy_payload.mhdr.m_type
== lrwn::MType::ConfirmedDataUp,
must_ack: self.phy_payload.mhdr.f_type
== lrwn::FType::ConfirmedDataUp,
must_send_downlink: relay_pl.fhdr.f_ctrl.adr_ack_req,
},
self.uplink_frame_set.clone(),
)
.await
}
lrwn::MType::UnconfirmedDataUp | lrwn::MType::ConfirmedDataUp => {
lrwn::FType::UnconfirmedDataUp | lrwn::FType::ConfirmedDataUp => {
Data::handle_relayed(
super::RelayContext {
req: pl.clone(),
device: self.device.as_ref().unwrap().clone(),
device_profile: self.device_profile.as_ref().unwrap().clone(),
must_ack: self.phy_payload.mhdr.m_type
== lrwn::MType::ConfirmedDataUp,
must_ack: self.phy_payload.mhdr.f_type
== lrwn::FType::ConfirmedDataUp,
must_send_downlink: relay_pl.fhdr.f_ctrl.adr_ack_req,
},
self.device_gateway_rx_info.as_ref().unwrap().clone(),
@@ -1377,8 +1377,8 @@ impl Data {
}
_ => {
return Err(anyhow!(
"Handling ForwardUplinkReq for MType {} supported",
pl.payload.mhdr.m_type
"Handling ForwardUplinkReq for FType {} supported",
pl.payload.mhdr.f_type
));
}
}

View File

@@ -6,7 +6,7 @@ use chrono::{DateTime, Local, Utc};
use tracing::{error, info, span, trace, warn, Instrument, Level};
use lrwn::{
keys, AES128Key, CFList, DLSettings, JoinAcceptPayload, JoinRequestPayload, JoinType, MType,
keys, AES128Key, CFList, DLSettings, FType, JoinAcceptPayload, JoinRequestPayload, JoinType,
Major, Payload, PhyPayload, MHDR,
};
@@ -636,7 +636,7 @@ impl JoinRequest {
let mut phy = PhyPayload {
mhdr: MHDR {
m_type: MType::JoinAccept,
f_type: FType::JoinAccept,
major: Major::LoRaWANR1,
},
payload: Payload::JoinAccept(JoinAcceptPayload {
@@ -757,7 +757,7 @@ impl JoinRequest {
dev_eui: self.device.as_ref().unwrap().dev_eui.to_string(),
tx_info: Some(self.uplink_frame_set.tx_info.clone()),
rx_info: self.uplink_frame_set.rx_info_set.clone(),
message_type: common::MType::JoinRequest.into(),
frame_type: common::FType::JoinRequest.into(),
phy_payload_byte_count: self.uplink_frame_set.phy_payload.to_vec()?.len() as u32,
..Default::default()
};

View File

@@ -431,7 +431,7 @@ impl JoinRequest {
let mut phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinAccept,
f_type: lrwn::FType::JoinAccept,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinAccept(lrwn::JoinAcceptPayload {
@@ -552,7 +552,7 @@ impl JoinRequest {
dev_eui: self.device.as_ref().unwrap().dev_eui.to_string(),
tx_info: Some(self.uplink_frame_set.tx_info.clone()),
rx_info: self.uplink_frame_set.rx_info_set.clone(),
message_type: common::MType::JoinRequest.into(),
frame_type: common::FType::JoinRequest.into(),
phy_payload_byte_count: self.uplink_frame_set.phy_payload.to_vec()?.len() as u32,
..Default::default()
};

View File

@@ -24,7 +24,7 @@ use crate::storage::{
use crate::stream;
use chirpstack_api::{common, gw, stream as stream_pb};
use lrwn::region::CommonName;
use lrwn::{ForwardUplinkReq, MType, PhyPayload, EUI64};
use lrwn::{FType, ForwardUplinkReq, PhyPayload, EUI64};
mod data;
mod data_fns;
@@ -39,7 +39,7 @@ pub mod stats;
#[derive(Clone, Hash, PartialEq, Eq, EncodeLabelSet, Debug)]
struct UplinkLabels {
m_type: String,
f_type: String,
}
static UPLINK_COUNTER: LazyLock<Family<UplinkLabels, Counter>> = LazyLock::new(|| {
@@ -105,16 +105,16 @@ impl TryFrom<&UplinkFrameSet> for stream_pb::UplinkFrameLog {
phy_payload: ufs.phy_payload.to_vec()?,
tx_info: Some(ufs.tx_info.clone()),
rx_info: ufs.rx_info_set.clone(),
m_type: match ufs.phy_payload.mhdr.m_type {
lrwn::MType::JoinRequest => common::MType::JoinRequest,
lrwn::MType::RejoinRequest => common::MType::RejoinRequest,
lrwn::MType::UnconfirmedDataUp => common::MType::UnconfirmedDataUp,
lrwn::MType::ConfirmedDataUp => common::MType::ConfirmedDataUp,
lrwn::MType::Proprietary => common::MType::Proprietary,
f_type: match ufs.phy_payload.mhdr.f_type {
lrwn::FType::JoinRequest => common::FType::JoinRequest,
lrwn::FType::RejoinRequest => common::FType::RejoinRequest,
lrwn::FType::UnconfirmedDataUp => common::FType::UnconfirmedDataUp,
lrwn::FType::ConfirmedDataUp => common::FType::ConfirmedDataUp,
lrwn::FType::Proprietary => common::FType::Proprietary,
_ => {
return Err(anyhow!(
"Unexpected m_type: {}",
ufs.phy_payload.mhdr.m_type
"Unexpected f_type: {}",
ufs.phy_payload.mhdr.f_type
));
}
}
@@ -324,7 +324,7 @@ pub async fn handle_uplink(
UPLINK_COUNTER
.get_or_create(&UplinkLabels {
m_type: uplink.phy_payload.mhdr.m_type.to_string(),
f_type: uplink.phy_payload.mhdr.f_type.to_string(),
})
.inc();
@@ -336,7 +336,7 @@ pub async fn handle_uplink(
)?;
info!(
m_type = %uplink.phy_payload.mhdr.m_type,
f_type = %uplink.phy_payload.mhdr.f_type,
"Uplink received"
);
@@ -351,13 +351,13 @@ pub async fn handle_uplink(
.await
.context("Log uplink for gateways")?;
match uplink.phy_payload.mhdr.m_type {
MType::JoinRequest => join::JoinRequest::handle(uplink).await,
MType::UnconfirmedDataUp | MType::ConfirmedDataUp => data::Data::handle(uplink).await,
match uplink.phy_payload.mhdr.f_type {
FType::JoinRequest => join::JoinRequest::handle(uplink).await,
FType::UnconfirmedDataUp | FType::ConfirmedDataUp => data::Data::handle(uplink).await,
_ => {
return Err(anyhow!(
"Unexpected m_type: {}",
uplink.phy_payload.mhdr.m_type
"Unexpected f_type: {}",
uplink.phy_payload.mhdr.f_type
))
}
}

View File

@@ -30,9 +30,9 @@ pub fn matches(phy_payload: &[u8], config: &Filters) -> bool {
}
let mhdr = phy_payload[0];
let m_type = mhdr >> 5;
let f_type = mhdr >> 5;
let dev_addr: Option<[u8; 4]> = match m_type {
let dev_addr: Option<[u8; 4]> = match f_type {
// DataUp
0x02 | 0x04 => {
// MHDR + DevAddr
@@ -48,7 +48,7 @@ pub fn matches(phy_payload: &[u8], config: &Filters) -> bool {
_ => None,
};
let join_eui: Option<[u8; 8]> = match m_type {
let join_eui: Option<[u8; 8]> = match f_type {
// JoinRequest
0x00 => {
// MHDR + JoinEUI + DevEUI
@@ -362,7 +362,7 @@ mod test {
println!("> {}", test.name);
let phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataUp,
f_type: lrwn::FType::UnconfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -382,7 +382,7 @@ mod test {
let phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::ConfirmedDataUp,
f_type: lrwn::FType::ConfirmedDataUp,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
@@ -457,7 +457,7 @@ mod test {
println!("> {}", test.name);
let phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::JoinRequest,
f_type: lrwn::FType::JoinRequest,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::JoinRequest(lrwn::JoinRequestPayload {

View File

@@ -6,7 +6,7 @@ use serde::Serialize;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub enum MType {
pub enum FType {
JoinRequest,
JoinAccept,
UnconfirmedDataUp,
@@ -17,7 +17,7 @@ pub enum MType {
Proprietary,
}
impl fmt::Display for MType {
impl fmt::Display for FType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
@@ -32,22 +32,22 @@ pub enum Major {
#[derive(Debug, PartialEq, Eq, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct MHDR {
pub m_type: MType,
pub f_type: FType,
pub major: Major,
}
impl MHDR {
pub fn from_le_bytes(b: [u8; 1]) -> Result<Self> {
Ok(MHDR {
m_type: match b[0] >> 5 {
0x00 => MType::JoinRequest,
0x01 => MType::JoinAccept,
0x02 => MType::UnconfirmedDataUp,
0x03 => MType::UnconfirmedDataDown,
0x04 => MType::ConfirmedDataUp,
0x05 => MType::ConfirmedDataDown,
0x06 => MType::RejoinRequest,
0x07 => MType::Proprietary,
f_type: match b[0] >> 5 {
0x00 => FType::JoinRequest,
0x01 => FType::JoinAccept,
0x02 => FType::UnconfirmedDataUp,
0x03 => FType::UnconfirmedDataDown,
0x04 => FType::ConfirmedDataUp,
0x05 => FType::ConfirmedDataDown,
0x06 => FType::RejoinRequest,
0x07 => FType::Proprietary,
_ => return Err(anyhow!("unexpected mtype")),
},
major: match b[0] & 0x03 {
@@ -58,15 +58,15 @@ impl MHDR {
}
pub fn to_le_bytes(&self) -> [u8; 1] {
let mut mhdr = match self.m_type {
MType::JoinRequest => 0x00,
MType::JoinAccept => 0x01,
MType::UnconfirmedDataUp => 0x02,
MType::UnconfirmedDataDown => 0x03,
MType::ConfirmedDataUp => 0x04,
MType::ConfirmedDataDown => 0x05,
MType::RejoinRequest => 0x06,
MType::Proprietary => 0x07,
let mut mhdr = match self.f_type {
FType::JoinRequest => 0x00,
FType::JoinAccept => 0x01,
FType::UnconfirmedDataUp => 0x02,
FType::UnconfirmedDataDown => 0x03,
FType::ConfirmedDataUp => 0x04,
FType::ConfirmedDataDown => 0x05,
FType::RejoinRequest => 0x06,
FType::Proprietary => 0x07,
};
mhdr = (mhdr << 5)
@@ -85,7 +85,7 @@ mod tests {
#[test]
fn test_to_le_bytes() {
let mhdr = MHDR {
m_type: MType::Proprietary,
f_type: FType::Proprietary,
major: Major::LoRaWANR1,
};
@@ -98,7 +98,7 @@ mod tests {
assert_eq!(
mhdr,
MHDR {
m_type: MType::Proprietary,
f_type: FType::Proprietary,
major: Major::LoRaWANR1,
}
);

View File

@@ -9,7 +9,7 @@ use crate::eui64::EUI64;
use crate::fhdr::FCtrl;
use crate::fhdr::FHDR;
use crate::maccommand::MACCommandSet;
use crate::mhdr::MType;
use crate::mhdr::FType;
use crate::netid::NetID;
use crate::relay::{ForwardDownlinkReq, ForwardUplinkReq};
@@ -50,15 +50,15 @@ pub enum JoinType {
}
impl Payload {
pub fn from_slice(m_type: MType, b: &[u8]) -> Result<Self> {
Ok(match m_type {
MType::JoinRequest => Payload::JoinRequest(JoinRequestPayload::from_slice(b)?),
MType::JoinAccept => Payload::Raw(b.to_vec()), // the join-accept is encrypted
MType::UnconfirmedDataUp
| MType::ConfirmedDataUp
| MType::UnconfirmedDataDown
| MType::ConfirmedDataDown => Payload::MACPayload(MACPayload::from_slice(b)?),
MType::RejoinRequest => {
pub fn from_slice(f_type: FType, b: &[u8]) -> Result<Self> {
Ok(match f_type {
FType::JoinRequest => Payload::JoinRequest(JoinRequestPayload::from_slice(b)?),
FType::JoinAccept => Payload::Raw(b.to_vec()), // the join-accept is encrypted
FType::UnconfirmedDataUp
| FType::ConfirmedDataUp
| FType::UnconfirmedDataDown
| FType::ConfirmedDataDown => Payload::MACPayload(MACPayload::from_slice(b)?),
FType::RejoinRequest => {
if b.is_empty() {
return Err(anyhow!("RejoinRequest payload is empty"));
}
@@ -73,7 +73,7 @@ impl Payload {
}
}
}
MType::Proprietary => Payload::Raw(b.to_vec()),
FType::Proprietary => Payload::Raw(b.to_vec()),
})
}
@@ -453,7 +453,7 @@ mod tests {
assert_eq!(tst.bytes, tst.pl.to_vec().unwrap());
assert_eq!(
tst.pl,
Payload::from_slice(MType::JoinRequest, &tst.bytes).unwrap()
Payload::from_slice(FType::JoinRequest, &tst.bytes).unwrap()
);
}
}
@@ -464,7 +464,7 @@ mod tests {
// before it can be decoded
assert_eq!(
Payload::Raw(vec![0x01, 0x02, 0x03]),
Payload::from_slice(MType::JoinAccept, &[0x01, 0x02, 0x03]).unwrap()
Payload::from_slice(FType::JoinAccept, &[0x01, 0x02, 0x03]).unwrap()
);
// test decoding the (decrypted) join-accept payload
@@ -611,7 +611,7 @@ mod tests {
assert_eq!(tst.bytes, tst.pl.to_vec().unwrap());
assert_eq!(
tst.pl,
Payload::from_slice(MType::UnconfirmedDataUp, &tst.bytes).unwrap()
Payload::from_slice(FType::UnconfirmedDataUp, &tst.bytes).unwrap()
);
}
}
@@ -661,7 +661,7 @@ mod tests {
assert_eq!(tst.bytes, tst.pl.to_vec().unwrap());
assert_eq!(
tst.pl,
Payload::from_slice(MType::RejoinRequest, &tst.bytes).unwrap()
Payload::from_slice(FType::RejoinRequest, &tst.bytes).unwrap()
);
}
}
@@ -677,7 +677,7 @@ mod tests {
assert_eq!(tst.bytes, tst.pl.to_vec().unwrap());
assert_eq!(
tst.pl,
Payload::from_slice(MType::Proprietary, &tst.bytes).unwrap()
Payload::from_slice(FType::Proprietary, &tst.bytes).unwrap()
);
}
}

View File

@@ -10,7 +10,7 @@ use cmac::{Cmac, Mac};
use serde::Serialize;
use super::maccommand::{MACCommand, MACCommandSet};
use super::mhdr::{MType, MHDR};
use super::mhdr::{FType, MHDR};
use super::payload::{FRMPayload, MACPayload, Payload};
#[cfg(feature = "crypto")]
use super::{
@@ -40,7 +40,7 @@ pub enum MACVersion {
///
/// let mut phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::JoinRequest,
/// f_type: FType::JoinRequest,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::JoinRequest(JoinRequestPayload {
@@ -73,7 +73,7 @@ pub enum MACVersion {
///
/// let mut phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::JoinAccept,
/// f_type: FType::JoinAccept,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::JoinAccept(JoinAcceptPayload {
@@ -105,7 +105,7 @@ pub enum MACVersion {
///
/// assert_eq!(PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::JoinAccept,
/// f_type: FType::JoinAccept,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::JoinAccept(JoinAcceptPayload {
@@ -135,7 +135,7 @@ pub enum MACVersion {
///
/// let mut phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::JoinAccept,
/// f_type: FType::JoinAccept,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::JoinAccept(JoinAcceptPayload {
@@ -167,7 +167,7 @@ pub enum MACVersion {
///
/// assert_eq!(PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::JoinAccept,
/// f_type: FType::JoinAccept,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::JoinAccept(JoinAcceptPayload {
@@ -196,7 +196,7 @@ pub enum MACVersion {
///
/// let mut phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::ConfirmedDataUp,
/// f_type: FType::ConfirmedDataUp,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::MACPayload(MACPayload{
@@ -250,7 +250,7 @@ pub enum MACVersion {
///
/// let mut phy = PhyPayload {
/// mhdr: MHDR{
/// m_type: MType::UnconfirmedDataDown,
/// f_type: FType::UnconfirmedDataDown,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::MACPayload(MACPayload{
@@ -309,7 +309,7 @@ pub enum MACVersion {
///
/// let phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::Proprietary,
/// f_type: FType::Proprietary,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::Raw(vec![0x01, 0x02, 0x03]),
@@ -332,7 +332,7 @@ pub enum MACVersion {
/// let ed_app_key = AES128Key::from_str("01020304050607080102030405060708").unwrap();
/// let mut ed_phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::JoinRequest,
/// f_type: FType::JoinRequest,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::JoinRequest(JoinRequestPayload {
@@ -349,7 +349,7 @@ pub enum MACVersion {
/// let relay_nwk_s_key = AES128Key::from_str("08070605040302010807060504030201").unwrap();
/// let mut relay_phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::UnconfirmedDataUp,
/// f_type: FType::UnconfirmedDataUp,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::MACPayload(MACPayload {
@@ -384,7 +384,7 @@ pub enum MACVersion {
/// relay_phy_decoded.decrypt_frm_payload(&relay_nwk_s_key).unwrap();
/// assert_eq!(PhyPayload{
/// mhdr: MHDR {
/// m_type: MType::UnconfirmedDataUp,
/// f_type: FType::UnconfirmedDataUp,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::MACPayload(MACPayload {
@@ -420,7 +420,7 @@ pub enum MACVersion {
/// let ed_dev_nonce = 258;
/// let mut ed_phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::JoinAccept,
/// f_type: FType::JoinAccept,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::JoinAccept(JoinAcceptPayload {
@@ -445,7 +445,7 @@ pub enum MACVersion {
/// let relay_nwk_s_key = AES128Key::from_str("08070605040302010807060504030201").unwrap();
/// let mut relay_phy = PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::UnconfirmedDataDown,
/// f_type: FType::UnconfirmedDataDown,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::MACPayload(MACPayload {
@@ -473,7 +473,7 @@ pub enum MACVersion {
/// relay_phy_decoded.decrypt_frm_payload(&relay_nwk_s_key).unwrap();
/// assert_eq!(PhyPayload {
/// mhdr: MHDR {
/// m_type: MType::UnconfirmedDataDown,
/// f_type: FType::UnconfirmedDataDown,
/// major: Major::LoRaWANR1,
/// },
/// payload: Payload::MACPayload(MACPayload {
@@ -526,10 +526,10 @@ impl PhyPayload {
MHDR::from_le_bytes(mhdr)?
};
if mhdr.m_type == MType::Proprietary {
if mhdr.f_type == FType::Proprietary {
return Ok(PhyPayload {
mhdr,
payload: Payload::from_slice(MType::Proprietary, &b[1..])?,
payload: Payload::from_slice(FType::Proprietary, &b[1..])?,
mic: None,
});
}
@@ -541,13 +541,13 @@ impl PhyPayload {
));
}
let m_type = mhdr.m_type;
let f_type = mhdr.f_type;
let mut mic: [u8; 4] = [0; 4];
mic.clone_from_slice(&b[b_len - 4..]);
Ok(PhyPayload {
mhdr,
payload: Payload::from_slice(m_type, &b[1..b_len - 4])?,
payload: Payload::from_slice(f_type, &b[1..b_len - 4])?,
mic: Some(mic),
})
}
@@ -808,7 +808,7 @@ impl PhyPayload {
return Ok(());
}
let uplink = is_uplink(self.mhdr.m_type);
let uplink = is_uplink(self.mhdr.f_type);
// a_fcnt_down is used on downlink when f_port > 0
let a_fcnt_down = !uplink && pl.f_port.is_some() && pl.f_port.unwrap() > 0;
@@ -842,7 +842,7 @@ impl PhyPayload {
/// Decode f_opts to mac-commands.
pub fn decode_f_opts_to_mac_commands(&mut self) -> Result<()> {
if let Payload::MACPayload(pl) = &mut self.payload {
let uplink = is_uplink(self.mhdr.m_type);
let uplink = is_uplink(self.mhdr.f_type);
pl.fhdr.f_opts.decode_from_raw(uplink)?;
}
Ok(())
@@ -858,7 +858,7 @@ impl PhyPayload {
/// Note that this requires a decrypted frm_payload.
pub fn decode_frm_payload(&mut self) -> Result<()> {
if let Payload::MACPayload(pl) = &mut self.payload {
let uplink = is_uplink(self.mhdr.m_type);
let uplink = is_uplink(self.mhdr.f_type);
let f_port = pl.f_port.unwrap_or(0);
let b = match &pl.frm_payload {
Some(FRMPayload::Raw(v)) => v.clone(),
@@ -883,7 +883,7 @@ impl PhyPayload {
return Ok(());
}
let uplink = is_uplink(self.mhdr.m_type);
let uplink = is_uplink(self.mhdr.f_type);
let data = pl.frm_payload.as_ref().unwrap().to_vec()?;
let data = encrypt_frm_payload(key, uplink, &pl.fhdr.devaddr, pl.fhdr.f_cnt, &data)?;
@@ -905,7 +905,7 @@ impl PhyPayload {
return Ok(());
}
let uplink = is_uplink(self.mhdr.m_type);
let uplink = is_uplink(self.mhdr.f_type);
let data = pl.frm_payload.as_ref().unwrap().to_vec()?;
let data = encrypt_frm_payload(key, uplink, &pl.fhdr.devaddr, pl.fhdr.f_cnt, &data)?;
@@ -1210,14 +1210,14 @@ pub fn encrypt_frm_payload(
Ok(data[0..data_len].to_vec())
}
fn is_uplink(m_type: MType) -> bool {
match m_type {
MType::JoinRequest
| MType::UnconfirmedDataUp
| MType::ConfirmedDataUp
| MType::RejoinRequest => true,
MType::JoinAccept | MType::UnconfirmedDataDown | MType::ConfirmedDataDown => false,
MType::Proprietary => false,
fn is_uplink(f_type: FType) -> bool {
match f_type {
FType::JoinRequest
| FType::UnconfirmedDataUp
| FType::ConfirmedDataUp
| FType::RejoinRequest => true,
FType::JoinAccept | FType::UnconfirmedDataDown | FType::ConfirmedDataDown => false,
FType::Proprietary => false,
}
}
@@ -1261,7 +1261,7 @@ mod tests {
PhyPayloadTest {
phy: PhyPayload {
mhdr: MHDR {
m_type: MType::Proprietary,
f_type: FType::Proprietary,
major: Major::LoRaWANR1,
},
payload: Payload::Raw(vec![]),
@@ -1272,7 +1272,7 @@ mod tests {
PhyPayloadTest {
phy: PhyPayload {
mhdr: MHDR {
m_type: MType::Proprietary,
f_type: FType::Proprietary,
major: Major::LoRaWANR1,
},
payload: Payload::Raw(vec![0x01, 0x02, 0x03]),
@@ -1294,7 +1294,7 @@ mod tests {
let tests = vec![PhyPayloadTest {
phy: PhyPayload {
mhdr: MHDR {
m_type: MType::JoinRequest,
f_type: FType::JoinRequest,
major: Major::LoRaWANR1,
},
payload: Payload::JoinRequest(JoinRequestPayload {

View File

@@ -112,7 +112,7 @@ mod test {
frequency: 868100000,
payload: Box::new(PhyPayload {
mhdr: MHDR {
m_type: MType::Proprietary,
f_type: FType::Proprietary,
major: Major::LoRaWANR1,
},
payload: Payload::Raw(vec![0x01, 0x02, 0x03]),
@@ -132,7 +132,7 @@ mod test {
let req = ForwardDownlinkReq {
payload: Box::new(PhyPayload {
mhdr: MHDR {
m_type: MType::Proprietary,
f_type: FType::Proprietary,
major: Major::LoRaWANR1,
},
payload: Payload::Raw(vec![0x01, 0x02, 0x03]),

View File

@@ -1,4 +1,4 @@
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-24.11.tar.gz") {} }:
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-25.05.tar.gz") {} }:
pkgs.mkShell {
nativeBuildInputs = [

View File

@@ -70,7 +70,7 @@ function DeviceProfileTemplateForm(props: IProps) {
// class-b
dp.setSupportsClassB(v.supportsClassB);
dp.setClassBTimeout(v.classBTimeout);
dp.setClassBPingSlotNbK(v.classBPingSlotNbK);
dp.setClassBPingSlotPeriodicity(v.classBPingSlotPeriodicity);
dp.setClassBPingSlotDr(v.classBPingSlotDr);
dp.setClassBPingSlotFreq(v.classBPingSlotFreq);
@@ -351,7 +351,7 @@ function DeviceProfileTemplateForm(props: IProps) {
<Form.Item
label="Class-B ping-slot periodicity"
tooltip="This value must match the ping-slot periodicity of the device. Please refer to the device documentation."
name="classBPingSlotNbK"
name="classBPingSlotPeriodicity"
rules={[
{
required: true,

View File

@@ -259,7 +259,7 @@ function DeviceProfileForm(props: IProps) {
// class-b
dp.setSupportsClassB(v.supportsClassB);
dp.setClassBTimeout(v.classBTimeout);
dp.setClassBPingSlotNbK(v.classBPingSlotNbK);
dp.setClassBPingSlotPeriodicity(v.classBPingSlotPeriodicity);
dp.setClassBPingSlotDr(v.classBPingSlotDr);
dp.setClassBPingSlotFreq(v.classBPingSlotFreq);
@@ -376,7 +376,7 @@ function DeviceProfileForm(props: IProps) {
supportsClassC: dp.getSupportsClassC(),
classCTimeout: dp.getClassCTimeout(),
classBTimeout: dp.getClassBTimeout(),
classBPingSlotNbK: dp.getClassBPingSlotNbK(),
classBPingSlotPeriodicity: dp.getClassBPingSlotPeriodicity(),
classBPingSlotDr: dp.getClassBPingSlotDr(),
classBPingSlotFreq: dp.getClassBPingSlotFreq(),
abpRx1Delay: dp.getAbpRx1Delay(),
@@ -662,7 +662,7 @@ function DeviceProfileForm(props: IProps) {
<Form.Item
label="Class-B ping-slot periodicity"
tooltip="This value must match the ping-slot periodicity of the device. Please refer to the device documentation."
name="classBPingSlotNbK"
name="classBPingSlotPeriodicity"
rules={[
{
required: true,

View File

@@ -67,7 +67,7 @@ function FuotaDeploymentForm(props: IProps) {
d.setDeviceProfileId(v.deviceProfileId);
d.setUnicastMaxRetryCount(v.unicastMaxRetryCount);
d.setMulticastGroupType(v.multicastGroupType);
d.setMulticastClassBPingSlotNbK(v.multicastClassBPingSlotNbK);
d.setMulticastClassBPingSlotPeriodicity(v.multicastClassBPingSlotPeriodicity);
d.setMulticastClassCSchedulingType(v.multicastClassCSchedulingType);
d.setMulticastDr(v.multicastDr);
d.setMulticastFrequency(v.multicastFrequency);
@@ -199,7 +199,7 @@ function FuotaDeploymentForm(props: IProps) {
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label="Class-B ping-slot periodicity" name="multicastClassBPingSlotNbK">
<Form.Item label="Class-B ping-slot periodicity" name="multicastClassBPingSlotPeriodicity">
<Select disabled={!isMulticastClassB || props.disabled}>
<Select.Option value={0}>Every second</Select.Option>
<Select.Option value={1}>Every 2 seconds</Select.Option>

View File

@@ -47,7 +47,7 @@ function MulticastGroupForm(props: IProps) {
mg.setFrequency(v.frequency);
mg.setRegion(v.region);
mg.setGroupType(v.groupType);
mg.setClassBPingSlotNbK(v.classBPingSlotNbK);
mg.setClassBPingSlotPeriodicity(v.classBPingSlotPeriodicity);
mg.setClassCSchedulingType(v.classCSchedulingType);
props.onFinish(mg);
@@ -146,7 +146,7 @@ function MulticastGroupForm(props: IProps) {
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label="Class-B ping-slot periodicity" name="classBPingSlotNbK">
<Form.Item label="Class-B ping-slot periodicity" name="classBPingSlotPeriodicity">
<Select disabled={!selectPingSlotPeriod || props.disabled}>
<Select.Option value={0}>Every second</Select.Option>
<Select.Option value={1}>Every 2 seconds</Select.Option>