| 119 | |
| 120 | #[allow(clippy::too_many_arguments)] |
| 121 | async fn handle( |
| 122 | uplink_frame_set: &UplinkFrameSet, |
| 123 | cid: lrwn::CID, |
| 124 | block: &lrwn::MACCommandSet, |
| 125 | pending_block: Option<&lrwn::MACCommandSet>, |
| 126 | tenant: &tenant::Tenant, |
| 127 | app: &application::Application, |
| 128 | dp: &device_profile::DeviceProfile, |
| 129 | dev: &mut device::Device, |
| 130 | region_conf: Arc<Box<dyn lrwn::region::Region + Send + Sync>>, |
| 131 | ) -> Result<Option<lrwn::MACCommandSet>> { |
| 132 | match cid { |
| 133 | lrwn::CID::DevStatusAns => { |
| 134 | dev_status::handle(uplink_frame_set, tenant, app, dp, dev, block).await |
| 135 | } |
| 136 | lrwn::CID::DeviceModeInd => device_mode_ind::handle(dev, block).await, |
| 137 | lrwn::CID::DeviceTimeReq => device_time::handle(uplink_frame_set, dev, block), |
| 138 | lrwn::CID::LinkADRAns => link_adr::handle(uplink_frame_set, dev, block, pending_block), |
| 139 | lrwn::CID::LinkCheckReq => link_check::handle(uplink_frame_set, dev, block), |
| 140 | lrwn::CID::NewChannelAns => new_channel::handle(dev, block, pending_block, region_conf), |
| 141 | lrwn::CID::PingSlotChannelAns => ping_slot_channel::handle(dev, block, pending_block), |
| 142 | lrwn::CID::PingSlotInfoReq => ping_slot_info::handle(dev, block), |
| 143 | lrwn::CID::RejoinParamSetupAns => rejoin_param_setup::handle(dev, block, pending_block), |
| 144 | lrwn::CID::RekeyInd => rekey::handle(dev, block), |
| 145 | lrwn::CID::ResetInd => reset::handle(dev, dp, block), |
| 146 | lrwn::CID::RxParamSetupAns => rx_param_setup::handle(dev, block, pending_block), |
| 147 | lrwn::CID::RxTimingSetupAns => rx_timing_setup::handle(dev, block, pending_block), |
| 148 | lrwn::CID::TxParamSetupAns => tx_param_setup::handle(dev, block, pending_block), |
| 149 | lrwn::CID::RelayConfAns => relay_conf::handle(dev, block, pending_block), |
| 150 | lrwn::CID::EndDeviceConfAns => end_device_conf::handle(dev, block, pending_block), |
| 151 | lrwn::CID::FilterListAns => filter_list::handle(dev, block, pending_block), |
| 152 | lrwn::CID::UpdateUplinkListAns => update_uplink_list::handle(dev, block, pending_block), |
| 153 | lrwn::CID::ConfigureFwdLimitAns => configure_fwd_limit::handle(dev, block, pending_block), |
| 154 | lrwn::CID::NotifyNewEndDeviceReq => { |
| 155 | notify_new_end_device::handle(tenant, dp, app, dev, block).await |
| 156 | } |
| 157 | lrwn::CID::CtrlUplinkListAns => ctrl_uplink_list::handle(dev, block, pending_block).await, |
| 158 | _ => { |
| 159 | warn!(cid = %cid, "Unexpected CID"); |
| 160 | // Return OK, we don't want to break out of the uplink handling. |
| 161 | Ok(None) |
| 162 | } |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | #[cfg(test)] |
| 167 | pub mod test { |