{"record":{"id":"01d6cb139f1686fc","repo":"embassy-rs/embassy","slug":"bad-802-15-4-channel","errorCode":null,"errorMessage":"Bad 802.15.4 channel","messagePattern":"Bad 802\\.15\\.4 channel","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"embassy-nrf/src/radio/ieee802154.rs","lineNumber":119,"sourceCode":"            r: crate::pac::RADIO,\n            state: T::state(),\n            needs_enable: false,\n            phantom: PhantomData,\n        };\n\n        radio.set_sfd(DEFAULT_SFD);\n        radio.set_transmission_power(0);\n        radio.set_channel(11);\n        radio.set_cca(Cca::CarrierSense);\n\n        radio\n    }\n\n    /// Changes the radio channel\n    pub fn set_channel(&mut self, channel: u8) {\n        let r = self.r;\n        if channel < 11 || channel > 26 {\n            panic!(\"Bad 802.15.4 channel\");\n        }\n        let frequency_offset = (channel - 10) * 5;\n        self.needs_enable = true;\n        r.frequency().write(|w| {\n            w.set_frequency(frequency_offset);\n            w.set_map(vals::Map::Default);\n        });\n    }\n\n    /// Changes the Clear Channel Assessment method\n    pub fn set_cca(&mut self, cca: Cca) {\n        let r = self.r;\n        self.needs_enable = true;\n        match cca {\n            Cca::CarrierSense => r.ccactrl().write(|w| w.set_ccamode(vals::Ccamode::CarrierMode)),\n            Cca::EnergyDetection { ed_threshold } => {\n                // \"[ED] is enabled by first configuring the field CCAMODE=EdMode in CCACTRL\n                // and writing the CCAEDTHRES field to a chosen value.\"","sourceCodeStart":101,"sourceCodeEnd":137,"githubUrl":"https://github.com/embassy-rs/embassy/blob/463a07b963419a1bfe61d5d597c44acb810afb8b/embassy-nrf/src/radio/ieee802154.rs#L101-L137","documentation":"set_channel panics when the requested 802.15.4 radio channel is outside the IEEE 802.15.4 2.4 GHz band, which spans channels 11-26. The nRF radio can only represent channels 11..=26 as frequency offsets ((channel - 10) * 5 MHz), so any other value is rejected immediately.","triggerScenarios":"Calling ieee802154::Radio::set_channel with a u8 less than 11 or greater than 26, e.g. set_channel(10), set_channel(27), set_channel(0), or a channel value read from unvalidated network/config data.","commonSituations":"Porting firmware from sub-GHz 802.15.4 bands (channels 0-10) to the nRF 2.4 GHz radio; parsing channel numbers from network join packets or CLI arguments without validation; using defaults meant for other radios.","solutions":["Pass a channel in 11..=26, e.g. set_channel(11) for 2405 MHz or set_channel(26) for 2480 MHz.","Add a range check or clamp at the call site: assert!(channel >= 11 && channel <= 26) before calling.","If sub-GHz operation is required, this SoC cannot provide it — use a sub-GHz radio chip instead."],"exampleFix":"// before\nradio.set_channel(channel); // channel comes from config, may be 15 or 40\n// after\nassert!((11..=26).contains(&channel), \"802.15.4 channel must be 11-26\");\nradio.set_channel(channel);","handlingStrategy":"validation","validationCode":"fn valid_802154_channel(ch: u8) -> bool {\n    (11..=26).contains(&ch)\n}\nassert!(valid_802154_channel(channel));\nradio.set_channel(channel);","typeGuard":"fn is_valid_802154_channel(ch: u8) -> bool { (11..=26).contains(&ch) }","tryCatchPattern":null,"preventionTips":["Define channel numbers as a newtype or enum limited to 11-26.","Validate channel values read from config, CLI, or network input before use.","Remember 802.15.4 sub-GHz channels (0-10) are unsupported on nRF radios."],"tags":["embedded","nrf","radio","ieee802154","range-check","panic"],"backgroundTag":"value-out-of-range","analyzedSha":"463a07b963419a1bfe61d5d597c44acb810afb8b","analyzedAt":"2026-09-10T13:38:26.660Z","contentChangedAt":"2026-09-10T13:38:26.660Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}