Created
March 10, 2020 05:29
-
-
Save thalesfragoso/8610284f3084ed6b1f80f81e01e0d591 to your computer and use it in GitHub Desktop.
Rubble with and without trace! in process_data_packet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Dump of assembler code for function rubble::link::connection::Connection<C>::process_data_packet: | |
/Projects/rubble/rubble/src/link/connection.rs: | |
130 pub(crate) fn process_data_packet( | |
[34m0x00003ac8[m <+0>: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr} | |
[34m0x00003acc[m <+4>: sub sp, #236 ; 0xec | |
[34m0x00003ace[m <+6>: str r0, [sp, #20] | |
[34m0x00003ad0[m <+8>: add.w r7, sp, #30 | |
[34m0x00003ad4[m <+12>: ldr r0, [sp, #280] ; 0x118 | |
[34m0x00003ad6[m <+14>: mov r9, r1 | |
[34m0x00003ad8[m <+16>: str r0, [sp, #32] | |
[34m0x00003ada[m <+18>: ldr r0, [sp, #276] ; 0x114 | |
[34m0x00003adc[m <+20>: strh.w r0, [sp, #30] | |
131 &mut self, | |
132 rx_end: Instant, | |
133 tx: &mut C::Transmitter, | |
134 timer: &mut C::Timer, | |
135 header: data::Header, | |
136 payload: &[u8], | |
137 crc_ok: bool, | |
138 ) -> Result<Cmd, ()> { | |
139 // If the sequence number of the packet is the same as our next expected sequence number, | |
140 // the packet contains new data that we should try to process. However, if the CRC is bad, | |
141 // we'll never try to process the data and instead request a retransmission. | |
142 let is_new = header.sn() == self.next_expected_seq_num && crc_ok; | |
[34m0x00003ae0[m <+24>: mov r0, r7 | |
[34m0x00003ae2[m <+26>: ldr.w r8, [sp, #284] ; 0x11c | |
[34m0x00003ae6[m <+30>: str r3, [sp, #24] | |
[34m0x00003ae8[m <+32>: str r2, [sp, #12] | |
[34m0x00003aea[m <+34>: str.w r8, [sp, #36] ; 0x24 | |
[34m0x00003aee[m <+38>: bl 0x52a4 <rubble::link::data::Header::sn> | |
/Projects/rubble/rubble/src/link/seq_num.rs: | |
11 pub struct SeqNum(bool); | |
[34m0x00003af2[m <+42>: mov r2, r9 | |
[34m0x00003af4[m <+44>: ldr.w r11, [sp, #288] ; 0x120 | |
[34m0x00003af8[m <+48>: ldrb.w r1, [r2, #48]! | |
[34m0x00003afc[m <+52>: str r2, [sp, #16] | |
[34m0x00003afe[m <+54>: clz r1, r1 | |
[34m0x00003b02[m <+58>: lsrs r1, r1, #5 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
142 let is_new = header.sn() == self.next_expected_seq_num && crc_ok; | |
[34m0x00003b04[m <+60>: eors r0, r1 | |
[34m0x00003b06[m <+62>: and.w r4, r0, r11 | |
143 | |
144 // If the packet's "NESN" is equal to our last sent sequence number + 1, the other side has | |
145 // acknowledged our last packet (and is now expecting one with an incremented seq. num.). | |
146 // However, if the CRC is bad, the bit might be flipped, so we cannot assume that the packet | |
147 // was acknowledged and thus always retransmit. | |
148 let acknowledged = header.nesn() == self.transmit_seq_num + SeqNum::ONE && crc_ok; | |
[34m0x00003b0a[m <+66>: mov r0, r7 | |
[34m0x00003b0c[m <+68>: bl 0x528a <rubble::link::data::Header::nesn> | |
[34m0x00003b10[m <+72>: mov r5, r9 | |
[m [34m0x00003b12[m <+74>: mov r6, r0 | |
[34m0x00003b14[m <+76>: ldrb.w r0, [r5, #47]! | |
[34m0x00003b18[m <+80>: movs r1, #1 | |
[34m0x00003b1a[m <+82>: mov.w r10, #1 | |
[34m0x00003b1e[m <+86>: bl 0x81f2 <<rubble::link::seq_num::SeqNum as core::ops::arith::Add>::add> | |
[34m0x00003b22[m <+90>: eors r0, r6 | |
[34m0x00003b24[m <+92>: bic.w r6, r11, r0 | |
149 | |
150 let is_empty = header.llid() == Llid::DataCont && payload.is_empty(); | |
[34m0x00003b28[m <+96>: mov r0, r7 | |
[34m0x00003b2a[m <+98>: bl 0x5270 <rubble::link::data::Header::llid> | |
[34m0x00003b2e[m <+102>: mov r7, r0 | |
151 | |
152 if acknowledged { | |
[34m0x00003b30[m <+104>: cmp r6, #1 | |
[34m0x00003b32[m <+106>: bne.n 0x3b40 <rubble::link::connection::Connection<C>::process_data_packet+120> | |
154 self.transmit_seq_num += SeqNum::ONE; | |
[34m0x00003b34[m <+108>: mov r0, r5 | |
[34m0x00003b36[m <+110>: movs r1, #1 | |
153 self.received_packet = true; | |
[34m0x00003b38[m <+112>: strb.w r10, [r9, #49] ; 0x31 | |
154 self.transmit_seq_num += SeqNum::ONE; | |
[34m0x00003b3c[m <+116>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
155 } | |
156 | |
157 // Whether we've already sent a response packet. | |
158 let mut responded = false; | |
159 // Whether we've pushed more work into the RX queue. | |
160 let mut queued_work = false; | |
161 | |
162 if is_new { | |
[34m0x00003b40[m <+120>: cbz r4, 0x3b5c <rubble::link::connection::Connection<C>::process_data_packet+148> | |
[34m0x00003b42[m <+122>: uxtb r0, r7 | |
[34m0x00003b44[m <+124>: eor.w r0, r0, #1 | |
[34m0x00003b48[m <+128>: orr.w r0, r0, r8 | |
[34m0x00003b4c[m <+132>: clz r0, r0 | |
[34m0x00003b50[m <+136>: lsrs r0, r0, #5 | |
163 if is_empty { | |
[34m0x00003b52[m <+138>: beq.n 0x3bf2 <rubble::link::connection::Connection<C>::process_data_packet+298> | |
164 // Always acknowledge empty packets, no need to process them | |
165 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x00003b54[m <+140>: ldr r0, [sp, #16] | |
[34m0x00003b56[m <+142>: movs r1, #1 | |
[34m0x00003b58[m <+144>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x00003b5c[m <+148>: mov.w r8, #0 | |
[34m0x00003b60[m <+152>: movs r5, #0 | |
224 queued_work = true; | |
225 } else { | |
226 trace!("NACK (no space in rx buffer)"); | |
227 } | |
228 } | |
229 } | |
230 | |
231 if acknowledged { | |
[34m0x00003b62[m <+154>: cbz r6, 0x3b8e <rubble::link::connection::Connection<C>::process_data_packet+198> | |
[34m0x00003b64[m <+156>: ldr r4, [sp, #24] | |
232 if !responded { | |
[34m0x00003b66[m <+158>: cmp r5, #0 | |
[34m0x00003b68[m <+160>: bne.w 0x3c9a <rubble::link::connection::Connection<C>::process_data_packet+466> | |
233 // Send a new data packet. | |
234 | |
235 // Try to acquire PDU from the tx queue, fall back to an empty PDU. | |
236 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf()); | |
[34m0x00003b6c[m <+164>: mov r0, r4 | |
[34m0x00003b6e[m <+166>: bl 0x4e06 <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf> | |
[34m0x00003b72[m <+170>: bl 0x834c <rubble::bytes::ByteWriter::new> | |
[34m0x00003b76[m <+174>: strd r0, r1, [sp, #40] ; 0x28 | |
237 let header = match self.tx.consume_raw_with(|header, pl| { | |
[34m0x00003b7a[m <+178>: add.w r0, r9, #12 | |
[34m0x00003b7e[m <+182>: add r1, sp, #40 ; 0x28 | |
[34m0x00003b80[m <+184>: bl 0x4de <<rubble::link::queue::SimpleConsumer as rubble::link::queue::Consumer>::consume_raw_with> | |
238 payload_writer.write_slice(pl).expect("TX buf out of space"); | |
239 Consume::always(Ok(header)) | |
240 }) { | |
241 Ok(h) => h, | |
[34m0x00003b84[m <+188>: lsls r1, r0, #31 | |
[34m0x00003b86[m <+190>: bne.w 0x3c8a <rubble::link::connection::Connection<C>::process_data_packet+450> | |
237 let header = match self.tx.consume_raw_with(|header, pl| { | |
[34m0x00003b8a[m <+194>: lsrs r1, r0, #16 | |
[34m0x00003b8c[m <+196>: b.n 0x3c92 <rubble::link::connection::Connection<C>::process_data_packet+458> | |
243 }; | |
244 | |
245 self.send(header, tx); | |
246 } | |
247 } else { | |
248 // Last packet not acknowledged, resend. | |
249 // If CRC is bad, this bit could be flipped, so we always retransmit in that case. | |
250 if self.received_packet { | |
[34m0x00003b8e[m <+198>: ldrb.w r0, [r9, #49] ; 0x31 | |
[34m0x00003b92[m <+202>: ldr r4, [sp, #24] | |
[34m0x00003b94[m <+204>: cmp r0, #0 | |
[34m0x00003b96[m <+206>: beq.n 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+352> | |
251 self.last_header.set_nesn(self.next_expected_seq_num); | |
[34m0x00003b98[m <+208>: ldrb.w r1, [r9, #48] ; 0x30 | |
[34m0x00003b9c[m <+212>: add.w r0, r9, #22 | |
[34m0x00003ba0[m <+216>: bl 0x5292 <rubble::link::data::Header::set_nesn> | |
252 tx.transmit_data( | |
[34m0x00003ba4[m <+220>: ldrh.w r3, [r9, #22] | |
253 self.access_address, | |
[34m0x00003ba8[m <+224>: ldrd r1, r2, [r9] | |
252 tx.transmit_data( | |
[34m0x00003bac[m <+228>: ldrb.w r0, [r9, #46] ; 0x2e | |
[34m0x00003bb0[m <+232>: str r0, [sp, #0] | |
[34m0x00003bb2[m <+234>: mov r0, r4 | |
[34m0x00003bb4[m <+236>: bl 0x4e9a <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::transmit_data> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003bb8[m <+240>: movw r0, #10196 ; 0x27d4 | |
[34m0x00003bbc[m <+244>: movt r0, #8192 ; 0x2000 | |
[34m0x00003bc0[m <+248>: ldr r0, [r0, #0] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bc2[m <+250>: cmp r0, #5 | |
[34m0x00003bc4[m <+252>: bcc.n 0x3c9a <rubble::link::connection::Connection<C>::process_data_packet+466> | |
[34m0x00003bc6[m <+254>: movs r0, #0 | |
[34m0x00003bc8[m <+256>: movs r1, #4 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003bca[m <+258>: str r0, [sp, #60] ; 0x3c | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bcc[m <+260>: movw r2, #1632 ; 0x660 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003bd0[m <+264>: str r1, [sp, #56] ; 0x38 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bd2[m <+266>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003bd6[m <+270>: strd r0, r0, [sp, #48] ; 0x30 | |
[34m0x00003bda[m <+274>: movs r0, #1 | |
[34m0x00003bdc[m <+276>: str r0, [sp, #44] ; 0x2c | |
[34m0x00003bde[m <+278>: movw r0, #1624 ; 0x658 | |
[34m0x00003be2[m <+282>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003be6[m <+286>: movs r1, #5 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003be8[m <+288>: str r0, [sp, #40] ; 0x28 | |
[34m0x00003bea[m <+290>: add r0, sp, #40 ; 0x28 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bec[m <+292>: bl 0xbaa2 <log::__private_api_log> | |
[34m0x00003bf0[m <+296>: b.n 0x3c9a <rubble::link::connection::Connection<C>::process_data_packet+466> | |
[34m0x00003bf2[m <+298>: add.w r0, sp, #30 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
166 } else if header.llid() == Llid::Control { | |
[34m0x00003bf6[m <+302>: bl 0x5270 <rubble::link::data::Header::llid> | |
[34m0x00003bfa[m <+306>: uxtb r0, r0 | |
[34m0x00003bfc[m <+308>: cmp r0, #3 | |
[34m0x00003bfe[m <+310>: bne.n 0x3c5c <rubble::link::connection::Connection<C>::process_data_packet+404> | |
167 // LLCP message, try to process it immediately. Certain LLCPDUs might be put in the | |
168 // channel instead and answered by the non-real-time part. | |
169 | |
170 if let Ok(pdu) = ControlPdu::from_bytes(&mut ByteReader::new(payload)) { | |
[34m0x00003c00[m <+312>: ldrd r0, r1, [sp, #32] | |
[34m0x00003c04[m <+316>: bl 0x846a <rubble::bytes::ByteReader::new> | |
[34m0x00003c08[m <+320>: add r5, sp, #40 ; 0x28 | |
[34m0x00003c0a[m <+322>: strd r0, r1, [sp, #80] ; 0x50 | |
[34m0x00003c0e[m <+326>: add r1, sp, #80 ; 0x50 | |
[34m0x00003c10[m <+328>: mov r0, r5 | |
[34m0x00003c12[m <+330>: bl 0x86ec <<rubble::link::llcp::ControlPdu as rubble::bytes::FromBytes>::from_bytes> | |
[34m0x00003c16[m <+334>: ldrb.w r0, [sp, #40] ; 0x28 | |
[34m0x00003c1a[m <+338>: cmp r0, #0 | |
[34m0x00003c1c[m <+340>: beq.w 0x3e9a <rubble::link::connection::Connection<C>::process_data_packet+978> | |
[34m0x00003c20[m <+344>: movs r5, #0 | |
[34m0x00003c22[m <+346>: mov.w r8, #0 | |
[34m0x00003c26[m <+350>: b.n 0x3b62 <rubble::link::connection::Connection<C>::process_data_packet+154> | |
[34m0x00003c28[m <+352>: add r5, sp, #40 ; 0x28 | |
[34m0x00003c2a[m <+354>: movs r0, #1 | |
254 self.crc_init, | |
255 self.last_header, | |
256 self.channel, | |
257 ); | |
258 trace!("<<RESENT>>"); | |
259 } else { | |
260 // We've never received (and thus sent) a data packet before, so we can't | |
261 // *re*transmit anything. Send empty PDU instead. | |
262 // (this should not really happen, though!) | |
263 self.received_packet = true; | |
[34m0x00003c2c[m <+356>: strb.w r0, [r9, #49] ; 0x31 | |
264 | |
265 let pdu = Pdu::empty(); | |
[34m0x00003c30[m <+360>: mov r0, r5 | |
[34m0x00003c32[m <+362>: bl 0x53b0 <rubble::link::data::Pdu<&[u8]>::empty> | |
266 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf()); | |
[34m0x00003c36[m <+366>: mov r0, r4 | |
[34m0x00003c38[m <+368>: bl 0x4e06 <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf> | |
[34m0x00003c3c[m <+372>: bl 0x834c <rubble::bytes::ByteWriter::new> | |
[34m0x00003c40[m <+376>: strd r0, r1, [sp, #136] ; 0x88 | |
[34m0x00003c44[m <+380>: add r1, sp, #136 ; 0x88 | |
267 pdu.to_bytes(&mut payload_writer).unwrap(); | |
[34m0x00003c46[m <+382>: mov r0, r5 | |
[34m0x00003c48[m <+384>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes> | |
[34m0x00003c4c[m <+388>: uxtb r0, r0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: | |
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory. | |
[34m0x00003c4e[m <+390>: cmp r0, #5 | |
[34m0x00003c50[m <+392>: bne.w 0x41be <rubble::link::connection::Connection<C>::process_data_packet+1782> | |
/Projects/rubble/rubble/src/link/data.rs: | |
224 Pdu::DataCont { .. } => Llid::DataCont, | |
[34m0x00003c54[m <+396>: ldrb.w r0, [sp, #40] ; 0x28 | |
[34m0x00003c58[m <+400>: adds r0, #1 | |
[34m0x00003c5a[m <+402>: b.n 0x3c8c <rubble::link::connection::Connection<C>::process_data_packet+452> | |
[34m0x00003c5c[m <+404>: add.w r5, sp, #30 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
216 .produce_with(header.payload_length().into(), |writer| { | |
[34m0x00003c60[m <+408>: mov r0, r5 | |
[34m0x00003c62[m <+410>: bl 0x5268 <rubble::link::data::Header::payload_length> | |
[34m0x00003c66[m <+414>: mov r1, r0 | |
215 self.rx | |
[34m0x00003c68[m <+416>: add.w r0, r9, #16 | |
[34m0x00003c6c[m <+420>: add r2, sp, #32 | |
[34m0x00003c6e[m <+422>: mov r3, r5 | |
[34m0x00003c70[m <+424>: bl 0x3f2 <rubble::link::queue::Producer::produce_with> | |
[34m0x00003c74[m <+428>: uxtb r0, r0 | |
217 writer.write_slice(payload)?; | |
218 Ok(header.llid()) | |
219 }); | |
220 | |
221 if result.is_ok() { | |
[34m0x00003c76[m <+430>: cmp r0, #5 | |
[34m0x00003c78[m <+432>: bne.w 0x3e5a <rubble::link::connection::Connection<C>::process_data_packet+914> | |
222 // Acknowledge the packet | |
223 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x00003c7c[m <+436>: ldr r0, [sp, #16] | |
[34m0x00003c7e[m <+438>: movs r1, #1 | |
[34m0x00003c80[m <+440>: mov.w r8, #1 | |
[34m0x00003c84[m <+444>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x00003c88[m <+448>: b.n 0x3b60 <rubble::link::connection::Connection<C>::process_data_packet+152> | |
242 Err(_) => Header::new(Llid::DataCont), | |
[34m0x00003c8a[m <+450>: movs r0, #1 | |
[34m0x00003c8c[m <+452>: bl 0x5240 <rubble::link::data::Header::new> | |
[34m0x00003c90[m <+456>: mov r1, r0 | |
[34m0x00003c92[m <+458>: mov r0, r9 | |
[34m0x00003c94[m <+460>: mov r2, r4 | |
[34m0x00003c96[m <+462>: bl 0x4204 <rubble::link::connection::Connection<C>::send> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: | |
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory. | |
[34m0x00003c9a[m <+466>: ldrh.w r0, [r9, #20] | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: | |
624 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: No such file or directory. | |
[34m0x00003c9e[m <+470>: mov r5, r9 | |
[34m0x00003ca0[m <+472>: movs r2, #13 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/mod.rs: | |
3301 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/mod.rs: No such file or directory. | |
[34m0x00003ca2[m <+474>: adds r0, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: | |
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory. | |
[34m0x00003ca4[m <+476>: strh.w r0, [r9, #20] | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: | |
624 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: No such file or directory. | |
[34m0x00003ca8[m <+480>: ldrb.w r6, [r5, #24]! | |
[34m0x00003cac[m <+484>: add r0, sp, #172 ; 0xac | |
[34m0x00003cae[m <+486>: adds r1, r5, #1 | |
[34m0x00003cb0[m <+488>: bl 0xe84c <__aeabi_memcpy> | |
[34m0x00003cb4[m <+492>: movs r0, #0 | |
[34m0x00003cb6[m <+494>: mov.w r10, #2 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
279 if let Some(update) = self.update_data.take() { | |
[34m0x00003cba[m <+498>: cmp r6, #2 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs: | |
1486 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs: No such file or directory. | |
[34m0x00003cbc[m <+500>: str.w r0, [r5, #1] | |
[34m0x00003cc0[m <+504>: strb.w r10, [r5] | |
[34m0x00003cc4[m <+508>: str.w r0, [r5, #5] | |
[34m0x00003cc8[m <+512>: str.w r0, [r5, #9] | |
[34m0x00003ccc[m <+516>: strb r0, [r5, #13] | |
[34m0x00003cce[m <+518>: beq.w 0x3dec <rubble::link::connection::Connection<C>::process_data_packet+804> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
279 if let Some(update) = self.update_data.take() { | |
[34m0x00003cd2[m <+522>: strb.w r6, [sp, #208] ; 0xd0 | |
[34m0x00003cd6[m <+526>: add r6, sp, #208 ; 0xd0 | |
[34m0x00003cd8[m <+528>: adds r7, r6, #1 | |
[34m0x00003cda[m <+530>: add r1, sp, #172 ; 0xac | |
[34m0x00003cdc[m <+532>: movs r2, #13 | |
[34m0x00003cde[m <+534>: mov r0, r7 | |
[34m0x00003ce0[m <+536>: bl 0xe84c <__aeabi_memcpy> | |
280 if update.instant() == self.conn_event_count.0 { | |
[34m0x00003ce4[m <+540>: mov r0, r6 | |
[34m0x00003ce6[m <+542>: bl 0x7cb0 <rubble::link::connection::LlcpUpdate::instant> | |
[34m0x00003cea[m <+546>: ldrh.w r1, [r9, #20] | |
[34m0x00003cee[m <+550>: uxth r0, r0 | |
[34m0x00003cf0[m <+552>: cmp r0, r1 | |
[34m0x00003cf2[m <+554>: bne.n 0x3d22 <rubble::link::connection::Connection<C>::process_data_packet+602> | |
[34m0x00003cf4[m <+556>: add r5, sp, #40 ; 0x28 | |
281 // Next conn event will the the first one with these parameters. | |
282 let result = self.apply_llcp_update(update, rx_end); | |
[34m0x00003cf6[m <+558>: mov r1, r7 | |
[34m0x00003cf8[m <+560>: movs r2, #13 | |
[34m0x00003cfa[m <+562>: ldrb.w r4, [sp, #208] ; 0xd0 | |
[34m0x00003cfe[m <+566>: mov r0, r5 | |
[34m0x00003d00[m <+568>: bl 0xe84c <__aeabi_memcpy> | |
461 } else { | |
462 Err(LlcpError::NoSpace) | |
463 } | |
464 } | |
465 | |
466 /// Stores `update` in the link layer state so that it will be applied once its *instant* is | |
467 /// reached. | |
468 fn prepare_llcp_update(&mut self, update: LlcpUpdate) -> Result<(), LlcpError> { | |
469 // TODO: check that instant is <32767 in the future | |
470 if let Some(data) = self.update_data { | |
471 error!( | |
472 "got update data {:?} while update {:?} is already queued", | |
473 update, data | |
474 ); | |
475 Err(LlcpError::ConnectionLost) | |
476 } else { | |
477 self.update_data = Some(update); | |
478 Ok(()) | |
479 } | |
480 } | |
481 | |
482 /// Patches the link layer state to incorporate `update`. | |
483 /// | |
484 /// Returns a `Cmd` when the usual Link Layer `Cmd` should be overridden. In that case, this | |
485 /// method must also perform channel hopping. | |
486 fn apply_llcp_update(&mut self, update: LlcpUpdate, rx_end: Instant) -> Option<Cmd> { | |
487 match update { | |
488 LlcpUpdate::ConnUpdate(data) => { | |
[34m0x00003d04[m <+572>: cmp r4, #1 | |
[34m0x00003d06[m <+574>: bne.n 0x3d2c <rubble::link::connection::Connection<C>::process_data_packet+612> | |
503 crc_init: self.crc_init, | |
504 }, | |
505 // This function never queues work, but the caller might change this to `true` | |
506 queued_work: false, | |
507 }) | |
508 } | |
509 LlcpUpdate::ChannelMap { map, .. } => { | |
510 self.channel_map = map; | |
[34m0x00003d08[m <+576>: ldrh.w r0, [sp, #44] ; 0x2c | |
511 None | |
[34m0x00003d0c[m <+580>: movs r1, #24 | |
510 self.channel_map = map; | |
[34m0x00003d0e[m <+582>: strh.w r0, [r9, #42] ; 0x2a | |
[34m0x00003d12[m <+586>: ldr r0, [sp, #40] ; 0x28 | |
[34m0x00003d14[m <+588>: str.w r0, [r9, #38] ; 0x26 | |
[34m0x00003d18[m <+592>: add r0, sp, #136 ; 0x88 | |
511 None | |
[34m0x00003d1a[m <+594>: bl 0xeafc <__aeabi_memclr4> | |
[34m0x00003d1e[m <+598>: movs r1, #3 | |
[34m0x00003d20[m <+600>: b.n 0x3d92 <rubble::link::connection::Connection<C>::process_data_packet+714> | |
290 self.update_data = Some(update); | |
[34m0x00003d22[m <+602>: ldmia r6!, {r0, r1, r2} | |
[34m0x00003d24[m <+604>: stmia r5!, {r0, r1, r2} | |
[34m0x00003d26[m <+606>: ldrh r0, [r6, #0] | |
[34m0x00003d28[m <+608>: strh r0, [r5, #0] | |
[34m0x00003d2a[m <+610>: b.n 0x3dec <rubble::link::connection::Connection<C>::process_data_packet+804> | |
[34m0x00003d2c[m <+612>: add r7, sp, #88 ; 0x58 | |
461 } else { | |
462 Err(LlcpError::NoSpace) | |
463 } | |
464 } | |
465 | |
466 /// Stores `update` in the link layer state so that it will be applied once its *instant* is | |
467 /// reached. | |
468 fn prepare_llcp_update(&mut self, update: LlcpUpdate) -> Result<(), LlcpError> { | |
469 // TODO: check that instant is <32767 in the future | |
470 if let Some(data) = self.update_data { | |
471 error!( | |
472 "got update data {:?} while update {:?} is already queued", | |
473 update, data | |
474 ); | |
475 Err(LlcpError::ConnectionLost) | |
476 } else { | |
477 self.update_data = Some(update); | |
478 Ok(()) | |
479 } | |
480 } | |
481 | |
482 /// Patches the link layer state to incorporate `update`. | |
483 /// | |
484 /// Returns a `Cmd` when the usual Link Layer `Cmd` should be overridden. In that case, this | |
485 /// method must also perform channel hopping. | |
486 fn apply_llcp_update(&mut self, update: LlcpUpdate, rx_end: Instant) -> Option<Cmd> { | |
487 match update { | |
488 LlcpUpdate::ConnUpdate(data) => { | |
[34m0x00003d2e[m <+614>: adds r1, r5, #1 | |
[34m0x00003d30[m <+616>: movs r2, #12 | |
[34m0x00003d32[m <+618>: mov r0, r7 | |
[34m0x00003d34[m <+620>: bl 0xe84c <__aeabi_memcpy> | |
490 self.conn_interval = data.interval(); | |
[34m0x00003d38[m <+624>: mov r0, r7 | |
489 let old_conn_interval = self.conn_interval; | |
[34m0x00003d3a[m <+626>: ldr.w r5, [r9, #8] | |
490 self.conn_interval = data.interval(); | |
[34m0x00003d3e[m <+630>: bl 0x85ee <rubble::link::llcp::ConnectionUpdateData::interval> | |
[34m0x00003d42[m <+634>: str.w r0, [r9, #8] | |
491 | |
492 self.hop_channel(); | |
[34m0x00003d46[m <+638>: mov r0, r9 | |
[34m0x00003d48[m <+640>: bl 0x385e <rubble::link::connection::Connection<C>::hop_channel> | |
495 // Next update after the tx window ends (= missed it) | |
496 next_update: NextUpdate::At( | |
497 rx_end + old_conn_interval + data.win_offset() + data.win_size(), | |
[34m0x00003d4c[m <+644>: ldr r0, [sp, #12] | |
[34m0x00003d4e[m <+646>: mov r1, r5 | |
[34m0x00003d50[m <+648>: bl 0xb3dc <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
[34m0x00003d54[m <+652>: mov r5, r0 | |
[34m0x00003d56[m <+654>: mov r0, r7 | |
[34m0x00003d58[m <+656>: bl 0x85e4 <rubble::link::llcp::ConnectionUpdateData::win_offset> | |
[34m0x00003d5c[m <+660>: mov r1, r0 | |
[34m0x00003d5e[m <+662>: mov r0, r5 | |
[34m0x00003d60[m <+664>: bl 0xb3dc <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
[34m0x00003d64[m <+668>: mov r5, r0 | |
[34m0x00003d66[m <+670>: mov r0, r7 | |
[34m0x00003d68[m <+672>: bl 0x85da <rubble::link::llcp::ConnectionUpdateData::win_size> | |
[34m0x00003d6c[m <+676>: mov r1, r0 | |
[34m0x00003d6e[m <+678>: mov r0, r5 | |
[34m0x00003d70[m <+680>: bl 0xb3dc <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
498 ), | |
499 // Listen for the transmit window | |
500 radio: RadioCmd::ListenData { | |
501 channel: self.channel, | |
[34m0x00003d74[m <+684>: ldrb.w r1, [r9, #46] ; 0x2e | |
502 access_address: self.access_address, | |
[34m0x00003d78[m <+688>: ldrd r2, r3, [r9] | |
494 Some(Cmd { | |
[34m0x00003d7c[m <+692>: strb.w r1, [sp, #137] ; 0x89 | |
[34m0x00003d80[m <+696>: movs r1, #2 | |
[34m0x00003d82[m <+698>: strb.w r1, [sp, #136] ; 0x88 | |
[34m0x00003d86[m <+702>: strd r2, r3, [sp, #140] ; 0x8c | |
[34m0x00003d8a[m <+706>: str r0, [sp, #152] ; 0x98 | |
[34m0x00003d8c[m <+708>: movs r0, #0 | |
[34m0x00003d8e[m <+710>: strb.w r0, [sp, #156] ; 0x9c | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003d92[m <+714>: movw r0, #10196 ; 0x27d4 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
494 Some(Cmd { | |
[34m0x00003d96[m <+718>: str r1, [sp, #148] ; 0x94 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003d98[m <+720>: movt r0, #8192 ; 0x2000 | |
[34m0x00003d9c[m <+724>: ldr r0, [r0, #0] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003d9e[m <+726>: cmp r0, #3 | |
[34m0x00003da0[m <+728>: bcc.n 0x3de8 <rubble::link::connection::Connection<C>::process_data_packet+800> | |
[34m0x00003da2[m <+730>: movs r0, #2 | |
[34m0x00003da4[m <+732>: add r1, sp, #88 ; 0x58 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003da6[m <+734>: str r0, [sp, #60] ; 0x3c | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003da8[m <+736>: movw r2, #1696 ; 0x6a0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003dac[m <+740>: str r1, [sp, #56] ; 0x38 | |
[34m0x00003dae[m <+742>: movs r1, #0 | |
[34m0x00003db0[m <+744>: str r1, [sp, #52] ; 0x34 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003db2[m <+746>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003db6[m <+750>: strd r0, r1, [sp, #44] ; 0x2c | |
[34m0x00003dba[m <+754>: movw r0, #1680 ; 0x690 | |
[34m0x00003dbe[m <+758>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003dc2[m <+762>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003dc4[m <+764>: str r0, [sp, #40] ; 0x28 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003dc6[m <+766>: movw r0, #14353 ; 0x3811 | |
[34m0x00003dca[m <+770>: movt r0, #0 | |
[34m0x00003dce[m <+774>: str r0, [sp, #100] ; 0x64 | |
[34m0x00003dd0[m <+776>: add r0, sp, #136 ; 0x88 | |
[34m0x00003dd2[m <+778>: str r0, [sp, #96] ; 0x60 | |
[34m0x00003dd4[m <+780>: movw r0, #31939 ; 0x7cc3 | |
[34m0x00003dd8[m <+784>: movt r0, #0 | |
[34m0x00003ddc[m <+788>: strd r6, r0, [sp, #88] ; 0x58 | |
[34m0x00003de0[m <+792>: add r0, sp, #40 ; 0x28 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003de2[m <+794>: bl 0xbaa2 <log::__private_api_log> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
284 if let Some(mut cmd) = result { | |
[34m0x00003de6[m <+798>: ldr r1, [sp, #148] ; 0x94 | |
[34m0x00003de8[m <+800>: cmp r1, #3 | |
[34m0x00003dea[m <+802>: bne.n 0x3e3a <rubble::link::connection::Connection<C>::process_data_packet+882> | |
291 } | |
292 } | |
293 | |
294 // Hop channels after applying LLCP update because it might change the channel map used | |
295 // by the next event | |
296 self.hop_channel(); | |
[34m0x00003dec[m <+804>: mov r0, r9 | |
[34m0x00003dee[m <+806>: ldr r5, [sp, #272] ; 0x110 | |
[34m0x00003df0[m <+808>: bl 0x385e <rubble::link::connection::Connection<C>::hop_channel> | |
/Projects/rubble/rubble-nrf5x/src/timer.rs: | |
100 self.inner.now() | |
[34m0x00003df4[m <+812>: mov r0, r5 | |
[34m0x00003df6[m <+814>: bl 0x4a70 <<nrf52832_pac::TIMER0 as rubble_nrf5x::timer::NrfTimerExt>::now> | |
[34m0x00003dfa[m <+818>: mov r5, r0 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
362 self.conn_interval + Duration::from_micros(500) | |
[34m0x00003dfc[m <+820>: mov.w r0, #500 ; 0x1f4 | |
[34m0x00003e00[m <+824>: ldr.w r6, [r9, #8] | |
[34m0x00003e04[m <+828>: bl 0xb21e <rubble::time::Duration::from_micros> | |
[34m0x00003e08[m <+832>: mov r1, r0 | |
[34m0x00003e0a[m <+834>: mov r0, r6 | |
[34m0x00003e0c[m <+836>: bl 0xb22e <<rubble::time::Duration as core::ops::arith::Add>::add> | |
[34m0x00003e10[m <+840>: mov r1, r0 | |
310 next_update: NextUpdate::At(timer.now() + self.conn_event_timeout()), | |
[34m0x00003e12[m <+842>: mov r0, r5 | |
[34m0x00003e14[m <+844>: bl 0xb3dc <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
[34m0x00003e18[m <+848>: ldr r7, [sp, #20] | |
313 access_address: self.access_address, | |
[34m0x00003e1a[m <+850>: ldrd r1, r2, [r9] | |
312 channel: self.channel, | |
[34m0x00003e1e[m <+854>: ldrb.w r3, [r9, #46] ; 0x2e | |
309 Ok(Cmd { | |
[34m0x00003e22[m <+858>: strb r3, [r7, #1] | |
[34m0x00003e24[m <+860>: adds r3, r7, #4 | |
[34m0x00003e26[m <+862>: strb.w r10, [r7] | |
[34m0x00003e2a[m <+866>: stmia.w r3, {r1, r2, r10} | |
[34m0x00003e2e[m <+870>: str r0, [r7, #16] | |
[34m0x00003e30[m <+872>: strb.w r8, [r7, #20] | |
314 crc_init: self.crc_init, | |
315 }, | |
316 queued_work, | |
317 }) | |
318 } | |
[34m0x00003e34[m <+876>: add sp, #236 ; 0xec | |
[34m0x00003e36[m <+878>: ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} | |
[34m0x00003e3a[m <+882>: add r0, sp, #136 ; 0x88 | |
[34m0x00003e3c[m <+884>: ldr r4, [sp, #20] | |
286 return Ok(cmd); | |
[34m0x00003e3e[m <+886>: ldmia.w r0, {r2, r3, r5, r6, r7} | |
[34m0x00003e42[m <+890>: mov r1, r4 | |
[34m0x00003e44[m <+892>: stmia r1!, {r2, r3, r5, r6, r7} | |
[34m0x00003e46[m <+894>: ldrh.w r0, [sp, #157] ; 0x9d | |
[34m0x00003e4a[m <+898>: strb.w r8, [r4, #20] | |
[34m0x00003e4e[m <+902>: strh.w r0, [r4, #21] | |
[34m0x00003e52[m <+906>: ldrb.w r0, [sp, #159] ; 0x9f | |
[34m0x00003e56[m <+910>: strb r0, [r4, #23] | |
[34m0x00003e58[m <+912>: b.n 0x3e34 <rubble::link::connection::Connection<C>::process_data_packet+876> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003e5a[m <+914>: movw r0, #10196 ; 0x27d4 | |
[34m0x00003e5e[m <+918>: mov.w r8, #0 | |
[34m0x00003e62[m <+922>: movt r0, #8192 ; 0x2000 | |
[34m0x00003e66[m <+926>: ldr r0, [r0, #0] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003e68[m <+928>: cmp r0, #5 | |
[34m0x00003e6a[m <+930>: bcc.w 0x3b60 <rubble::link::connection::Connection<C>::process_data_packet+152> | |
[34m0x00003e6e[m <+934>: movs r0, #4 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003e70[m <+936>: str.w r8, [sp, #60] ; 0x3c | |
[34m0x00003e74[m <+940>: str r0, [sp, #56] ; 0x38 | |
[34m0x00003e76[m <+942>: movs r0, #1 | |
[34m0x00003e78[m <+944>: strd r8, r8, [sp, #48] ; 0x30 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003e7c[m <+948>: movw r2, #1584 ; 0x630 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003e80[m <+952>: str r0, [sp, #44] ; 0x2c | |
[34m0x00003e82[m <+954>: movw r0, #1576 ; 0x628 | |
[34m0x00003e86[m <+958>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003e8a[m <+962>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003e8e[m <+966>: str r0, [sp, #40] ; 0x28 | |
[34m0x00003e90[m <+968>: add r0, sp, #40 ; 0x28 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003e92[m <+970>: movs r1, #5 | |
[34m0x00003e94[m <+972>: bl 0xbaa2 <log::__private_api_log> | |
[34m0x00003e98[m <+976>: b.n 0x3b60 <rubble::link::connection::Connection<C>::process_data_packet+152> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
170 if let Ok(pdu) = ControlPdu::from_bytes(&mut ByteReader::new(payload)) { | |
[34m0x00003e9a[m <+978>: add.w r0, r5, #8 | |
[34m0x00003e9e[m <+982>: add.w r8, sp, #88 ; 0x58 | |
[34m0x00003ea2[m <+986>: mov r1, r0 | |
[34m0x00003ea4[m <+988>: mov r2, r8 | |
[34m0x00003ea6[m <+990>: ldmia r1!, {r3, r4, r5, r7} | |
[34m0x00003ea8[m <+992>: stmia r2!, {r3, r4, r5, r7} | |
[34m0x00003eaa[m <+994>: ldmia.w r1, {r3, r4, r5, r7} | |
[34m0x00003eae[m <+998>: stmia r2!, {r3, r4, r5, r7} | |
[34m0x00003eb0[m <+1000>: add r4, sp, #136 ; 0x88 | |
171 // Some LLCPDUs don't need a response, those can always be processed and | |
172 // ACKed. For those that do, the other device must have ACKed the last | |
173 // packet we sent, because we'll directly use the radio's TX buffer to send | |
174 // back the LLCP response. | |
175 | |
176 match self.process_control_pdu(pdu, acknowledged) { | |
[34m0x00003eb2[m <+1002>: ldmia r0!, {r2, r3, r5, r7} | |
[34m0x00003eb4[m <+1004>: mov r1, r4 | |
[34m0x00003eb6[m <+1006>: stmia r1!, {r2, r3, r5, r7} | |
[34m0x00003eb8[m <+1008>: ldmia.w r0, {r2, r3, r5, r7} | |
[34m0x00003ebc[m <+1012>: stmia r1!, {r2, r3, r5, r7} | |
363 } | |
364 | |
365 /// Whether we want to send more data during this connection event. | |
366 /// | |
367 /// Note that this *has to* change to `false` eventually, even if there's more data to be sent, | |
368 /// because the connection event must close at least `T_IFS` before the next one occurs. | |
369 fn has_more_data(&self) -> bool { | |
370 false | |
371 } | |
372 | |
373 /// Advances the `unmapped_channel` and `channel` fields to the next data channel on which a | |
374 /// connection event will take place. | |
375 /// | |
376 /// According to: `4.5.8.2 Channel Selection`. | |
377 fn hop_channel(&mut self) { | |
378 let unmapped_channel = DataChannel::new((self.unmapped_channel.index() + self.hop) % 37); | |
379 | |
380 self.unmapped_channel = unmapped_channel; | |
381 self.channel = if self.channel_map.is_used(unmapped_channel) { | |
382 unmapped_channel | |
383 } else { | |
384 // This channel isn't used, remap channel according to map | |
385 let remapping_index = unmapped_channel.index() % self.channel_map.num_used_channels(); | |
386 self.channel_map.by_index(remapping_index) | |
387 }; | |
388 } | |
389 | |
390 /// Sends a new PDU to the connected device (ie. a non-retransmitted PDU). | |
391 fn send(&mut self, mut header: Header, tx: &mut C::Transmitter) { | |
392 header.set_md(self.has_more_data()); | |
393 header.set_nesn(self.next_expected_seq_num); | |
394 header.set_sn(self.transmit_seq_num); | |
395 self.last_header = header; | |
396 | |
397 tx.transmit_data(self.access_address, self.crc_init, header, self.channel); | |
398 | |
399 let pl = &tx.tx_payload_buf()[..usize::from(header.payload_length())]; | |
400 trace!("DATA->{:?}, {:?}", header, HexSlice(pl)); | |
401 } | |
402 | |
403 /// Tries to process and acknowledge an LL Control PDU. | |
404 /// | |
405 /// Returns `Err(())` when the connection is closed or lost. | |
406 /// | |
407 /// Note this this function is on a time-critical path and thus can not use logging since that's | |
408 /// currently way too slow. Critical errors can still be logged, since they abort the connection | |
409 /// anyways. | |
410 /// | |
411 /// # Parameters | |
412 /// | |
413 /// * **`pdu`**: The LL Control PDU (LLCPDU) to process. | |
414 /// * **`can_respond`**: Whether the radio's TX buffer may be overwritten to send a response. If | |
415 /// this is `false`, this method may choose not to acknowledge the PDU and wait for a | |
416 /// retransmission instead. | |
417 fn process_control_pdu( | |
418 &mut self, | |
419 pdu: ControlPdu<'_>, | |
420 can_respond: bool, | |
421 ) -> Result<Option<ControlPdu<'static>>, LlcpError> { | |
422 let response = match pdu { | |
423 ControlPdu::ConnectionUpdateReq(data) => { | |
[34m0x00003ebe[m <+1014>: ldrb.w r0, [sp, #136] ; 0x88 | |
[34m0x00003ec2[m <+1018>: cmp r0, #6 | |
[34m0x00003ec4[m <+1020>: bhi.n 0x3ef6 <rubble::link::connection::Connection<C>::process_data_packet+1070> | |
[34m0x00003ec6[m <+1022>: tbb [pc, r0] | |
[34m0x00003eca[m <+1026>: ldr r4, [pc, #16] ; (0x3edc <rubble::link::connection::Connection<C>::process_data_packet+1044>) | |
[34m0x00003ecc[m <+1028>: asrs r5, r3, #24 | |
[34m0x00003ece[m <+1030>: asrs r6, r7, #25 | |
[34m0x00003ed0[m <+1032>: lsls r1, r1, #2 | |
[34m0x00003ed2[m <+1034>: add r5, sp, #208 ; 0xd0 | |
[34m0x00003ed4[m <+1036>: adds r1, r4, #2 | |
424 self.prepare_llcp_update(LlcpUpdate::ConnUpdate(data))?; | |
[34m0x00003ed6[m <+1038>: adds r0, r5, #2 | |
[34m0x00003ed8[m <+1040>: movs r2, #12 | |
[34m0x00003eda[m <+1042>: bl 0xe84c <__aeabi_memcpy> | |
[34m0x00003ede[m <+1046>: mov.w r10, #0 | |
[34m0x00003ee2[m <+1050>: mov r0, r9 | |
[34m0x00003ee4[m <+1052>: mov r1, r5 | |
[34m0x00003ee6[m <+1054>: strb.w r10, [sp, #208] ; 0xd0 | |
[34m0x00003eea[m <+1058>: bl 0x3a54 <rubble::link::connection::Connection<C>::prepare_llcp_update> | |
[34m0x00003eee[m <+1062>: uxtb r0, r0 | |
[34m0x00003ef0[m <+1064>: cmp r0, #2 | |
[34m0x00003ef2[m <+1066>: beq.n 0x3f92 <rubble::link::connection::Connection<C>::process_data_packet+1226> | |
[34m0x00003ef4[m <+1068>: b.n 0x3fac <rubble::link::connection::Connection<C>::process_data_packet+1252> | |
[34m0x00003ef6[m <+1070>: add r0, sp, #136 ; 0x88 | |
450 sub_vers_nr: Hex(sub_vers_nr), | |
451 } | |
452 } | |
453 _ => ControlPdu::UnknownRsp { | |
454 unknown_type: pdu.opcode(), | |
[34m0x00003ef8[m <+1072>: bl 0x85f8 <rubble::link::llcp::ControlPdu::opcode> | |
[34m0x00003efc[m <+1076>: mov lr, r0 | |
[34m0x00003efe[m <+1078>: mov.w r11, #3 | |
[34m0x00003f02[m <+1082>: b.n 0x3fee <rubble::link::connection::Connection<C>::process_data_packet+1318> | |
431 ControlPdu::TerminateInd { error_code } => { | |
[34m0x00003f04[m <+1084>: ldrb.w r0, [sp, #137] ; 0x89 | |
[34m0x00003f08[m <+1088>: strb.w r0, [sp, #200] ; 0xc8 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003f0c[m <+1092>: movw r0, #10196 ; 0x27d4 | |
[34m0x00003f10[m <+1096>: movt r0, #8192 ; 0x2000 | |
[34m0x00003f14[m <+1100>: ldr r0, [r0, #0] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f16[m <+1102>: cmp r0, #3 | |
[34m0x00003f18[m <+1104>: bcc.n 0x3f52 <rubble::link::connection::Connection<C>::process_data_packet+1162> | |
[34m0x00003f1a[m <+1106>: movs r0, #1 | |
[34m0x00003f1c[m <+1108>: add r1, sp, #172 ; 0xac | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003f1e[m <+1110>: str r0, [sp, #228] ; 0xe4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f20[m <+1112>: movw r2, #1296 ; 0x510 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003f24[m <+1116>: str r1, [sp, #224] ; 0xe0 | |
[34m0x00003f26[m <+1118>: movs r1, #0 | |
[34m0x00003f28[m <+1120>: str r1, [sp, #220] ; 0xdc | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f2a[m <+1122>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003f2e[m <+1126>: strd r0, r1, [sp, #212] ; 0xd4 | |
[34m0x00003f32[m <+1130>: movw r0, #1288 ; 0x508 | |
[34m0x00003f36[m <+1134>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f3a[m <+1138>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003f3c[m <+1140>: str r0, [sp, #208] ; 0xd0 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003f3e[m <+1142>: movw r0, #24187 ; 0x5e7b | |
[34m0x00003f42[m <+1146>: movt r0, #0 | |
[34m0x00003f46[m <+1150>: str r0, [sp, #176] ; 0xb0 | |
[34m0x00003f48[m <+1152>: add r0, sp, #200 ; 0xc8 | |
[34m0x00003f4a[m <+1154>: str r0, [sp, #172] ; 0xac | |
[34m0x00003f4c[m <+1156>: add r0, sp, #208 ; 0xd0 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f4e[m <+1158>: bl 0xbaa2 <log::__private_api_log> | |
[34m0x00003f52[m <+1162>: mov.w r10, #0 | |
[34m0x00003f56[m <+1166>: movs r5, #1 | |
[34m0x00003f58[m <+1168>: mov.w r11, #10 | |
[34m0x00003f5c[m <+1172>: movs r3, #0 | |
[34m0x00003f5e[m <+1174>: movs r2, #1 | |
[34m0x00003f60[m <+1176>: b.n 0x3fbc <rubble::link::connection::Connection<C>::process_data_packet+1268> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
428 self.prepare_llcp_update(LlcpUpdate::ChannelMap { map, instant })?; | |
[34m0x00003f62[m <+1178>: ldrh.w r1, [sp, #141] ; 0x8d | |
[34m0x00003f66[m <+1182>: strh.w r1, [sp, #213] ; 0xd5 | |
[34m0x00003f6a[m <+1186>: ldr.w r1, [sp, #137] ; 0x89 | |
427 ControlPdu::ChannelMapReq { map, instant } => { | |
[34m0x00003f6e[m <+1190>: ldrh.w r0, [sp, #144] ; 0x90 | |
428 self.prepare_llcp_update(LlcpUpdate::ChannelMap { map, instant })?; | |
[34m0x00003f72[m <+1194>: str.w r1, [sp, #209] ; 0xd1 | |
[34m0x00003f76[m <+1198>: add r1, sp, #208 ; 0xd0 | |
[34m0x00003f78[m <+1200>: strh.w r0, [sp, #216] ; 0xd8 | |
[34m0x00003f7c[m <+1204>: movs r0, #1 | |
[34m0x00003f7e[m <+1206>: strb.w r0, [sp, #208] ; 0xd0 | |
[34m0x00003f82[m <+1210>: mov r0, r9 | |
[34m0x00003f84[m <+1212>: bl 0x3a54 <rubble::link::connection::Connection<C>::prepare_llcp_update> | |
[34m0x00003f88[m <+1216>: uxtb r0, r0 | |
[34m0x00003f8a[m <+1218>: cmp r0, #2 | |
[34m0x00003f8c[m <+1220>: bne.n 0x3fac <rubble::link::connection::Connection<C>::process_data_packet+1252> | |
[34m0x00003f8e[m <+1222>: mov.w r10, #0 | |
[34m0x00003f92[m <+1226>: str.w r10, [sp, #132] ; 0x84 | |
[34m0x00003f96[m <+1230>: mov.w r11, #10 | |
[34m0x00003f9a[m <+1234>: str.w r10, [sp, #128] ; 0x80 | |
[34m0x00003f9e[m <+1238>: movs r3, #0 | |
[34m0x00003fa0[m <+1240>: str.w r10, [sp, #124] ; 0x7c | |
[34m0x00003fa4[m <+1244>: movs r2, #0 | |
[34m0x00003fa6[m <+1246>: str.w r10, [sp, #120] ; 0x78 | |
[34m0x00003faa[m <+1250>: b.n 0x3fbc <rubble::link::connection::Connection<C>::process_data_packet+1268> | |
[34m0x00003fac[m <+1252>: and.w r5, r0, #1 | |
[34m0x00003fb0[m <+1256>: mov.w r10, #0 | |
[34m0x00003fb4[m <+1260>: movs r2, #1 | |
[34m0x00003fb6[m <+1262>: mov.w r11, #10 | |
[34m0x00003fba[m <+1266>: movs r3, #0 | |
[34m0x00003fbc[m <+1268>: movs r0, #0 | |
[34m0x00003fbe[m <+1270>: movs r1, #0 | |
[34m0x00003fc0[m <+1272>: mov.w lr, #0 | |
[34m0x00003fc4[m <+1276>: b.n 0x400a <rubble::link::connection::Connection<C>::process_data_packet+1346> | |
432 info!( | |
433 "closing connection due to termination request: code {:?}", | |
434 error_code | |
435 ); | |
436 return Err(LlcpError::ConnectionLost); | |
437 } | |
438 ControlPdu::FeatureReq { features_master } => ControlPdu::FeatureRsp { | |
[34m0x00003fc6[m <+1278>: ldrd r4, r5, [sp, #144] ; 0x90 | |
439 features_used: features_master & FeatureSet::supported(), | |
[34m0x00003fca[m <+1282>: bl 0x541c <rubble::link::features::FeatureSet::supported> | |
<::bitflags::__impl_bitflags macros>: | |
184 <::bitflags::__impl_bitflags macros>: No such file or directory. | |
[34m0x00003fce[m <+1286>: ands r1, r5 | |
[34m0x00003fd0[m <+1288>: str r1, [sp, #8] | |
[34m0x00003fd2[m <+1290>: and.w r10, r0, r4 | |
[34m0x00003fd6[m <+1294>: mov.w r11, #5 | |
[34m0x00003fda[m <+1298>: b.n 0x3fee <rubble::link::connection::Connection<C>::process_data_packet+1318> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
449 comp_id: CompanyId::from_raw(comp_id), | |
[34m0x00003fdc[m <+1300>: movw r0, #65535 ; 0xffff | |
[34m0x00003fe0[m <+1304>: bl 0x7db8 <rubble::link::comp_id::CompanyId::from_raw> | |
[34m0x00003fe4[m <+1308>: mov.w r11, #6 | |
[34m0x00003fe8[m <+1312>: mov.w lr, #2 | |
[34m0x00003fec[m <+1316>: movs r1, #0 | |
455 }, | |
456 }; | |
457 | |
458 // If we land here, we have a PDU we want to send | |
459 if can_respond { | |
[34m0x00003fee[m <+1318>: cbz r6, 0x4004 <rubble::link::connection::Connection<C>::process_data_packet+1340> | |
[34m0x00003ff0[m <+1320>: add r2, sp, #208 ; 0xd0 | |
[34m0x00003ff2[m <+1322>: mov r12, r8 | |
[34m0x00003ff4[m <+1324>: add r4, sp, #120 ; 0x78 | |
460 Ok(Some(response)) | |
[34m0x00003ff6[m <+1326>: ldmia.w r2, {r3, r5, r7, r8} | |
[34m0x00003ffa[m <+1330>: movs r2, #0 | |
[34m0x00003ffc[m <+1332>: stmia.w r4, {r3, r5, r7, r8} | |
[34m0x00004000[m <+1336>: mov r8, r12 | |
[34m0x00004002[m <+1338>: b.n 0x4006 <rubble::link::connection::Connection<C>::process_data_packet+1342> | |
[34m0x00004004[m <+1340>: movs r2, #1 | |
[34m0x00004006[m <+1342>: movs r5, #0 | |
[34m0x00004008[m <+1344>: ldr r3, [sp, #8] | |
177 Ok(Some(response)) => { | |
[34m0x0000400a[m <+1346>: cbz r2, 0x4024 <rubble::link::connection::Connection<C>::process_data_packet+1372> | |
196 | |
197 info!("LLCP<- {:?}", pdu); | |
198 info!("LLCP-> (no response)"); | |
199 } | |
200 Err(LlcpError::ConnectionLost) => { | |
[34m0x0000400c[m <+1348>: uxtb r0, r5 | |
[34m0x0000400e[m <+1350>: cmp r0, #1 | |
[34m0x00004010[m <+1352>: bne.w 0x3c20 <rubble::link::connection::Connection<C>::process_data_packet+344> | |
[34m0x00004014[m <+1356>: ldr r4, [sp, #20] | |
201 return Err(()); | |
[34m0x00004016[m <+1358>: movs r1, #24 | |
[34m0x00004018[m <+1360>: mov r0, r4 | |
[34m0x0000401a[m <+1362>: bl 0xeafc <__aeabi_memclr4> | |
[34m0x0000401e[m <+1366>: movs r0, #3 | |
[34m0x00004020[m <+1368>: str r0, [r4, #12] | |
[34m0x00004022[m <+1370>: b.n 0x3e34 <rubble::link::connection::Connection<C>::process_data_packet+876> | |
177 Ok(Some(response)) => { | |
[34m0x00004024[m <+1372>: cmp.w r11, #10 | |
[34m0x00004028[m <+1376>: bne.n 0x40aa <rubble::link::connection::Connection<C>::process_data_packet+1506> | |
189 responded = true; | |
190 | |
191 info!("LLCP<- {:?}", pdu); | |
192 info!("LLCP-> {:?}", response); | |
193 } | |
194 Ok(None) => { | |
195 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x0000402a[m <+1378>: ldr r0, [sp, #16] | |
[34m0x0000402c[m <+1380>: movs r1, #1 | |
[34m0x0000402e[m <+1382>: movs r5, #1 | |
[34m0x00004030[m <+1384>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00004034[m <+1388>: movw r4, #10196 ; 0x27d4 | |
[34m0x00004038[m <+1392>: movt r4, #8192 ; 0x2000 | |
[34m0x0000403c[m <+1396>: ldr r0, [r4, #0] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000403e[m <+1398>: cmp r0, #3 | |
[34m0x00004040[m <+1400>: bcc.n 0x4076 <rubble::link::connection::Connection<C>::process_data_packet+1454> | |
[34m0x00004042[m <+1402>: add r0, sp, #208 ; 0xd0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004044[m <+1404>: str r5, [sp, #156] ; 0x9c | |
[34m0x00004046[m <+1406>: str r0, [sp, #152] ; 0x98 | |
[34m0x00004048[m <+1408>: movs r0, #0 | |
[34m0x0000404a[m <+1410>: str r0, [sp, #148] ; 0x94 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000404c[m <+1412>: movw r2, #1464 ; 0x5b8 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004050[m <+1416>: strd r5, r0, [sp, #140] ; 0x8c | |
[34m0x00004054[m <+1420>: movw r0, #1384 ; 0x568 | |
[34m0x00004058[m <+1424>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000405c[m <+1428>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004060[m <+1432>: str r0, [sp, #136] ; 0x88 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00004062[m <+1434>: movw r0, #36189 ; 0x8d5d | |
[34m0x00004066[m <+1438>: movt r0, #0 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000406a[m <+1442>: movs r1, #3 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x0000406c[m <+1444>: strd r8, r0, [sp, #208] ; 0xd0 | |
[34m0x00004070[m <+1448>: add r0, sp, #136 ; 0x88 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004072[m <+1450>: bl 0xbaa2 <log::__private_api_log> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00004076[m <+1454>: ldr r0, [r4, #0] | |
[34m0x00004078[m <+1456>: movs r5, #0 | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000407a[m <+1458>: cmp r0, #3 | |
[34m0x0000407c[m <+1460>: bcc.w 0x3c22 <rubble::link::connection::Connection<C>::process_data_packet+346> | |
[34m0x00004080[m <+1464>: movs r0, #4 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004082[m <+1466>: str r5, [sp, #156] ; 0x9c | |
[34m0x00004084[m <+1468>: str r0, [sp, #152] ; 0x98 | |
[34m0x00004086[m <+1470>: movs r0, #1 | |
[34m0x00004088[m <+1472>: strd r5, r5, [sp, #144] ; 0x90 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000408c[m <+1476>: movw r2, #1520 ; 0x5f0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004090[m <+1480>: str r0, [sp, #140] ; 0x8c | |
[34m0x00004092[m <+1482>: movw r0, #1512 ; 0x5e8 | |
[34m0x00004096[m <+1486>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000409a[m <+1490>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000409e[m <+1494>: str r0, [sp, #136] ; 0x88 | |
[34m0x000040a0[m <+1496>: add r0, sp, #136 ; 0x88 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000040a2[m <+1498>: movs r1, #3 | |
[34m0x000040a4[m <+1500>: bl 0xbaa2 <log::__private_api_log> | |
[34m0x000040a8[m <+1504>: b.n 0x3c22 <rubble::link::connection::Connection<C>::process_data_packet+346> | |
[34m0x000040aa[m <+1506>: movs r2, #0 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
177 Ok(Some(response)) => { | |
[34m0x000040ac[m <+1508>: str.w r10, [sp, #144] ; 0x90 | |
[34m0x000040b0[m <+1512>: strh.w r2, [sp, #142] ; 0x8e | |
[34m0x000040b4[m <+1516>: add.w r10, sp, #136 ; 0x88 | |
[34m0x000040b8[m <+1520>: strh.w r0, [sp, #140] ; 0x8c | |
[34m0x000040bc[m <+1524>: add.w r0, r10, #16 | |
[34m0x000040c0[m <+1528>: strb.w r2, [sp, #139] ; 0x8b | |
[34m0x000040c4[m <+1532>: strb.w r1, [sp, #138] ; 0x8a | |
[34m0x000040c8[m <+1536>: add r1, sp, #120 ; 0x78 | |
[34m0x000040ca[m <+1538>: strb.w lr, [sp, #137] ; 0x89 | |
[34m0x000040ce[m <+1542>: strb.w r11, [sp, #136] ; 0x88 | |
[34m0x000040d2[m <+1546>: str r3, [sp, #148] ; 0x94 | |
[34m0x000040d4[m <+1548>: ldmia.w r1, {r2, r3, r5, r7} | |
178 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x000040d8[m <+1552>: movs r1, #1 | |
177 Ok(Some(response)) => { | |
[34m0x000040da[m <+1554>: stmia r0!, {r2, r3, r5, r7} | |
178 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x000040dc[m <+1556>: ldr r0, [sp, #16] | |
[34m0x000040de[m <+1558>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x000040e2[m <+1562>: add r4, sp, #172 ; 0xac | |
179 | |
180 let rsp = Pdu::from(&response); | |
[34m0x000040e4[m <+1564>: mov r1, r10 | |
[34m0x000040e6[m <+1566>: mov r0, r4 | |
[34m0x000040e8[m <+1568>: bl 0x53bc <<rubble::link::data::Pdu<&[u8]> as core::convert::From<&rubble::link::llcp::ControlPdu>>::from> | |
181 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf()); | |
[34m0x000040ec[m <+1572>: ldr r0, [sp, #24] | |
[34m0x000040ee[m <+1574>: bl 0x4e06 <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf> | |
[34m0x000040f2[m <+1578>: bl 0x834c <rubble::bytes::ByteWriter::new> | |
[34m0x000040f6[m <+1582>: add r5, sp, #188 ; 0xbc | |
[34m0x000040f8[m <+1584>: strd r0, r1, [sp, #188] ; 0xbc | |
182 let left = payload_writer.space_left(); | |
[34m0x000040fc[m <+1588>: mov r0, r5 | |
[34m0x000040fe[m <+1590>: bl 0x83ba <rubble::bytes::ByteWriter::space_left> | |
[34m0x00004102[m <+1594>: mov r7, r0 | |
183 rsp.to_bytes(&mut payload_writer).unwrap(); | |
[34m0x00004104[m <+1596>: mov r0, r4 | |
[34m0x00004106[m <+1598>: mov r1, r5 | |
[34m0x00004108[m <+1600>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes> | |
[34m0x0000410c[m <+1604>: uxtb r0, r0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: | |
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory. | |
[34m0x0000410e[m <+1606>: cmp r0, #5 | |
[34m0x00004110[m <+1608>: bne.n 0x41dc <rubble::link::connection::Connection<C>::process_data_packet+1812> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
185 let mut header = Header::new(Llid::Control); | |
[34m0x00004112[m <+1610>: movs r0, #3 | |
[34m0x00004114[m <+1612>: bl 0x5240 <rubble::link::data::Header::new> | |
[34m0x00004118[m <+1616>: strh.w r0, [sp, #198] ; 0xc6 | |
[34m0x0000411c[m <+1620>: add r0, sp, #188 ; 0xbc | |
186 let pl_len = (left - payload_writer.space_left()) as u8; | |
[34m0x0000411e[m <+1622>: bl 0x83ba <rubble::bytes::ByteWriter::space_left> | |
[34m0x00004122[m <+1626>: subs r1, r7, r0 | |
[34m0x00004124[m <+1628>: bcc.n 0x41ec <rubble::link::connection::Connection<C>::process_data_packet+1828> | |
[34m0x00004126[m <+1630>: add.w r0, sp, #198 ; 0xc6 | |
187 header.set_payload_length(pl_len); | |
[34m0x0000412a[m <+1634>: bl 0x526c <rubble::link::data::Header::set_payload_length> | |
188 self.send(header, tx); | |
[34m0x0000412e[m <+1638>: ldrh.w r1, [sp, #198] ; 0xc6 | |
[34m0x00004132[m <+1642>: mov r0, r9 | |
[34m0x00004134[m <+1644>: ldr r2, [sp, #24] | |
[34m0x00004136[m <+1646>: bl 0x4204 <rubble::link::connection::Connection<C>::send> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x0000413a[m <+1650>: movw r4, #10196 ; 0x27d4 | |
[34m0x0000413e[m <+1654>: movt r4, #8192 ; 0x2000 | |
[34m0x00004142[m <+1658>: ldr r0, [r4, #0] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004144[m <+1660>: cmp r0, #3 | |
[34m0x00004146[m <+1662>: bcc.n 0x417e <rubble::link::connection::Connection<C>::process_data_packet+1718> | |
[34m0x00004148[m <+1664>: movs r0, #1 | |
[34m0x0000414a[m <+1666>: add r1, sp, #200 ; 0xc8 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000414c[m <+1668>: str r0, [sp, #228] ; 0xe4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000414e[m <+1670>: movw r2, #1392 ; 0x570 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004152[m <+1674>: str r1, [sp, #224] ; 0xe0 | |
[34m0x00004154[m <+1676>: movs r1, #0 | |
[34m0x00004156[m <+1678>: str r1, [sp, #220] ; 0xdc | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004158[m <+1680>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000415c[m <+1684>: strd r0, r1, [sp, #212] ; 0xd4 | |
[34m0x00004160[m <+1688>: movw r0, #1384 ; 0x568 | |
[34m0x00004164[m <+1692>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004168[m <+1696>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000416a[m <+1698>: str r0, [sp, #208] ; 0xd0 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x0000416c[m <+1700>: movw r0, #36189 ; 0x8d5d | |
[34m0x00004170[m <+1704>: movt r0, #0 | |
[34m0x00004174[m <+1708>: strd r8, r0, [sp, #200] ; 0xc8 | |
[34m0x00004178[m <+1712>: add r0, sp, #208 ; 0xd0 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000417a[m <+1714>: bl 0xbaa2 <log::__private_api_log> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x0000417e[m <+1718>: ldr r0, [r4, #0] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004180[m <+1720>: cmp r0, #3 | |
[34m0x00004182[m <+1722>: bcc.n 0x41ba <rubble::link::connection::Connection<C>::process_data_packet+1778> | |
[34m0x00004184[m <+1724>: movs r0, #1 | |
[34m0x00004186[m <+1726>: add r1, sp, #200 ; 0xc8 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004188[m <+1728>: str r0, [sp, #228] ; 0xe4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000418a[m <+1730>: movw r2, #1436 ; 0x59c | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000418e[m <+1734>: str r1, [sp, #224] ; 0xe0 | |
[34m0x00004190[m <+1736>: movs r1, #0 | |
[34m0x00004192[m <+1738>: str r1, [sp, #220] ; 0xdc | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004194[m <+1740>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004198[m <+1744>: strd r0, r1, [sp, #212] ; 0xd4 | |
[34m0x0000419c[m <+1748>: movw r0, #1428 ; 0x594 | |
[34m0x000041a0[m <+1752>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000041a4[m <+1756>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x000041a6[m <+1758>: str r0, [sp, #208] ; 0xd0 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x000041a8[m <+1760>: movw r0, #36189 ; 0x8d5d | |
[34m0x000041ac[m <+1764>: movt r0, #0 | |
[34m0x000041b0[m <+1768>: strd r10, r0, [sp, #200] ; 0xc8 | |
[34m0x000041b4[m <+1772>: add r0, sp, #208 ; 0xd0 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000041b6[m <+1774>: bl 0xbaa2 <log::__private_api_log> | |
[34m0x000041ba[m <+1778>: movs r5, #1 | |
[34m0x000041bc[m <+1780>: b.n 0x3c22 <rubble::link::connection::Connection<C>::process_data_packet+346> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: | |
956 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory. | |
[34m0x000041be[m <+1782>: strb.w r0, [sp, #88] ; 0x58 | |
[34m0x000041c2[m <+1786>: movw r0, #708 ; 0x2c4 | |
[34m0x000041c6[m <+1790>: movt r0, #1 | |
[34m0x000041ca[m <+1794>: add r2, sp, #88 ; 0x58 | |
[34m0x000041cc[m <+1796>: movw r3, #752 ; 0x2f0 | |
[34m0x000041d0[m <+1800>: movs r1, #43 ; 0x2b | |
[34m0x000041d2[m <+1802>: movt r3, #1 | |
[34m0x000041d6[m <+1806>: bl 0xbdfa <core::result::unwrap_failed> | |
[34m0x000041da[m <+1810>: udf #254 ; 0xfe | |
[34m0x000041dc[m <+1812>: strb.w r0, [sp, #208] ; 0xd0 | |
[34m0x000041e0[m <+1816>: movw r0, #708 ; 0x2c4 | |
[34m0x000041e4[m <+1820>: add r2, sp, #208 ; 0xd0 | |
[34m0x000041e6[m <+1822>: movt r0, #1 | |
[34m0x000041ea[m <+1826>: b.n 0x41cc <rubble::link::connection::Connection<C>::process_data_packet+1796> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
186 let pl_len = (left - payload_writer.space_left()) as u8; | |
[34m0x000041ec[m <+1828>: movw r0, #1344 ; 0x540 | |
[34m0x000041f0[m <+1832>: movw r2, #1324 ; 0x52c | |
[34m0x000041f4[m <+1836>: movt r0, #1 | |
[34m0x000041f8[m <+1840>: movt r2, #1 | |
[34m0x000041fc[m <+1844>: movs r1, #33 ; 0x21 | |
[34m0x000041fe[m <+1846>: bl 0xbd3a <core::panicking::panic> | |
[34m0x00004202[m <+1850>: udf #254 ; 0xfe | |
End of assembler dump. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Dump of assembler code for function rubble::link::connection::Connection<C>::process_data_packet: | |
/Projects/rubble/rubble/src/link/connection.rs: | |
130 pub(crate) fn process_data_packet( | |
[34m0x00003acc[m <+0>: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr} | |
[34m0x00003ad0[m <+4>: sub sp, #244 ; 0xf4 | |
[34m0x00003ad2[m <+6>: str r0, [sp, #20] | |
[34m0x00003ad4[m <+8>: add.w r6, sp, #30 | |
[34m0x00003ad8[m <+12>: ldr r0, [sp, #288] ; 0x120 | |
[34m0x00003ada[m <+14>: mov r8, r1 | |
[34m0x00003adc[m <+16>: str r0, [sp, #32] | |
[34m0x00003ade[m <+18>: ldr r0, [sp, #284] ; 0x11c | |
[34m0x00003ae0[m <+20>: strh.w r0, [sp, #30] | |
131 &mut self, | |
132 rx_end: Instant, | |
133 tx: &mut C::Transmitter, | |
134 timer: &mut C::Timer, | |
135 header: data::Header, | |
136 payload: &[u8], | |
137 crc_ok: bool, | |
138 ) -> Result<Cmd, ()> { | |
139 // If the sequence number of the packet is the same as our next expected sequence number, | |
140 // the packet contains new data that we should try to process. However, if the CRC is bad, | |
141 // we'll never try to process the data and instead request a retransmission. | |
142 let is_new = header.sn() == self.next_expected_seq_num && crc_ok; | |
[34m0x00003ae4[m <+24>: mov r0, r6 | |
[34m0x00003ae6[m <+26>: ldr r5, [sp, #292] ; 0x124 | |
[34m0x00003ae8[m <+28>: str r3, [sp, #24] | |
[34m0x00003aea[m <+30>: str r2, [sp, #12] | |
[34m0x00003aec[m <+32>: str r5, [sp, #36] ; 0x24 | |
[34m0x00003aee[m <+34>: bl 0x53cc <rubble::link::data::Header::sn> | |
/Projects/rubble/rubble/src/link/seq_num.rs: | |
11 pub struct SeqNum(bool); | |
[34m0x00003af2[m <+38>: mov r2, r8 | |
[34m0x00003af4[m <+40>: ldr.w r9, [sp, #296] ; 0x128 | |
[34m0x00003af8[m <+44>: ldrb.w r1, [r2, #48]! | |
[34m0x00003afc[m <+48>: str r2, [sp, #16] | |
[34m0x00003afe[m <+50>: clz r1, r1 | |
[34m0x00003b02[m <+54>: lsrs r1, r1, #5 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
142 let is_new = header.sn() == self.next_expected_seq_num && crc_ok; | |
[34m0x00003b04[m <+56>: eors r0, r1 | |
[34m0x00003b06[m <+58>: and.w r11, r0, r9 | |
143 | |
144 // If the packet's "NESN" is equal to our last sent sequence number + 1, the other side has | |
145 // acknowledged our last packet (and is now expecting one with an incremented seq. num.). | |
146 // However, if the CRC is bad, the bit might be flipped, so we cannot assume that the packet | |
147 // was acknowledged and thus always retransmit. | |
148 let acknowledged = header.nesn() == self.transmit_seq_num + SeqNum::ONE && crc_ok; | |
[34m0x00003b0a[m <+62>: mov r0, r6 | |
[34m0x00003b0c[m <+64>: bl 0x53b2 <rubble::link::data::Header::nesn> | |
[34m0x00003b10[m <+68>: mov r4, r8 | |
[m [34m0x00003b12[m <+70>: mov r7, r0 | |
[34m0x00003b14[m <+72>: ldrb.w r0, [r4, #47]! | |
[34m0x00003b18[m <+76>: movs r1, #1 | |
[34m0x00003b1a[m <+78>: mov.w r10, #1 | |
[34m0x00003b1e[m <+82>: bl 0x831a <<rubble::link::seq_num::SeqNum as core::ops::arith::Add>::add> | |
[34m0x00003b22[m <+86>: eors r0, r7 | |
[34m0x00003b24[m <+88>: bic.w r9, r9, r0 | |
149 | |
150 let is_empty = header.llid() == Llid::DataCont && payload.is_empty(); | |
[34m0x00003b28[m <+92>: mov r0, r6 | |
[34m0x00003b2a[m <+94>: bl 0x5398 <rubble::link::data::Header::llid> | |
[34m0x00003b2e[m <+98>: mov r7, r0 | |
151 | |
152 if acknowledged { | |
[34m0x00003b30[m <+100>: cmp.w r9, #1 | |
[34m0x00003b34[m <+104>: bne.n 0x3b42 <rubble::link::connection::Connection<C>::process_data_packet+118> | |
154 self.transmit_seq_num += SeqNum::ONE; | |
[34m0x00003b36[m <+106>: mov r0, r4 | |
[34m0x00003b38[m <+108>: movs r1, #1 | |
153 self.received_packet = true; | |
[34m0x00003b3a[m <+110>: strb.w r10, [r8, #49] ; 0x31 | |
154 self.transmit_seq_num += SeqNum::ONE; | |
[34m0x00003b3e[m <+114>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x00003b42[m <+118>: ldr r6, [sp, #24] | |
155 } | |
156 | |
157 // Whether we've already sent a response packet. | |
158 let mut responded = false; | |
159 // Whether we've pushed more work into the RX queue. | |
160 let mut queued_work = false; | |
161 | |
162 if is_new { | |
[34m0x00003b44[m <+120>: cmp.w r11, #0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003b48[m <+124>: movw r11, #10196 ; 0x27d4 | |
[34m0x00003b4c[m <+128>: movt r11, #8192 ; 0x2000 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
162 if is_new { | |
[34m0x00003b50[m <+132>: beq.n 0x3b6a <rubble::link::connection::Connection<C>::process_data_packet+158> | |
[34m0x00003b52[m <+134>: uxtb r0, r7 | |
[34m0x00003b54[m <+136>: eor.w r0, r0, #1 | |
[34m0x00003b58[m <+140>: orrs r0, r5 | |
[34m0x00003b5a[m <+142>: clz r0, r0 | |
[34m0x00003b5e[m <+146>: lsrs r0, r0, #5 | |
163 if is_empty { | |
[34m0x00003b60[m <+148>: beq.n 0x3bf8 <rubble::link::connection::Connection<C>::process_data_packet+300> | |
164 // Always acknowledge empty packets, no need to process them | |
165 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x00003b62[m <+150>: ldr r0, [sp, #16] | |
[34m0x00003b64[m <+152>: movs r1, #1 | |
[34m0x00003b66[m <+154>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x00003b6a[m <+158>: mov.w r10, #0 | |
[34m0x00003b6e[m <+162>: movs r4, #0 | |
224 queued_work = true; | |
225 } else { | |
226 trace!("NACK (no space in rx buffer)"); | |
227 } | |
228 } | |
229 } | |
230 | |
231 if acknowledged { | |
[34m0x00003b70[m <+164>: cmp.w r9, #0 | |
[34m0x00003b74[m <+168>: beq.n 0x3b9c <rubble::link::connection::Connection<C>::process_data_packet+208> | |
232 if !responded { | |
[34m0x00003b76[m <+170>: cmp r4, #0 | |
[34m0x00003b78[m <+172>: bne.w 0x3ca0 <rubble::link::connection::Connection<C>::process_data_packet+468> | |
233 // Send a new data packet. | |
234 | |
235 // Try to acquire PDU from the tx queue, fall back to an empty PDU. | |
236 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf()); | |
[34m0x00003b7c[m <+176>: mov r0, r6 | |
[34m0x00003b7e[m <+178>: bl 0x4f2e <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf> | |
[34m0x00003b82[m <+182>: bl 0x8474 <rubble::bytes::ByteWriter::new> | |
[34m0x00003b86[m <+186>: strd r0, r1, [sp, #168] ; 0xa8 | |
237 let header = match self.tx.consume_raw_with(|header, pl| { | |
[34m0x00003b8a[m <+190>: add.w r0, r8, #12 | |
[34m0x00003b8e[m <+194>: add r1, sp, #168 ; 0xa8 | |
[34m0x00003b90[m <+196>: bl 0x4de <<rubble::link::queue::SimpleConsumer as rubble::link::queue::Consumer>::consume_raw_with> | |
238 payload_writer.write_slice(pl).expect("TX buf out of space"); | |
239 Consume::always(Ok(header)) | |
240 }) { | |
241 Ok(h) => h, | |
[34m0x00003b94[m <+200>: lsls r1, r0, #31 | |
[34m0x00003b96[m <+202>: bne.n 0x3c90 <rubble::link::connection::Connection<C>::process_data_packet+452> | |
237 let header = match self.tx.consume_raw_with(|header, pl| { | |
[34m0x00003b98[m <+204>: lsrs r1, r0, #16 | |
[34m0x00003b9a[m <+206>: b.n 0x3c98 <rubble::link::connection::Connection<C>::process_data_packet+460> | |
243 }; | |
244 | |
245 self.send(header, tx); | |
246 } | |
247 } else { | |
248 // Last packet not acknowledged, resend. | |
249 // If CRC is bad, this bit could be flipped, so we always retransmit in that case. | |
250 if self.received_packet { | |
[34m0x00003b9c[m <+208>: ldrb.w r0, [r8, #49] ; 0x31 | |
[34m0x00003ba0[m <+212>: cmp r0, #0 | |
[34m0x00003ba2[m <+214>: beq.n 0x3c2e <rubble::link::connection::Connection<C>::process_data_packet+354> | |
251 self.last_header.set_nesn(self.next_expected_seq_num); | |
[34m0x00003ba4[m <+216>: ldrb.w r1, [r8, #48] ; 0x30 | |
[34m0x00003ba8[m <+220>: add.w r0, r8, #22 | |
[34m0x00003bac[m <+224>: bl 0x53ba <rubble::link::data::Header::set_nesn> | |
252 tx.transmit_data( | |
[34m0x00003bb0[m <+228>: ldrh.w r3, [r8, #22] | |
253 self.access_address, | |
[34m0x00003bb4[m <+232>: ldrd r1, r2, [r8] | |
252 tx.transmit_data( | |
[34m0x00003bb8[m <+236>: ldrb.w r0, [r8, #46] ; 0x2e | |
[34m0x00003bbc[m <+240>: str r0, [sp, #0] | |
[34m0x00003bbe[m <+242>: mov r0, r6 | |
[34m0x00003bc0[m <+244>: bl 0x4fc2 <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::transmit_data> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003bc4[m <+248>: ldr.w r0, [r11] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bc8[m <+252>: cmp r0, #5 | |
[34m0x00003bca[m <+254>: bcc.n 0x3ca0 <rubble::link::connection::Connection<C>::process_data_packet+468> | |
[34m0x00003bcc[m <+256>: movs r0, #0 | |
[34m0x00003bce[m <+258>: movs r1, #4 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003bd0[m <+260>: str r0, [sp, #188] ; 0xbc | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bd2[m <+262>: movw r2, #1936 ; 0x790 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003bd6[m <+266>: str r1, [sp, #184] ; 0xb8 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bd8[m <+268>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003bdc[m <+272>: strd r0, r0, [sp, #176] ; 0xb0 | |
[34m0x00003be0[m <+276>: movs r0, #1 | |
[34m0x00003be2[m <+278>: str r0, [sp, #172] ; 0xac | |
[34m0x00003be4[m <+280>: movw r0, #1928 ; 0x788 | |
[34m0x00003be8[m <+284>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bec[m <+288>: movs r1, #5 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003bee[m <+290>: str r0, [sp, #168] ; 0xa8 | |
[34m0x00003bf0[m <+292>: add r0, sp, #168 ; 0xa8 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003bf2[m <+294>: bl 0xbbca <log::__private_api_log> | |
[34m0x00003bf6[m <+298>: b.n 0x3ca0 <rubble::link::connection::Connection<C>::process_data_packet+468> | |
[34m0x00003bf8[m <+300>: add.w r0, sp, #30 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
166 } else if header.llid() == Llid::Control { | |
[34m0x00003bfc[m <+304>: bl 0x5398 <rubble::link::data::Header::llid> | |
[34m0x00003c00[m <+308>: uxtb r0, r0 | |
[34m0x00003c02[m <+310>: cmp r0, #3 | |
[34m0x00003c04[m <+312>: bne.n 0x3c62 <rubble::link::connection::Connection<C>::process_data_packet+406> | |
167 // LLCP message, try to process it immediately. Certain LLCPDUs might be put in the | |
168 // channel instead and answered by the non-real-time part. | |
169 | |
170 if let Ok(pdu) = ControlPdu::from_bytes(&mut ByteReader::new(payload)) { | |
[34m0x00003c06[m <+314>: ldrd r0, r1, [sp, #32] | |
[34m0x00003c0a[m <+318>: bl 0x8592 <rubble::bytes::ByteReader::new> | |
[34m0x00003c0e[m <+322>: add r4, sp, #168 ; 0xa8 | |
[34m0x00003c10[m <+324>: strd r0, r1, [sp, #40] ; 0x28 | |
[34m0x00003c14[m <+328>: add r1, sp, #40 ; 0x28 | |
[34m0x00003c16[m <+330>: mov r0, r4 | |
[34m0x00003c18[m <+332>: bl 0x8814 <<rubble::link::llcp::ControlPdu as rubble::bytes::FromBytes>::from_bytes> | |
[34m0x00003c1c[m <+336>: ldrb.w r0, [sp, #168] ; 0xa8 | |
[34m0x00003c20[m <+340>: cmp r0, #0 | |
[34m0x00003c22[m <+342>: beq.w 0x3fa0 <rubble::link::connection::Connection<C>::process_data_packet+1236> | |
[34m0x00003c26[m <+346>: movs r4, #0 | |
[34m0x00003c28[m <+348>: mov.w r10, #0 | |
[34m0x00003c2c[m <+352>: b.n 0x3b70 <rubble::link::connection::Connection<C>::process_data_packet+164> | |
[34m0x00003c2e[m <+354>: add r4, sp, #168 ; 0xa8 | |
[34m0x00003c30[m <+356>: movs r0, #1 | |
254 self.crc_init, | |
255 self.last_header, | |
256 self.channel, | |
257 ); | |
258 trace!("<<RESENT>>"); | |
259 } else { | |
260 // We've never received (and thus sent) a data packet before, so we can't | |
261 // *re*transmit anything. Send empty PDU instead. | |
262 // (this should not really happen, though!) | |
263 self.received_packet = true; | |
[34m0x00003c32[m <+358>: strb.w r0, [r8, #49] ; 0x31 | |
264 | |
265 let pdu = Pdu::empty(); | |
[34m0x00003c36[m <+362>: mov r0, r4 | |
[34m0x00003c38[m <+364>: bl 0x54d8 <rubble::link::data::Pdu<&[u8]>::empty> | |
266 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf()); | |
[34m0x00003c3c[m <+368>: mov r0, r6 | |
[34m0x00003c3e[m <+370>: bl 0x4f2e <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf> | |
[34m0x00003c42[m <+374>: bl 0x8474 <rubble::bytes::ByteWriter::new> | |
[34m0x00003c46[m <+378>: strd r0, r1, [sp, #96] ; 0x60 | |
[34m0x00003c4a[m <+382>: add r1, sp, #96 ; 0x60 | |
267 pdu.to_bytes(&mut payload_writer).unwrap(); | |
[34m0x00003c4c[m <+384>: mov r0, r4 | |
[34m0x00003c4e[m <+386>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes> | |
[34m0x00003c52[m <+390>: uxtb r0, r0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: | |
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory. | |
[34m0x00003c54[m <+392>: cmp r0, #5 | |
[34m0x00003c56[m <+394>: bne.w 0x42e6 <rubble::link::connection::Connection<C>::process_data_packet+2074> | |
/Projects/rubble/rubble/src/link/data.rs: | |
224 Pdu::DataCont { .. } => Llid::DataCont, | |
[34m0x00003c5a[m <+398>: ldrb.w r0, [sp, #168] ; 0xa8 | |
[34m0x00003c5e[m <+402>: adds r0, #1 | |
[34m0x00003c60[m <+404>: b.n 0x3c92 <rubble::link::connection::Connection<C>::process_data_packet+454> | |
[34m0x00003c62[m <+406>: add.w r4, sp, #30 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
216 .produce_with(header.payload_length().into(), |writer| { | |
[34m0x00003c66[m <+410>: mov r0, r4 | |
[34m0x00003c68[m <+412>: bl 0x5390 <rubble::link::data::Header::payload_length> | |
[34m0x00003c6c[m <+416>: mov r1, r0 | |
215 self.rx | |
[34m0x00003c6e[m <+418>: add.w r0, r8, #16 | |
[34m0x00003c72[m <+422>: add r2, sp, #32 | |
[34m0x00003c74[m <+424>: mov r3, r4 | |
[34m0x00003c76[m <+426>: bl 0x3f2 <rubble::link::queue::Producer::produce_with> | |
[34m0x00003c7a[m <+430>: uxtb r0, r0 | |
217 writer.write_slice(payload)?; | |
218 Ok(header.llid()) | |
219 }); | |
220 | |
221 if result.is_ok() { | |
[34m0x00003c7c[m <+432>: cmp r0, #5 | |
[34m0x00003c7e[m <+434>: bne.w 0x3f66 <rubble::link::connection::Connection<C>::process_data_packet+1178> | |
222 // Acknowledge the packet | |
223 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x00003c82[m <+438>: ldr r0, [sp, #16] | |
[34m0x00003c84[m <+440>: movs r1, #1 | |
[34m0x00003c86[m <+442>: mov.w r10, #1 | |
[34m0x00003c8a[m <+446>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x00003c8e[m <+450>: b.n 0x3b6e <rubble::link::connection::Connection<C>::process_data_packet+162> | |
242 Err(_) => Header::new(Llid::DataCont), | |
[34m0x00003c90[m <+452>: movs r0, #1 | |
[34m0x00003c92[m <+454>: bl 0x5368 <rubble::link::data::Header::new> | |
[34m0x00003c96[m <+458>: mov r1, r0 | |
[34m0x00003c98[m <+460>: mov r0, r8 | |
[34m0x00003c9a[m <+462>: mov r2, r6 | |
[34m0x00003c9c[m <+464>: bl 0x432c <rubble::link::connection::Connection<C>::send> | |
268 self.send(Header::new(pdu.llid()), tx); | |
269 } | |
270 } | |
271 | |
272 let last_channel = self.channel; | |
[34m0x00003ca0[m <+468>: mov r6, r8 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: | |
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory. | |
[34m0x00003ca2[m <+470>: mov r9, r8 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
272 let last_channel = self.channel; | |
[34m0x00003ca4[m <+472>: ldrb.w r0, [r6, #46]! | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: | |
624 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: No such file or directory. | |
[34m0x00003ca8[m <+476>: mov r5, r8 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
272 let last_channel = self.channel; | |
[34m0x00003caa[m <+478>: strb.w r0, [sp, #160] ; 0xa0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: | |
624 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: No such file or directory. | |
[34m0x00003cae[m <+482>: movs r2, #13 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: | |
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory. | |
[34m0x00003cb0[m <+484>: ldrh.w r0, [r9, #20]! | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/mod.rs: | |
3301 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/mod.rs: No such file or directory. | |
[34m0x00003cb4[m <+488>: adds r0, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: | |
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory. | |
[34m0x00003cb6[m <+490>: strh.w r0, [r9] | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: | |
624 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/ptr/mod.rs: No such file or directory. | |
[34m0x00003cba[m <+494>: ldrb.w r4, [r5, #24]! | |
[34m0x00003cbe[m <+498>: add r0, sp, #132 ; 0x84 | |
[34m0x00003cc0[m <+500>: adds r1, r5, #1 | |
[34m0x00003cc2[m <+502>: bl 0xe974 <__aeabi_memcpy> | |
[34m0x00003cc6[m <+506>: movs r0, #0 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
279 if let Some(update) = self.update_data.take() { | |
[34m0x00003cc8[m <+508>: cmp r4, #2 | |
[34m0x00003cca[m <+510>: mov.w r1, #2 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs: | |
1486 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs: No such file or directory. | |
[34m0x00003cce[m <+514>: str.w r0, [r5, #1] | |
[34m0x00003cd2[m <+518>: strb r1, [r5, #0] | |
[34m0x00003cd4[m <+520>: str.w r0, [r5, #5] | |
[34m0x00003cd8[m <+524>: str.w r0, [r5, #9] | |
[34m0x00003cdc[m <+528>: strb r0, [r5, #13] | |
[34m0x00003cde[m <+530>: beq.w 0x3e0a <rubble::link::connection::Connection<C>::process_data_packet+830> | |
[34m0x00003ce2[m <+534>: add r7, sp, #216 ; 0xd8 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
279 if let Some(update) = self.update_data.take() { | |
[34m0x00003ce4[m <+536>: strb.w r4, [sp, #216] ; 0xd8 | |
[34m0x00003ce8[m <+540>: adds r4, r7, #1 | |
[34m0x00003cea[m <+542>: add r1, sp, #132 ; 0x84 | |
[34m0x00003cec[m <+544>: movs r2, #13 | |
[34m0x00003cee[m <+546>: mov r0, r4 | |
[34m0x00003cf0[m <+548>: bl 0xe974 <__aeabi_memcpy> | |
280 if update.instant() == self.conn_event_count.0 { | |
[34m0x00003cf4[m <+552>: mov r0, r7 | |
[34m0x00003cf6[m <+554>: bl 0x7dd8 <rubble::link::connection::LlcpUpdate::instant> | |
[34m0x00003cfa[m <+558>: ldrh.w r1, [r9] | |
[34m0x00003cfe[m <+562>: uxth r0, r0 | |
[34m0x00003d00[m <+564>: cmp r0, r1 | |
[34m0x00003d02[m <+566>: bne.n 0x3d36 <rubble::link::connection::Connection<C>::process_data_packet+618> | |
[34m0x00003d04[m <+568>: mov r11, r10 | |
[34m0x00003d06[m <+570>: add.w r10, sp, #168 ; 0xa8 | |
281 // Next conn event will the the first one with these parameters. | |
282 let result = self.apply_llcp_update(update, rx_end); | |
[34m0x00003d0a[m <+574>: mov r1, r4 | |
[34m0x00003d0c[m <+576>: movs r2, #13 | |
[34m0x00003d0e[m <+578>: mov r0, r10 | |
[34m0x00003d10[m <+580>: ldrb.w r5, [sp, #216] ; 0xd8 | |
[34m0x00003d14[m <+584>: bl 0xe974 <__aeabi_memcpy> | |
461 } else { | |
462 Err(LlcpError::NoSpace) | |
463 } | |
464 } | |
465 | |
466 /// Stores `update` in the link layer state so that it will be applied once its *instant* is | |
467 /// reached. | |
468 fn prepare_llcp_update(&mut self, update: LlcpUpdate) -> Result<(), LlcpError> { | |
469 // TODO: check that instant is <32767 in the future | |
470 if let Some(data) = self.update_data { | |
471 error!( | |
472 "got update data {:?} while update {:?} is already queued", | |
473 update, data | |
474 ); | |
475 Err(LlcpError::ConnectionLost) | |
476 } else { | |
477 self.update_data = Some(update); | |
478 Ok(()) | |
479 } | |
480 } | |
481 | |
482 /// Patches the link layer state to incorporate `update`. | |
483 /// | |
484 /// Returns a `Cmd` when the usual Link Layer `Cmd` should be overridden. In that case, this | |
485 /// method must also perform channel hopping. | |
486 fn apply_llcp_update(&mut self, update: LlcpUpdate, rx_end: Instant) -> Option<Cmd> { | |
487 match update { | |
488 LlcpUpdate::ConnUpdate(data) => { | |
[34m0x00003d18[m <+588>: cmp r5, #1 | |
[34m0x00003d1a[m <+590>: bne.n 0x3d40 <rubble::link::connection::Connection<C>::process_data_packet+628> | |
503 crc_init: self.crc_init, | |
504 }, | |
505 // This function never queues work, but the caller might change this to `true` | |
506 queued_work: false, | |
507 }) | |
508 } | |
509 LlcpUpdate::ChannelMap { map, .. } => { | |
510 self.channel_map = map; | |
[34m0x00003d1c[m <+592>: ldrh.w r0, [sp, #172] ; 0xac | |
511 None | |
[34m0x00003d20[m <+596>: movs r1, #24 | |
510 self.channel_map = map; | |
[34m0x00003d22[m <+598>: strh.w r0, [r8, #42] ; 0x2a | |
[34m0x00003d26[m <+602>: ldr r0, [sp, #168] ; 0xa8 | |
[34m0x00003d28[m <+604>: str.w r0, [r8, #38] ; 0x26 | |
[34m0x00003d2c[m <+608>: add r0, sp, #96 ; 0x60 | |
511 None | |
[34m0x00003d2e[m <+610>: bl 0xec24 <__aeabi_memclr4> | |
[34m0x00003d32[m <+614>: movs r1, #3 | |
[34m0x00003d34[m <+616>: b.n 0x3daa <rubble::link::connection::Connection<C>::process_data_packet+734> | |
290 self.update_data = Some(update); | |
[34m0x00003d36[m <+618>: ldmia r7!, {r0, r1, r2} | |
[34m0x00003d38[m <+620>: stmia r5!, {r0, r1, r2} | |
[34m0x00003d3a[m <+622>: ldrh r0, [r7, #0] | |
[34m0x00003d3c[m <+624>: strh r0, [r5, #0] | |
[34m0x00003d3e[m <+626>: b.n 0x3e0a <rubble::link::connection::Connection<C>::process_data_packet+830> | |
461 } else { | |
462 Err(LlcpError::NoSpace) | |
463 } | |
464 } | |
465 | |
466 /// Stores `update` in the link layer state so that it will be applied once its *instant* is | |
467 /// reached. | |
468 fn prepare_llcp_update(&mut self, update: LlcpUpdate) -> Result<(), LlcpError> { | |
469 // TODO: check that instant is <32767 in the future | |
470 if let Some(data) = self.update_data { | |
471 error!( | |
472 "got update data {:?} while update {:?} is already queued", | |
473 update, data | |
474 ); | |
475 Err(LlcpError::ConnectionLost) | |
476 } else { | |
477 self.update_data = Some(update); | |
478 Ok(()) | |
479 } | |
480 } | |
481 | |
482 /// Patches the link layer state to incorporate `update`. | |
483 /// | |
484 /// Returns a `Cmd` when the usual Link Layer `Cmd` should be overridden. In that case, this | |
485 /// method must also perform channel hopping. | |
486 fn apply_llcp_update(&mut self, update: LlcpUpdate, rx_end: Instant) -> Option<Cmd> { | |
487 match update { | |
488 LlcpUpdate::ConnUpdate(data) => { | |
[34m0x00003d40[m <+628>: add.w r1, r10, #1 | |
[34m0x00003d44[m <+632>: add.w r10, sp, #48 ; 0x30 | |
[34m0x00003d48[m <+636>: movs r2, #12 | |
[34m0x00003d4a[m <+638>: mov r0, r10 | |
[34m0x00003d4c[m <+640>: bl 0xe974 <__aeabi_memcpy> | |
490 self.conn_interval = data.interval(); | |
[34m0x00003d50[m <+644>: mov r0, r10 | |
489 let old_conn_interval = self.conn_interval; | |
[34m0x00003d52[m <+646>: ldr.w r4, [r8, #8] | |
490 self.conn_interval = data.interval(); | |
[34m0x00003d56[m <+650>: bl 0x8716 <rubble::link::llcp::ConnectionUpdateData::interval> | |
[34m0x00003d5a[m <+654>: str.w r0, [r8, #8] | |
491 | |
492 self.hop_channel(); | |
[34m0x00003d5e[m <+658>: mov r0, r8 | |
[34m0x00003d60[m <+660>: bl 0x3862 <rubble::link::connection::Connection<C>::hop_channel> | |
495 // Next update after the tx window ends (= missed it) | |
496 next_update: NextUpdate::At( | |
497 rx_end + old_conn_interval + data.win_offset() + data.win_size(), | |
[34m0x00003d64[m <+664>: ldr r0, [sp, #12] | |
[34m0x00003d66[m <+666>: mov r1, r4 | |
[34m0x00003d68[m <+668>: bl 0xb504 <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
[34m0x00003d6c[m <+672>: mov r4, r0 | |
[34m0x00003d6e[m <+674>: mov r0, r10 | |
[34m0x00003d70[m <+676>: bl 0x870c <rubble::link::llcp::ConnectionUpdateData::win_offset> | |
[34m0x00003d74[m <+680>: mov r1, r0 | |
[34m0x00003d76[m <+682>: mov r0, r4 | |
[34m0x00003d78[m <+684>: bl 0xb504 <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
[34m0x00003d7c[m <+688>: mov r4, r0 | |
[34m0x00003d7e[m <+690>: mov r0, r10 | |
[34m0x00003d80[m <+692>: bl 0x8702 <rubble::link::llcp::ConnectionUpdateData::win_size> | |
[34m0x00003d84[m <+696>: mov r1, r0 | |
[34m0x00003d86[m <+698>: mov r0, r4 | |
[34m0x00003d88[m <+700>: bl 0xb504 <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
498 ), | |
499 // Listen for the transmit window | |
500 radio: RadioCmd::ListenData { | |
501 channel: self.channel, | |
[34m0x00003d8c[m <+704>: ldrb.w r1, [r8, #46] ; 0x2e | |
502 access_address: self.access_address, | |
[34m0x00003d90[m <+708>: ldrd r2, r3, [r8] | |
494 Some(Cmd { | |
[34m0x00003d94[m <+712>: strb.w r1, [sp, #97] ; 0x61 | |
[34m0x00003d98[m <+716>: movs r1, #2 | |
[34m0x00003d9a[m <+718>: strb.w r1, [sp, #96] ; 0x60 | |
[34m0x00003d9e[m <+722>: strd r2, r3, [sp, #100] ; 0x64 | |
[34m0x00003da2[m <+726>: str r0, [sp, #112] ; 0x70 | |
[34m0x00003da4[m <+728>: movs r0, #0 | |
[34m0x00003da6[m <+730>: strb.w r0, [sp, #116] ; 0x74 | |
[34m0x00003daa[m <+734>: mov r10, r11 | |
[34m0x00003dac[m <+736>: movw r11, #10196 ; 0x27d4 | |
[34m0x00003db0[m <+740>: str r1, [sp, #108] ; 0x6c | |
[34m0x00003db2[m <+742>: movt r11, #8192 ; 0x2000 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003db6[m <+746>: ldr.w r0, [r11] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003dba[m <+750>: cmp r0, #3 | |
[34m0x00003dbc[m <+752>: bcc.n 0x3e04 <rubble::link::connection::Connection<C>::process_data_packet+824> | |
[34m0x00003dbe[m <+754>: movs r0, #2 | |
[34m0x00003dc0[m <+756>: add r1, sp, #48 ; 0x30 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003dc2[m <+758>: str r0, [sp, #188] ; 0xbc | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003dc4[m <+760>: movw r2, #2000 ; 0x7d0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003dc8[m <+764>: str r1, [sp, #184] ; 0xb8 | |
[34m0x00003dca[m <+766>: movs r1, #0 | |
[34m0x00003dcc[m <+768>: str r1, [sp, #180] ; 0xb4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003dce[m <+770>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003dd2[m <+774>: strd r0, r1, [sp, #172] ; 0xac | |
[34m0x00003dd6[m <+778>: movw r0, #1984 ; 0x7c0 | |
[34m0x00003dda[m <+782>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003dde[m <+786>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003de0[m <+788>: str r0, [sp, #168] ; 0xa8 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003de2[m <+790>: movw r0, #14357 ; 0x3815 | |
[34m0x00003de6[m <+794>: movt r0, #0 | |
[34m0x00003dea[m <+798>: str r0, [sp, #60] ; 0x3c | |
[34m0x00003dec[m <+800>: add r0, sp, #96 ; 0x60 | |
[34m0x00003dee[m <+802>: str r0, [sp, #56] ; 0x38 | |
[34m0x00003df0[m <+804>: movw r0, #32235 ; 0x7deb | |
[34m0x00003df4[m <+808>: movt r0, #0 | |
[34m0x00003df8[m <+812>: strd r7, r0, [sp, #48] ; 0x30 | |
[34m0x00003dfc[m <+816>: add r0, sp, #168 ; 0xa8 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003dfe[m <+818>: bl 0xbbca <log::__private_api_log> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
284 if let Some(mut cmd) = result { | |
[34m0x00003e02[m <+822>: ldr r1, [sp, #108] ; 0x6c | |
[34m0x00003e04[m <+824>: cmp r1, #3 | |
[34m0x00003e06[m <+826>: bne.w 0x3f46 <rubble::link::connection::Connection<C>::process_data_packet+1146> | |
291 } | |
292 } | |
293 | |
294 // Hop channels after applying LLCP update because it might change the channel map used | |
295 // by the next event | |
296 self.hop_channel(); | |
[34m0x00003e0a[m <+830>: mov r0, r8 | |
[34m0x00003e0c[m <+832>: ldr r4, [sp, #280] ; 0x118 | |
[34m0x00003e0e[m <+834>: bl 0x3862 <rubble::link::connection::Connection<C>::hop_channel> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003e12[m <+838>: ldr.w r0, [r11] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003e16[m <+842>: cmp r0, #5 | |
[34m0x00003e18[m <+844>: bcc.n 0x3efe <rubble::link::connection::Connection<C>::process_data_packet+1074> | |
[34m0x00003e1a[m <+846>: add r0, sp, #160 ; 0xa0 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
302 last_channel.index(), | |
[34m0x00003e1c[m <+848>: bl 0x940c <rubble::phy::DataChannel::index> | |
[34m0x00003e20[m <+852>: strb.w r0, [sp, #80] ; 0x50 | |
303 self.channel.index(), | |
[34m0x00003e24[m <+856>: mov r0, r6 | |
[34m0x00003e26[m <+858>: bl 0x940c <rubble::phy::DataChannel::index> | |
304 if crc_ok { "" } else { "BADCRC, " }, | |
[34m0x00003e2a[m <+862>: ldr r1, [sp, #296] ; 0x128 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003e2c[m <+864>: movw r7, #58703 ; 0xe54f | |
/Projects/rubble/rubble/src/link/connection.rs: | |
303 self.channel.index(), | |
[34m0x00003e30[m <+868>: strb.w r0, [sp, #132] ; 0x84 | |
[34m0x00003e34[m <+872>: movs r0, #8 | |
304 if crc_ok { "" } else { "BADCRC, " }, | |
[34m0x00003e36[m <+874>: cmp r1, #0 | |
[34m0x00003e38[m <+876>: it ne | |
[34m0x00003e3a[m <+878>: movne r0, #0 | |
[34m0x00003e3c[m <+880>: movw r1, #61444 ; 0xf004 | |
[34m0x00003e40[m <+884>: str r0, [sp, #220] ; 0xdc | |
[34m0x00003e42[m <+886>: movw r0, #2035 ; 0x7f3 | |
[34m0x00003e46[m <+890>: movt r1, #0 | |
[34m0x00003e4a[m <+894>: movt r0, #1 | |
[34m0x00003e4e[m <+898>: it ne | |
[34m0x00003e50[m <+900>: movne r1, r0 | |
[34m0x00003e52[m <+902>: str r1, [sp, #216] ; 0xd8 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003e54[m <+904>: movt r7, #0 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
306 HexSlice(payload) | |
[34m0x00003e58[m <+908>: ldrd r0, r1, [sp, #32] | |
[34m0x00003e5c[m <+912>: strd r0, r1, [sp, #48] ; 0x30 | |
[34m0x00003e60[m <+916>: add r0, sp, #80 ; 0x50 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003e62[m <+918>: mov r1, r7 | |
[34m0x00003e64[m <+920>: bl 0xb6d2 <core::fmt::ArgumentV1::new> | |
[34m0x00003e68[m <+924>: str.w r8, [sp, #24] | |
[34m0x00003e6c[m <+928>: mov r8, r10 | |
[34m0x00003e6e[m <+930>: mov r10, r0 | |
[34m0x00003e70[m <+932>: add r0, sp, #132 ; 0x84 | |
[34m0x00003e72[m <+934>: mov r4, r1 | |
[34m0x00003e74[m <+936>: mov r1, r7 | |
[34m0x00003e76[m <+938>: bl 0xb6d2 <core::fmt::ArgumentV1::new> | |
[34m0x00003e7a[m <+942>: mov r7, r0 | |
[34m0x00003e7c[m <+944>: mov r5, r1 | |
[34m0x00003e7e[m <+946>: movw r1, #47923 ; 0xbb33 | |
[34m0x00003e82[m <+950>: add r0, sp, #216 ; 0xd8 | |
[34m0x00003e84[m <+952>: movt r1, #0 | |
[34m0x00003e88[m <+956>: bl 0xbb3e <core::fmt::ArgumentV1::new> | |
[34m0x00003e8c[m <+960>: mov r6, r0 | |
[34m0x00003e8e[m <+962>: mov r11, r1 | |
[34m0x00003e90[m <+964>: movw r1, #24159 ; 0x5e5f | |
[34m0x00003e94[m <+968>: add r0, sp, #48 ; 0x30 | |
[34m0x00003e96[m <+970>: movt r1, #0 | |
[34m0x00003e9a[m <+974>: bl 0xb6d4 <core::fmt::ArgumentV1::new> | |
[34m0x00003e9e[m <+978>: strd r0, r1, [sp, #208] ; 0xd0 | |
[34m0x00003ea2[m <+982>: movw r0, #21497 ; 0x53f9 | |
[34m0x00003ea6[m <+986>: movt r0, #0 | |
[34m0x00003eaa[m <+990>: add r1, sp, #168 ; 0xa8 | |
[34m0x00003eac[m <+992>: str r0, [sp, #204] ; 0xcc | |
[34m0x00003eae[m <+994>: add.w r0, sp, #30 | |
[34m0x00003eb2[m <+998>: str r0, [sp, #200] ; 0xc8 | |
[34m0x00003eb4[m <+1000>: add r0, sp, #188 ; 0xbc | |
[34m0x00003eb6[m <+1002>: stmia.w r0, {r5, r6, r11} | |
[34m0x00003eba[m <+1006>: movw r0, #14351 ; 0x380f | |
[34m0x00003ebe[m <+1010>: movt r0, #0 | |
[34m0x00003ec2[m <+1014>: strd r4, r7, [sp, #180] ; 0xb4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003ec6[m <+1018>: movw r2, #2088 ; 0x828 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003eca[m <+1022>: str.w r10, [sp, #176] ; 0xb0 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003ece[m <+1026>: movt r2, #1 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00003ed2[m <+1030>: strd r9, r0, [sp, #168] ; 0xa8 | |
[34m0x00003ed6[m <+1034>: movs r0, #6 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003ed8[m <+1036>: str r0, [sp, #116] ; 0x74 | |
[34m0x00003eda[m <+1038>: mov r10, r8 | |
[34m0x00003edc[m <+1040>: str r1, [sp, #112] ; 0x70 | |
[34m0x00003ede[m <+1042>: movs r1, #0 | |
[34m0x00003ee0[m <+1044>: str r1, [sp, #108] ; 0x6c | |
[34m0x00003ee2[m <+1046>: strd r0, r1, [sp, #100] ; 0x64 | |
[34m0x00003ee6[m <+1050>: movw r0, #2040 ; 0x7f8 | |
[34m0x00003eea[m <+1054>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003eee[m <+1058>: movs r1, #5 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003ef0[m <+1060>: str r0, [sp, #96] ; 0x60 | |
[34m0x00003ef2[m <+1062>: add r0, sp, #96 ; 0x60 | |
[34m0x00003ef4[m <+1064>: ldr r4, [sp, #280] ; 0x118 | |
[34m0x00003ef6[m <+1066>: ldr.w r8, [sp, #24] | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003efa[m <+1070>: bl 0xbbca <log::__private_api_log> | |
/Projects/rubble/rubble-nrf5x/src/timer.rs: | |
100 self.inner.now() | |
[34m0x00003efe[m <+1074>: mov r0, r4 | |
[34m0x00003f00[m <+1076>: bl 0x4b98 <<nrf52832_pac::TIMER0 as rubble_nrf5x::timer::NrfTimerExt>::now> | |
[34m0x00003f04[m <+1080>: mov r4, r0 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
362 self.conn_interval + Duration::from_micros(500) | |
[34m0x00003f06[m <+1082>: mov.w r0, #500 ; 0x1f4 | |
[34m0x00003f0a[m <+1086>: ldr.w r5, [r8, #8] | |
[34m0x00003f0e[m <+1090>: bl 0xb346 <rubble::time::Duration::from_micros> | |
[34m0x00003f12[m <+1094>: mov r1, r0 | |
[34m0x00003f14[m <+1096>: mov r0, r5 | |
[34m0x00003f16[m <+1098>: bl 0xb356 <<rubble::time::Duration as core::ops::arith::Add>::add> | |
[34m0x00003f1a[m <+1102>: mov r1, r0 | |
310 next_update: NextUpdate::At(timer.now() + self.conn_event_timeout()), | |
[34m0x00003f1c[m <+1104>: mov r0, r4 | |
[34m0x00003f1e[m <+1106>: bl 0xb504 <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add> | |
[34m0x00003f22[m <+1110>: ldr r7, [sp, #20] | |
313 access_address: self.access_address, | |
[34m0x00003f24[m <+1112>: ldrd r1, r2, [r8] | |
312 channel: self.channel, | |
[34m0x00003f28[m <+1116>: ldrb.w r3, [r8, #46] ; 0x2e | |
309 Ok(Cmd { | |
[34m0x00003f2c[m <+1120>: add.w r12, r7, #4 | |
[34m0x00003f30[m <+1124>: strb r3, [r7, #1] | |
[34m0x00003f32[m <+1126>: movs r3, #2 | |
[34m0x00003f34[m <+1128>: strb r3, [r7, #0] | |
[34m0x00003f36[m <+1130>: stmia.w r12, {r1, r2, r3} | |
[34m0x00003f3a[m <+1134>: str r0, [r7, #16] | |
[34m0x00003f3c[m <+1136>: strb.w r10, [r7, #20] | |
314 crc_init: self.crc_init, | |
315 }, | |
316 queued_work, | |
317 }) | |
318 } | |
[34m0x00003f40[m <+1140>: add sp, #244 ; 0xf4 | |
[34m0x00003f42[m <+1142>: ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} | |
[34m0x00003f46[m <+1146>: add r0, sp, #96 ; 0x60 | |
[34m0x00003f48[m <+1148>: ldr r4, [sp, #20] | |
286 return Ok(cmd); | |
[34m0x00003f4a[m <+1150>: ldmia.w r0, {r2, r3, r5, r6, r7} | |
[34m0x00003f4e[m <+1154>: mov r1, r4 | |
[34m0x00003f50[m <+1156>: stmia r1!, {r2, r3, r5, r6, r7} | |
[34m0x00003f52[m <+1158>: ldrh.w r0, [sp, #117] ; 0x75 | |
[34m0x00003f56[m <+1162>: strb.w r10, [r4, #20] | |
[34m0x00003f5a[m <+1166>: strh.w r0, [r4, #21] | |
[34m0x00003f5e[m <+1170>: ldrb.w r0, [sp, #119] ; 0x77 | |
[34m0x00003f62[m <+1174>: strb r0, [r4, #23] | |
[34m0x00003f64[m <+1176>: b.n 0x3f40 <rubble::link::connection::Connection<C>::process_data_packet+1140> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00003f66[m <+1178>: ldr.w r0, [r11] | |
[34m0x00003f6a[m <+1182>: mov.w r10, #0 | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f6e[m <+1186>: cmp r0, #5 | |
[34m0x00003f70[m <+1188>: bcc.w 0x3b6e <rubble::link::connection::Connection<C>::process_data_packet+162> | |
[34m0x00003f74[m <+1192>: movs r0, #4 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003f76[m <+1194>: str.w r10, [sp, #188] ; 0xbc | |
[34m0x00003f7a[m <+1198>: str r0, [sp, #184] ; 0xb8 | |
[34m0x00003f7c[m <+1200>: movs r0, #1 | |
[34m0x00003f7e[m <+1202>: strd r10, r10, [sp, #176] ; 0xb0 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f82[m <+1206>: movw r2, #1888 ; 0x760 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003f86[m <+1210>: str r0, [sp, #172] ; 0xac | |
[34m0x00003f88[m <+1212>: movw r0, #1880 ; 0x758 | |
[34m0x00003f8c[m <+1216>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f90[m <+1220>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00003f94[m <+1224>: str r0, [sp, #168] ; 0xa8 | |
[34m0x00003f96[m <+1226>: add r0, sp, #168 ; 0xa8 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00003f98[m <+1228>: movs r1, #5 | |
[34m0x00003f9a[m <+1230>: bl 0xbbca <log::__private_api_log> | |
[34m0x00003f9e[m <+1234>: b.n 0x3b6e <rubble::link::connection::Connection<C>::process_data_packet+162> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
170 if let Ok(pdu) = ControlPdu::from_bytes(&mut ByteReader::new(payload)) { | |
[34m0x00003fa0[m <+1236>: add.w r0, r4, #8 | |
[34m0x00003fa4[m <+1240>: str.w r9, [sp, #8] | |
[34m0x00003fa8[m <+1244>: add r1, sp, #48 ; 0x30 | |
[34m0x00003faa[m <+1246>: mov r2, r0 | |
[34m0x00003fac[m <+1248>: ldmia r2!, {r3, r4, r5, r7} | |
[34m0x00003fae[m <+1250>: stmia r1!, {r3, r4, r5, r7} | |
[34m0x00003fb0[m <+1252>: ldmia.w r2, {r3, r4, r5, r7} | |
[34m0x00003fb4[m <+1256>: stmia r1!, {r3, r4, r5, r7} | |
[34m0x00003fb6[m <+1258>: add r4, sp, #96 ; 0x60 | |
171 // Some LLCPDUs don't need a response, those can always be processed and | |
172 // ACKed. For those that do, the other device must have ACKed the last | |
173 // packet we sent, because we'll directly use the radio's TX buffer to send | |
174 // back the LLCP response. | |
175 | |
176 match self.process_control_pdu(pdu, acknowledged) { | |
[34m0x00003fb8[m <+1260>: ldmia r0!, {r2, r3, r5, r7} | |
[34m0x00003fba[m <+1262>: mov r1, r4 | |
[34m0x00003fbc[m <+1264>: stmia r1!, {r2, r3, r5, r7} | |
[34m0x00003fbe[m <+1266>: ldmia.w r0, {r2, r3, r5, r7} | |
[34m0x00003fc2[m <+1270>: stmia r1!, {r2, r3, r5, r7} | |
363 } | |
364 | |
365 /// Whether we want to send more data during this connection event. | |
366 /// | |
367 /// Note that this *has to* change to `false` eventually, even if there's more data to be sent, | |
368 /// because the connection event must close at least `T_IFS` before the next one occurs. | |
369 fn has_more_data(&self) -> bool { | |
370 false | |
371 } | |
372 | |
373 /// Advances the `unmapped_channel` and `channel` fields to the next data channel on which a | |
374 /// connection event will take place. | |
375 /// | |
376 /// According to: `4.5.8.2 Channel Selection`. | |
377 fn hop_channel(&mut self) { | |
378 let unmapped_channel = DataChannel::new((self.unmapped_channel.index() + self.hop) % 37); | |
379 | |
380 self.unmapped_channel = unmapped_channel; | |
381 self.channel = if self.channel_map.is_used(unmapped_channel) { | |
382 unmapped_channel | |
383 } else { | |
384 // This channel isn't used, remap channel according to map | |
385 let remapping_index = unmapped_channel.index() % self.channel_map.num_used_channels(); | |
386 self.channel_map.by_index(remapping_index) | |
387 }; | |
388 } | |
389 | |
390 /// Sends a new PDU to the connected device (ie. a non-retransmitted PDU). | |
391 fn send(&mut self, mut header: Header, tx: &mut C::Transmitter) { | |
392 header.set_md(self.has_more_data()); | |
393 header.set_nesn(self.next_expected_seq_num); | |
394 header.set_sn(self.transmit_seq_num); | |
395 self.last_header = header; | |
396 | |
397 tx.transmit_data(self.access_address, self.crc_init, header, self.channel); | |
398 | |
399 let pl = &tx.tx_payload_buf()[..usize::from(header.payload_length())]; | |
400 trace!("DATA->{:?}, {:?}", header, HexSlice(pl)); | |
401 } | |
402 | |
403 /// Tries to process and acknowledge an LL Control PDU. | |
404 /// | |
405 /// Returns `Err(())` when the connection is closed or lost. | |
406 /// | |
407 /// Note this this function is on a time-critical path and thus can not use logging since that's | |
408 /// currently way too slow. Critical errors can still be logged, since they abort the connection | |
409 /// anyways. | |
410 /// | |
411 /// # Parameters | |
412 /// | |
413 /// * **`pdu`**: The LL Control PDU (LLCPDU) to process. | |
414 /// * **`can_respond`**: Whether the radio's TX buffer may be overwritten to send a response. If | |
415 /// this is `false`, this method may choose not to acknowledge the PDU and wait for a | |
416 /// retransmission instead. | |
417 fn process_control_pdu( | |
418 &mut self, | |
419 pdu: ControlPdu<'_>, | |
420 can_respond: bool, | |
421 ) -> Result<Option<ControlPdu<'static>>, LlcpError> { | |
422 let response = match pdu { | |
423 ControlPdu::ConnectionUpdateReq(data) => { | |
[34m0x00003fc4[m <+1272>: ldrb.w r0, [sp, #96] ; 0x60 | |
[34m0x00003fc8[m <+1276>: cmp r0, #6 | |
[34m0x00003fca[m <+1278>: bhi.n 0x3ffc <rubble::link::connection::Connection<C>::process_data_packet+1328> | |
[34m0x00003fcc[m <+1280>: tbb [pc, r0] | |
[34m0x00003fd0[m <+1284>: ldr r1, [pc, #16] ; (0x3fe4 <rubble::link::connection::Connection<C>::process_data_packet+1304>) | |
[34m0x00003fd2[m <+1286>: asrs r4, r3, #24 | |
[34m0x00003fd4[m <+1288>: asrs r5, r7, #25 | |
[34m0x00003fd6[m <+1290>: lsls r0, r1, #2 | |
[34m0x00003fd8[m <+1292>: add r5, sp, #216 ; 0xd8 | |
[34m0x00003fda[m <+1294>: adds r1, r4, #2 | |
424 self.prepare_llcp_update(LlcpUpdate::ConnUpdate(data))?; | |
[34m0x00003fdc[m <+1296>: adds r0, r5, #2 | |
[34m0x00003fde[m <+1298>: movs r2, #12 | |
[34m0x00003fe0[m <+1300>: bl 0xe974 <__aeabi_memcpy> | |
[34m0x00003fe4[m <+1304>: mov.w r10, #0 | |
[34m0x00003fe8[m <+1308>: mov r0, r8 | |
[34m0x00003fea[m <+1310>: mov r1, r5 | |
[34m0x00003fec[m <+1312>: strb.w r10, [sp, #216] ; 0xd8 | |
[34m0x00003ff0[m <+1316>: bl 0x3a58 <rubble::link::connection::Connection<C>::prepare_llcp_update> | |
[34m0x00003ff4[m <+1320>: uxtb r0, r0 | |
[34m0x00003ff6[m <+1322>: cmp r0, #2 | |
[34m0x00003ff8[m <+1324>: beq.n 0x4092 <rubble::link::connection::Connection<C>::process_data_packet+1478> | |
[34m0x00003ffa[m <+1326>: b.n 0x40ae <rubble::link::connection::Connection<C>::process_data_packet+1506> | |
[34m0x00003ffc[m <+1328>: add r0, sp, #96 ; 0x60 | |
450 sub_vers_nr: Hex(sub_vers_nr), | |
451 } | |
452 } | |
453 _ => ControlPdu::UnknownRsp { | |
454 unknown_type: pdu.opcode(), | |
[34m0x00003ffe[m <+1330>: bl 0x8720 <rubble::link::llcp::ControlPdu::opcode> | |
[34m0x00004002[m <+1334>: mov.w r11, #3 | |
[34m0x00004006[m <+1338>: b.n 0x40f2 <rubble::link::connection::Connection<C>::process_data_packet+1574> | |
431 ControlPdu::TerminateInd { error_code } => { | |
[34m0x00004008[m <+1340>: ldrb.w r0, [sp, #97] ; 0x61 | |
[34m0x0000400c[m <+1344>: strb.w r0, [sp, #160] ; 0xa0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00004010[m <+1348>: ldr.w r0, [r11] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004014[m <+1352>: cmp r0, #3 | |
[34m0x00004016[m <+1354>: bcc.n 0x4050 <rubble::link::connection::Connection<C>::process_data_packet+1412> | |
[34m0x00004018[m <+1356>: movs r0, #1 | |
[34m0x0000401a[m <+1358>: add r1, sp, #132 ; 0x84 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000401c[m <+1360>: str r0, [sp, #236] ; 0xec | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000401e[m <+1362>: movw r2, #1600 ; 0x640 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004022[m <+1366>: str r1, [sp, #232] ; 0xe8 | |
[34m0x00004024[m <+1368>: movs r1, #0 | |
[34m0x00004026[m <+1370>: str r1, [sp, #228] ; 0xe4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004028[m <+1372>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000402c[m <+1376>: strd r0, r1, [sp, #220] ; 0xdc | |
[34m0x00004030[m <+1380>: movw r0, #1592 ; 0x638 | |
[34m0x00004034[m <+1384>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004038[m <+1388>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000403a[m <+1390>: str r0, [sp, #216] ; 0xd8 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x0000403c[m <+1392>: movw r0, #24483 ; 0x5fa3 | |
[34m0x00004040[m <+1396>: movt r0, #0 | |
[34m0x00004044[m <+1400>: str r0, [sp, #136] ; 0x88 | |
[34m0x00004046[m <+1402>: add r0, sp, #160 ; 0xa0 | |
[34m0x00004048[m <+1404>: str r0, [sp, #132] ; 0x84 | |
[34m0x0000404a[m <+1406>: add r0, sp, #216 ; 0xd8 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000404c[m <+1408>: bl 0xbbca <log::__private_api_log> | |
[34m0x00004050[m <+1412>: mov.w r10, #0 | |
[34m0x00004054[m <+1416>: movs r4, #1 | |
[34m0x00004056[m <+1418>: mov.w r11, #10 | |
[34m0x0000405a[m <+1422>: mov.w lr, #0 | |
[34m0x0000405e[m <+1426>: movs r2, #1 | |
[34m0x00004060[m <+1428>: b.n 0x40c0 <rubble::link::connection::Connection<C>::process_data_packet+1524> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
428 self.prepare_llcp_update(LlcpUpdate::ChannelMap { map, instant })?; | |
[34m0x00004062[m <+1430>: ldrh.w r1, [sp, #101] ; 0x65 | |
[34m0x00004066[m <+1434>: strh.w r1, [sp, #221] ; 0xdd | |
[34m0x0000406a[m <+1438>: ldr.w r1, [sp, #97] ; 0x61 | |
427 ControlPdu::ChannelMapReq { map, instant } => { | |
[34m0x0000406e[m <+1442>: ldrh.w r0, [sp, #104] ; 0x68 | |
428 self.prepare_llcp_update(LlcpUpdate::ChannelMap { map, instant })?; | |
[34m0x00004072[m <+1446>: str.w r1, [sp, #217] ; 0xd9 | |
[34m0x00004076[m <+1450>: add r1, sp, #216 ; 0xd8 | |
[34m0x00004078[m <+1452>: strh.w r0, [sp, #224] ; 0xe0 | |
[34m0x0000407c[m <+1456>: movs r0, #1 | |
[34m0x0000407e[m <+1458>: strb.w r0, [sp, #216] ; 0xd8 | |
[34m0x00004082[m <+1462>: mov r0, r8 | |
[34m0x00004084[m <+1464>: bl 0x3a58 <rubble::link::connection::Connection<C>::prepare_llcp_update> | |
[34m0x00004088[m <+1468>: uxtb r0, r0 | |
[34m0x0000408a[m <+1470>: cmp r0, #2 | |
[34m0x0000408c[m <+1472>: bne.n 0x40ae <rubble::link::connection::Connection<C>::process_data_packet+1506> | |
[34m0x0000408e[m <+1474>: mov.w r10, #0 | |
[34m0x00004092[m <+1478>: str.w r10, [sp, #92] ; 0x5c | |
[34m0x00004096[m <+1482>: mov.w r11, #10 | |
[34m0x0000409a[m <+1486>: str.w r10, [sp, #88] ; 0x58 | |
[34m0x0000409e[m <+1490>: mov.w lr, #0 | |
[34m0x000040a2[m <+1494>: str.w r10, [sp, #84] ; 0x54 | |
[34m0x000040a6[m <+1498>: movs r2, #0 | |
[34m0x000040a8[m <+1500>: str.w r10, [sp, #80] ; 0x50 | |
[34m0x000040ac[m <+1504>: b.n 0x40c0 <rubble::link::connection::Connection<C>::process_data_packet+1524> | |
[34m0x000040ae[m <+1506>: and.w r4, r0, #1 | |
[34m0x000040b2[m <+1510>: mov.w r10, #0 | |
[34m0x000040b6[m <+1514>: movs r2, #1 | |
[34m0x000040b8[m <+1516>: mov.w r11, #10 | |
[34m0x000040bc[m <+1520>: mov.w lr, #0 | |
[34m0x000040c0[m <+1524>: mov.w r9, #0 | |
[34m0x000040c4[m <+1528>: movs r1, #0 | |
[34m0x000040c6[m <+1530>: movs r0, #0 | |
[34m0x000040c8[m <+1532>: b.n 0x410a <rubble::link::connection::Connection<C>::process_data_packet+1598> | |
432 info!( | |
433 "closing connection due to termination request: code {:?}", | |
434 error_code | |
435 ); | |
436 return Err(LlcpError::ConnectionLost); | |
437 } | |
438 ControlPdu::FeatureReq { features_master } => ControlPdu::FeatureRsp { | |
[34m0x000040ca[m <+1534>: ldrd r4, r5, [sp, #104] ; 0x68 | |
439 features_used: features_master & FeatureSet::supported(), | |
[34m0x000040ce[m <+1538>: bl 0x5544 <rubble::link::features::FeatureSet::supported> | |
<::bitflags::__impl_bitflags macros>: | |
184 <::bitflags::__impl_bitflags macros>: No such file or directory. | |
[34m0x000040d2[m <+1542>: and.w lr, r1, r5 | |
[34m0x000040d6[m <+1546>: and.w r10, r0, r4 | |
[34m0x000040da[m <+1550>: mov.w r11, #5 | |
[34m0x000040de[m <+1554>: b.n 0x40f2 <rubble::link::connection::Connection<C>::process_data_packet+1574> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
449 comp_id: CompanyId::from_raw(comp_id), | |
[34m0x000040e0[m <+1556>: movw r0, #65535 ; 0xffff | |
[34m0x000040e4[m <+1560>: bl 0x7ee0 <rubble::link::comp_id::CompanyId::from_raw> | |
[34m0x000040e8[m <+1564>: mov r9, r0 | |
[34m0x000040ea[m <+1566>: mov.w r11, #6 | |
[34m0x000040ee[m <+1570>: movs r0, #2 | |
[34m0x000040f0[m <+1572>: movs r1, #0 | |
455 }, | |
456 }; | |
457 | |
458 // If we land here, we have a PDU we want to send | |
459 if can_respond { | |
[34m0x000040f2[m <+1574>: ldr r2, [sp, #8] | |
[34m0x000040f4[m <+1576>: cbz r2, 0x4106 <rubble::link::connection::Connection<C>::process_data_packet+1594> | |
[34m0x000040f6[m <+1578>: add r2, sp, #216 ; 0xd8 | |
[34m0x000040f8[m <+1580>: add r4, sp, #80 ; 0x50 | |
460 Ok(Some(response)) | |
[34m0x000040fa[m <+1582>: ldmia.w r2, {r3, r5, r7, r12} | |
[34m0x000040fe[m <+1586>: movs r2, #0 | |
[34m0x00004100[m <+1588>: stmia.w r4, {r3, r5, r7, r12} | |
[34m0x00004104[m <+1592>: b.n 0x4108 <rubble::link::connection::Connection<C>::process_data_packet+1596> | |
[34m0x00004106[m <+1594>: movs r2, #1 | |
[34m0x00004108[m <+1596>: movs r4, #0 | |
177 Ok(Some(response)) => { | |
[34m0x0000410a[m <+1598>: cbz r2, 0x4122 <rubble::link::connection::Connection<C>::process_data_packet+1622> | |
196 | |
197 info!("LLCP<- {:?}", pdu); | |
198 info!("LLCP-> (no response)"); | |
199 } | |
200 Err(LlcpError::ConnectionLost) => { | |
[34m0x0000410c[m <+1600>: uxtb r0, r4 | |
[34m0x0000410e[m <+1602>: cmp r0, #1 | |
[34m0x00004110[m <+1604>: bne.n 0x41b2 <rubble::link::connection::Connection<C>::process_data_packet+1766> | |
[34m0x00004112[m <+1606>: ldr r4, [sp, #20] | |
201 return Err(()); | |
[34m0x00004114[m <+1608>: movs r1, #24 | |
[34m0x00004116[m <+1610>: mov r0, r4 | |
[34m0x00004118[m <+1612>: bl 0xec24 <__aeabi_memclr4> | |
[34m0x0000411c[m <+1616>: movs r0, #3 | |
[34m0x0000411e[m <+1618>: str r0, [r4, #12] | |
[34m0x00004120[m <+1620>: b.n 0x3f40 <rubble::link::connection::Connection<C>::process_data_packet+1140> | |
177 Ok(Some(response)) => { | |
[34m0x00004122[m <+1622>: cmp.w r11, #10 | |
[34m0x00004126[m <+1626>: bne.n 0x41c2 <rubble::link::connection::Connection<C>::process_data_packet+1782> | |
189 responded = true; | |
190 | |
191 info!("LLCP<- {:?}", pdu); | |
192 info!("LLCP-> {:?}", response); | |
193 } | |
194 Ok(None) => { | |
195 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x00004128[m <+1628>: ldr r0, [sp, #16] | |
[34m0x0000412a[m <+1630>: movs r1, #1 | |
[34m0x0000412c[m <+1632>: movs r4, #1 | |
[34m0x0000412e[m <+1634>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x00004132[m <+1638>: movw r11, #10196 ; 0x27d4 | |
[34m0x00004136[m <+1642>: movt r11, #8192 ; 0x2000 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x0000413a[m <+1646>: ldr.w r0, [r11] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000413e[m <+1650>: cmp r0, #3 | |
[34m0x00004140[m <+1652>: bcc.n 0x4178 <rubble::link::connection::Connection<C>::process_data_packet+1708> | |
[34m0x00004142[m <+1654>: add r0, sp, #216 ; 0xd8 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004144[m <+1656>: str r4, [sp, #116] ; 0x74 | |
[34m0x00004146[m <+1658>: str r0, [sp, #112] ; 0x70 | |
[34m0x00004148[m <+1660>: movs r0, #0 | |
[34m0x0000414a[m <+1662>: str r0, [sp, #108] ; 0x6c | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000414c[m <+1664>: movw r2, #1768 ; 0x6e8 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004150[m <+1668>: strd r4, r0, [sp, #100] ; 0x64 | |
[34m0x00004154[m <+1672>: movw r0, #1688 ; 0x698 | |
[34m0x00004158[m <+1676>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000415c[m <+1680>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004160[m <+1684>: str r0, [sp, #96] ; 0x60 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00004162[m <+1686>: movw r0, #36485 ; 0x8e85 | |
[34m0x00004166[m <+1690>: movt r0, #0 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000416a[m <+1694>: movs r1, #3 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x0000416c[m <+1696>: str r0, [sp, #220] ; 0xdc | |
[34m0x0000416e[m <+1698>: add r0, sp, #48 ; 0x30 | |
[34m0x00004170[m <+1700>: str r0, [sp, #216] ; 0xd8 | |
[34m0x00004172[m <+1702>: add r0, sp, #96 ; 0x60 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004174[m <+1704>: bl 0xbbca <log::__private_api_log> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00004178[m <+1708>: ldr.w r0, [r11] | |
[34m0x0000417c[m <+1712>: movs r4, #0 | |
[34m0x0000417e[m <+1714>: ldr.w r9, [sp, #8] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004182[m <+1718>: cmp r0, #3 | |
[34m0x00004184[m <+1720>: bcc.w 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+348> | |
[34m0x00004188[m <+1724>: movs r0, #4 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000418a[m <+1726>: str r4, [sp, #116] ; 0x74 | |
[34m0x0000418c[m <+1728>: str r0, [sp, #112] ; 0x70 | |
[34m0x0000418e[m <+1730>: movs r0, #1 | |
[34m0x00004190[m <+1732>: strd r4, r4, [sp, #104] ; 0x68 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004194[m <+1736>: movw r2, #1824 ; 0x720 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004198[m <+1740>: str r0, [sp, #100] ; 0x64 | |
[34m0x0000419a[m <+1742>: movw r0, #1816 ; 0x718 | |
[34m0x0000419e[m <+1746>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000041a2[m <+1750>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x000041a6[m <+1754>: str r0, [sp, #96] ; 0x60 | |
[34m0x000041a8[m <+1756>: add r0, sp, #96 ; 0x60 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000041aa[m <+1758>: movs r1, #3 | |
[34m0x000041ac[m <+1760>: bl 0xbbca <log::__private_api_log> | |
[34m0x000041b0[m <+1764>: b.n 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+348> | |
[34m0x000041b2[m <+1766>: movw r11, #10196 ; 0x27d4 | |
[34m0x000041b6[m <+1770>: movs r4, #0 | |
[34m0x000041b8[m <+1772>: movt r11, #8192 ; 0x2000 | |
[34m0x000041bc[m <+1776>: ldr.w r9, [sp, #8] | |
[34m0x000041c0[m <+1780>: b.n 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+348> | |
[34m0x000041c2[m <+1782>: movs r2, #0 | |
/Projects/rubble/rubble/src/link/connection.rs: | |
177 Ok(Some(response)) => { | |
[34m0x000041c4[m <+1784>: str.w r10, [sp, #104] ; 0x68 | |
[34m0x000041c8[m <+1788>: strh.w r2, [sp, #102] ; 0x66 | |
[34m0x000041cc[m <+1792>: add.w r10, sp, #96 ; 0x60 | |
[34m0x000041d0[m <+1796>: strh.w r9, [sp, #100] ; 0x64 | |
[34m0x000041d4[m <+1800>: strb.w r2, [sp, #99] ; 0x63 | |
[34m0x000041d8[m <+1804>: strb.w r1, [sp, #98] ; 0x62 | |
[34m0x000041dc[m <+1808>: add r1, sp, #80 ; 0x50 | |
[34m0x000041de[m <+1810>: strb.w r0, [sp, #97] ; 0x61 | |
[34m0x000041e2[m <+1814>: add.w r0, r10, #16 | |
[34m0x000041e6[m <+1818>: strb.w r11, [sp, #96] ; 0x60 | |
[34m0x000041ea[m <+1822>: str.w lr, [sp, #108] ; 0x6c | |
[34m0x000041ee[m <+1826>: ldmia.w r1, {r2, r3, r5, r7} | |
178 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x000041f2[m <+1830>: movs r1, #1 | |
177 Ok(Some(response)) => { | |
[34m0x000041f4[m <+1832>: stmia r0!, {r2, r3, r5, r7} | |
178 self.next_expected_seq_num += SeqNum::ONE; | |
[34m0x000041f6[m <+1834>: ldr r0, [sp, #16] | |
[34m0x000041f8[m <+1836>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign> | |
[34m0x000041fc[m <+1840>: mov r4, r6 | |
[34m0x000041fe[m <+1842>: add r6, sp, #132 ; 0x84 | |
179 | |
180 let rsp = Pdu::from(&response); | |
[34m0x00004200[m <+1844>: mov r1, r10 | |
[34m0x00004202[m <+1846>: mov r0, r6 | |
[34m0x00004204[m <+1848>: bl 0x54e4 <<rubble::link::data::Pdu<&[u8]> as core::convert::From<&rubble::link::llcp::ControlPdu>>::from> | |
181 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf()); | |
[34m0x00004208[m <+1852>: mov r0, r4 | |
[34m0x0000420a[m <+1854>: bl 0x4f2e <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf> | |
[34m0x0000420e[m <+1858>: bl 0x8474 <rubble::bytes::ByteWriter::new> | |
[34m0x00004212[m <+1862>: add r7, sp, #148 ; 0x94 | |
[34m0x00004214[m <+1864>: strd r0, r1, [sp, #148] ; 0x94 | |
182 let left = payload_writer.space_left(); | |
[34m0x00004218[m <+1868>: mov r0, r7 | |
[34m0x0000421a[m <+1870>: bl 0x84e2 <rubble::bytes::ByteWriter::space_left> | |
[34m0x0000421e[m <+1874>: mov r4, r0 | |
183 rsp.to_bytes(&mut payload_writer).unwrap(); | |
[34m0x00004220[m <+1876>: mov r0, r6 | |
[34m0x00004222[m <+1878>: mov r1, r7 | |
[34m0x00004224[m <+1880>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes> | |
[34m0x00004228[m <+1884>: uxtb r0, r0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: | |
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory. | |
[34m0x0000422a[m <+1886>: cmp r0, #5 | |
[34m0x0000422c[m <+1888>: bne.n 0x4304 <rubble::link::connection::Connection<C>::process_data_packet+2104> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
185 let mut header = Header::new(Llid::Control); | |
[34m0x0000422e[m <+1890>: movs r0, #3 | |
[34m0x00004230[m <+1892>: bl 0x5368 <rubble::link::data::Header::new> | |
[34m0x00004234[m <+1896>: strh.w r0, [sp, #158] ; 0x9e | |
[34m0x00004238[m <+1900>: add r0, sp, #148 ; 0x94 | |
186 let pl_len = (left - payload_writer.space_left()) as u8; | |
[34m0x0000423a[m <+1902>: bl 0x84e2 <rubble::bytes::ByteWriter::space_left> | |
[34m0x0000423e[m <+1906>: movw r11, #10196 ; 0x27d4 | |
[34m0x00004242[m <+1910>: subs r1, r4, r0 | |
[34m0x00004244[m <+1912>: movt r11, #8192 ; 0x2000 | |
[34m0x00004248[m <+1916>: bcc.n 0x4314 <rubble::link::connection::Connection<C>::process_data_packet+2120> | |
[34m0x0000424a[m <+1918>: add.w r0, sp, #158 ; 0x9e | |
187 header.set_payload_length(pl_len); | |
[34m0x0000424e[m <+1922>: bl 0x5394 <rubble::link::data::Header::set_payload_length> | |
[34m0x00004252[m <+1926>: ldr r6, [sp, #24] | |
188 self.send(header, tx); | |
[34m0x00004254[m <+1928>: mov r0, r8 | |
[34m0x00004256[m <+1930>: ldrh.w r1, [sp, #158] ; 0x9e | |
[34m0x0000425a[m <+1934>: mov r2, r6 | |
[34m0x0000425c[m <+1936>: bl 0x432c <rubble::link::connection::Connection<C>::send> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x00004260[m <+1940>: ldr.w r0, [r11] | |
[34m0x00004264[m <+1944>: ldr.w r9, [sp, #8] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004268[m <+1948>: cmp r0, #3 | |
[34m0x0000426a[m <+1950>: bcc.n 0x42a4 <rubble::link::connection::Connection<C>::process_data_packet+2008> | |
[34m0x0000426c[m <+1952>: movs r0, #1 | |
[34m0x0000426e[m <+1954>: add r1, sp, #160 ; 0xa0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004270[m <+1956>: str r0, [sp, #236] ; 0xec | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x00004272[m <+1958>: movw r2, #1696 ; 0x6a0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004276[m <+1962>: str r1, [sp, #232] ; 0xe8 | |
[34m0x00004278[m <+1964>: movs r1, #0 | |
[34m0x0000427a[m <+1966>: str r1, [sp, #228] ; 0xe4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000427c[m <+1968>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x00004280[m <+1972>: strd r0, r1, [sp, #220] ; 0xdc | |
[34m0x00004284[m <+1976>: movw r0, #1688 ; 0x698 | |
[34m0x00004288[m <+1980>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x0000428c[m <+1984>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x0000428e[m <+1986>: str r0, [sp, #216] ; 0xd8 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x00004290[m <+1988>: movw r0, #36485 ; 0x8e85 | |
[34m0x00004294[m <+1992>: movt r0, #0 | |
[34m0x00004298[m <+1996>: str r0, [sp, #164] ; 0xa4 | |
[34m0x0000429a[m <+1998>: add r0, sp, #48 ; 0x30 | |
[34m0x0000429c[m <+2000>: str r0, [sp, #160] ; 0xa0 | |
[34m0x0000429e[m <+2002>: add r0, sp, #216 ; 0xd8 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000042a0[m <+2004>: bl 0xbbca <log::__private_api_log> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: | |
2235 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/sync/atomic.rs: No such file or directory. | |
[34m0x000042a4[m <+2008>: ldr.w r0, [r11] | |
<::log::macros::log macros>: | |
3 <::log::macros::log macros>: No such file or directory. | |
[34m0x000042a8[m <+2012>: cmp r0, #3 | |
[34m0x000042aa[m <+2014>: bcc.n 0x42e2 <rubble::link::connection::Connection<C>::process_data_packet+2070> | |
[34m0x000042ac[m <+2016>: movs r0, #1 | |
[34m0x000042ae[m <+2018>: add r1, sp, #160 ; 0xa0 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x000042b0[m <+2020>: str r0, [sp, #236] ; 0xec | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000042b2[m <+2022>: movw r2, #1740 ; 0x6cc | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x000042b6[m <+2026>: str r1, [sp, #232] ; 0xe8 | |
[34m0x000042b8[m <+2028>: movs r1, #0 | |
[34m0x000042ba[m <+2030>: str r1, [sp, #228] ; 0xe4 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000042bc[m <+2032>: movt r2, #1 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x000042c0[m <+2036>: strd r0, r1, [sp, #220] ; 0xdc | |
[34m0x000042c4[m <+2040>: movw r0, #1732 ; 0x6c4 | |
[34m0x000042c8[m <+2044>: movt r0, #1 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000042cc[m <+2048>: movs r1, #3 | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: | |
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory. | |
[34m0x000042ce[m <+2050>: str r0, [sp, #216] ; 0xd8 | |
<::log::macros::__log_format_args macros>: | |
1 <::log::macros::__log_format_args macros>: No such file or directory. | |
[34m0x000042d0[m <+2052>: movw r0, #36485 ; 0x8e85 | |
[34m0x000042d4[m <+2056>: movt r0, #0 | |
[34m0x000042d8[m <+2060>: strd r10, r0, [sp, #160] ; 0xa0 | |
[34m0x000042dc[m <+2064>: add r0, sp, #216 ; 0xd8 | |
<::log::macros::log macros>: | |
6 <::log::macros::log macros>: No such file or directory. | |
[34m0x000042de[m <+2066>: bl 0xbbca <log::__private_api_log> | |
[34m0x000042e2[m <+2070>: movs r4, #1 | |
[34m0x000042e4[m <+2072>: b.n 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+348> | |
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: | |
956 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory. | |
[34m0x000042e6[m <+2074>: strb.w r0, [sp, #48] ; 0x30 | |
[34m0x000042ea[m <+2078>: movw r0, #1012 ; 0x3f4 | |
[34m0x000042ee[m <+2082>: movt r0, #1 | |
[34m0x000042f2[m <+2086>: add r2, sp, #48 ; 0x30 | |
[34m0x000042f4[m <+2088>: movw r3, #1056 ; 0x420 | |
[34m0x000042f8[m <+2092>: movs r1, #43 ; 0x2b | |
[34m0x000042fa[m <+2094>: movt r3, #1 | |
[34m0x000042fe[m <+2098>: bl 0xbf22 <core::result::unwrap_failed> | |
[34m0x00004302[m <+2102>: udf #254 ; 0xfe | |
[34m0x00004304[m <+2104>: strb.w r0, [sp, #216] ; 0xd8 | |
[34m0x00004308[m <+2108>: movw r0, #1012 ; 0x3f4 | |
[34m0x0000430c[m <+2112>: add r2, sp, #216 ; 0xd8 | |
[34m0x0000430e[m <+2114>: movt r0, #1 | |
[34m0x00004312[m <+2118>: b.n 0x42f4 <rubble::link::connection::Connection<C>::process_data_packet+2088> | |
/Projects/rubble/rubble/src/link/connection.rs: | |
186 let pl_len = (left - payload_writer.space_left()) as u8; | |
[34m0x00004314[m <+2120>: movw r0, #1648 ; 0x670 | |
[34m0x00004318[m <+2124>: movw r2, #1628 ; 0x65c | |
[34m0x0000431c[m <+2128>: movt r0, #1 | |
[34m0x00004320[m <+2132>: movt r2, #1 | |
[34m0x00004324[m <+2136>: movs r1, #33 ; 0x21 | |
[34m0x00004326[m <+2138>: bl 0xbe62 <core::panicking::panic> | |
[34m0x0000432a[m <+2142>: udf #254 ; 0xfe | |
End of assembler dump. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment