@@ -7,7 +7,7 @@ use std::time::{Duration, SystemTime};
77use anyhow:: Result ;
88use async_trait:: async_trait;
99use chirpstack_api:: gw;
10- use log:: { info, trace, warn} ;
10+ use log:: { debug , info, trace, warn} ;
1111use prost:: Message ;
1212use tokio:: net:: UdpSocket ;
1313use tokio:: sync:: { Mutex , RwLock } ;
@@ -26,6 +26,10 @@ struct State {
2626 pull_addr : RwLock < Option < SocketAddr > > ,
2727 stats : Mutex < Stats > ,
2828 time_fallback_enabled : bool ,
29+ forward_crc_ok : bool ,
30+ forward_crc_invalid : bool ,
31+ forward_crc_missing : bool ,
32+ filters : lrwn_filters:: Filters ,
2933}
3034
3135#[ derive( Clone ) ]
@@ -238,6 +242,13 @@ impl Backend {
238242 pull_addr : RwLock :: new ( None ) ,
239243 stats : Mutex :: new ( Stats :: default ( ) ) ,
240244 time_fallback_enabled : conf. backend . semtech_udp . time_fallback_enabled ,
245+ forward_crc_invalid : conf. backend . filters . forward_crc_invalid ,
246+ forward_crc_missing : conf. backend . filters . forward_crc_missing ,
247+ forward_crc_ok : conf. backend . filters . forward_crc_ok ,
248+ filters : lrwn_filters:: Filters {
249+ dev_addr_prefixes : conf. backend . filters . dev_addr_prefixes . clone ( ) ,
250+ join_eui_prefixes : conf. backend . filters . join_eui_prefixes . clone ( ) ,
251+ } ,
241252 } ;
242253 let state = Arc :: new ( state) ;
243254
@@ -348,8 +359,29 @@ async fn handle_push_data(state: &Arc<State>, data: &[u8], remote: &SocketAddr)
348359 let gateway_stats = pl. to_proto_gateway_stats ( ) ?;
349360
350361 for uf in & uplink_frames {
351- state. count_uplink ( uf) . await ?;
352- send_uplink_frame ( uf) . await ?;
362+ if let Some ( rx_info) = & uf. rx_info {
363+ if !( ( rx_info. crc_status ( ) == gw:: CrcStatus :: CrcOk && state. forward_crc_ok )
364+ || ( rx_info. crc_status ( ) == gw:: CrcStatus :: BadCrc && state. forward_crc_invalid )
365+ || ( rx_info. crc_status ( ) == gw:: CrcStatus :: NoCrc && state. forward_crc_missing ) )
366+ {
367+ debug ! (
368+ "Ignoring uplink frame because of forward_crc_ flags, uplink_id: {}" ,
369+ uf. rx_info. as_ref( ) . map( |v| v. uplink_id) . unwrap_or_default( ) ,
370+ ) ;
371+
372+ continue ;
373+ }
374+ }
375+
376+ if lrwn_filters:: matches ( & uf. phy_payload , & state. filters ) {
377+ state. count_uplink ( uf) . await ?;
378+ send_uplink_frame ( uf) . await ?;
379+ } else {
380+ debug ! (
381+ "Ignoring uplink frame because of dev_addr and join_eui filters, uplink_id: {}" ,
382+ uf. rx_info. as_ref( ) . map( |v| v. uplink_id) . unwrap_or_default( )
383+ ) ;
384+ }
353385 }
354386
355387 if let Some ( mut stats) = gateway_stats {
0 commit comments