Skip to content

Instantly share code, notes, and snippets.

@thalesfragoso
Created March 10, 2020 05:29
Show Gist options
  • Save thalesfragoso/8610284f3084ed6b1f80f81e01e0d591 to your computer and use it in GitHub Desktop.
Save thalesfragoso/8610284f3084ed6b1f80f81e01e0d591 to your computer and use it in GitHub Desktop.
Rubble with and without trace! in process_data_packet
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(
0x00003ac8 <+0>: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
0x00003acc <+4>: sub sp, #236 ; 0xec
0x00003ace <+6>: str r0, [sp, #20]
0x00003ad0 <+8>: add.w r7, sp, #30
0x00003ad4 <+12>: ldr r0, [sp, #280] ; 0x118
0x00003ad6 <+14>: mov r9, r1
0x00003ad8 <+16>: str r0, [sp, #32]
0x00003ada <+18>: ldr r0, [sp, #276] ; 0x114
0x00003adc <+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;
0x00003ae0 <+24>: mov r0, r7
0x00003ae2 <+26>: ldr.w r8, [sp, #284] ; 0x11c
0x00003ae6 <+30>: str r3, [sp, #24]
0x00003ae8 <+32>: str r2, [sp, #12]
0x00003aea <+34>: str.w r8, [sp, #36] ; 0x24
0x00003aee <+38>: bl 0x52a4 <rubble::link::data::Header::sn>
/Projects/rubble/rubble/src/link/seq_num.rs:
11 pub struct SeqNum(bool);
0x00003af2 <+42>: mov r2, r9
0x00003af4 <+44>: ldr.w r11, [sp, #288] ; 0x120
0x00003af8 <+48>: ldrb.w r1, [r2, #48]!
0x00003afc <+52>: str r2, [sp, #16]
0x00003afe <+54>: clz r1, r1
0x00003b02 <+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;
0x00003b04 <+60>: eors r0, r1
0x00003b06 <+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;
0x00003b0a <+66>: mov r0, r7
0x00003b0c <+68>: bl 0x528a <rubble::link::data::Header::nesn>
0x00003b10 <+72>: mov r5, r9
 0x00003b12 <+74>: mov r6, r0
0x00003b14 <+76>: ldrb.w r0, [r5, #47]!
0x00003b18 <+80>: movs r1, #1
0x00003b1a <+82>: mov.w r10, #1
0x00003b1e <+86>: bl 0x81f2 <<rubble::link::seq_num::SeqNum as core::ops::arith::Add>::add>
0x00003b22 <+90>: eors r0, r6
0x00003b24 <+92>: bic.w r6, r11, r0
149
150 let is_empty = header.llid() == Llid::DataCont && payload.is_empty();
0x00003b28 <+96>: mov r0, r7
0x00003b2a <+98>: bl 0x5270 <rubble::link::data::Header::llid>
0x00003b2e <+102>: mov r7, r0
151
152 if acknowledged {
0x00003b30 <+104>: cmp r6, #1
0x00003b32 <+106>: bne.n 0x3b40 <rubble::link::connection::Connection<C>::process_data_packet+120>
154 self.transmit_seq_num += SeqNum::ONE;
0x00003b34 <+108>: mov r0, r5
0x00003b36 <+110>: movs r1, #1
153 self.received_packet = true;
0x00003b38 <+112>: strb.w r10, [r9, #49] ; 0x31
154 self.transmit_seq_num += SeqNum::ONE;
0x00003b3c <+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 {
0x00003b40 <+120>: cbz r4, 0x3b5c <rubble::link::connection::Connection<C>::process_data_packet+148>
0x00003b42 <+122>: uxtb r0, r7
0x00003b44 <+124>: eor.w r0, r0, #1
0x00003b48 <+128>: orr.w r0, r0, r8
0x00003b4c <+132>: clz r0, r0
0x00003b50 <+136>: lsrs r0, r0, #5
163 if is_empty {
0x00003b52 <+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;
0x00003b54 <+140>: ldr r0, [sp, #16]
0x00003b56 <+142>: movs r1, #1
0x00003b58 <+144>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x00003b5c <+148>: mov.w r8, #0
0x00003b60 <+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 {
0x00003b62 <+154>: cbz r6, 0x3b8e <rubble::link::connection::Connection<C>::process_data_packet+198>
0x00003b64 <+156>: ldr r4, [sp, #24]
232 if !responded {
0x00003b66 <+158>: cmp r5, #0
0x00003b68 <+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());
0x00003b6c <+164>: mov r0, r4
0x00003b6e <+166>: bl 0x4e06 <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf>
0x00003b72 <+170>: bl 0x834c <rubble::bytes::ByteWriter::new>
0x00003b76 <+174>: strd r0, r1, [sp, #40] ; 0x28
237 let header = match self.tx.consume_raw_with(|header, pl| {
0x00003b7a <+178>: add.w r0, r9, #12
0x00003b7e <+182>: add r1, sp, #40 ; 0x28
0x00003b80 <+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,
0x00003b84 <+188>: lsls r1, r0, #31
0x00003b86 <+190>: bne.w 0x3c8a <rubble::link::connection::Connection<C>::process_data_packet+450>
237 let header = match self.tx.consume_raw_with(|header, pl| {
0x00003b8a <+194>: lsrs r1, r0, #16
0x00003b8c <+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 {
0x00003b8e <+198>: ldrb.w r0, [r9, #49] ; 0x31
0x00003b92 <+202>: ldr r4, [sp, #24]
0x00003b94 <+204>: cmp r0, #0
0x00003b96 <+206>: beq.n 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+352>
251 self.last_header.set_nesn(self.next_expected_seq_num);
0x00003b98 <+208>: ldrb.w r1, [r9, #48] ; 0x30
0x00003b9c <+212>: add.w r0, r9, #22
0x00003ba0 <+216>: bl 0x5292 <rubble::link::data::Header::set_nesn>
252 tx.transmit_data(
0x00003ba4 <+220>: ldrh.w r3, [r9, #22]
253 self.access_address,
0x00003ba8 <+224>: ldrd r1, r2, [r9]
252 tx.transmit_data(
0x00003bac <+228>: ldrb.w r0, [r9, #46] ; 0x2e
0x00003bb0 <+232>: str r0, [sp, #0]
0x00003bb2 <+234>: mov r0, r4
0x00003bb4 <+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.
0x00003bb8 <+240>: movw r0, #10196 ; 0x27d4
0x00003bbc <+244>: movt r0, #8192 ; 0x2000
0x00003bc0 <+248>: ldr r0, [r0, #0]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003bc2 <+250>: cmp r0, #5
0x00003bc4 <+252>: bcc.n 0x3c9a <rubble::link::connection::Connection<C>::process_data_packet+466>
0x00003bc6 <+254>: movs r0, #0
0x00003bc8 <+256>: movs r1, #4
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003bca <+258>: str r0, [sp, #60] ; 0x3c
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003bcc <+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.
0x00003bd0 <+264>: str r1, [sp, #56] ; 0x38
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003bd2 <+266>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003bd6 <+270>: strd r0, r0, [sp, #48] ; 0x30
0x00003bda <+274>: movs r0, #1
0x00003bdc <+276>: str r0, [sp, #44] ; 0x2c
0x00003bde <+278>: movw r0, #1624 ; 0x658
0x00003be2 <+282>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003be6 <+286>: movs r1, #5
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003be8 <+288>: str r0, [sp, #40] ; 0x28
0x00003bea <+290>: add r0, sp, #40 ; 0x28
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003bec <+292>: bl 0xbaa2 <log::__private_api_log>
0x00003bf0 <+296>: b.n 0x3c9a <rubble::link::connection::Connection<C>::process_data_packet+466>
0x00003bf2 <+298>: add.w r0, sp, #30
/Projects/rubble/rubble/src/link/connection.rs:
166 } else if header.llid() == Llid::Control {
0x00003bf6 <+302>: bl 0x5270 <rubble::link::data::Header::llid>
0x00003bfa <+306>: uxtb r0, r0
0x00003bfc <+308>: cmp r0, #3
0x00003bfe <+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)) {
0x00003c00 <+312>: ldrd r0, r1, [sp, #32]
0x00003c04 <+316>: bl 0x846a <rubble::bytes::ByteReader::new>
0x00003c08 <+320>: add r5, sp, #40 ; 0x28
0x00003c0a <+322>: strd r0, r1, [sp, #80] ; 0x50
0x00003c0e <+326>: add r1, sp, #80 ; 0x50
0x00003c10 <+328>: mov r0, r5
0x00003c12 <+330>: bl 0x86ec <<rubble::link::llcp::ControlPdu as rubble::bytes::FromBytes>::from_bytes>
0x00003c16 <+334>: ldrb.w r0, [sp, #40] ; 0x28
0x00003c1a <+338>: cmp r0, #0
0x00003c1c <+340>: beq.w 0x3e9a <rubble::link::connection::Connection<C>::process_data_packet+978>
0x00003c20 <+344>: movs r5, #0
0x00003c22 <+346>: mov.w r8, #0
0x00003c26 <+350>: b.n 0x3b62 <rubble::link::connection::Connection<C>::process_data_packet+154>
0x00003c28 <+352>: add r5, sp, #40 ; 0x28
0x00003c2a <+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;
0x00003c2c <+356>: strb.w r0, [r9, #49] ; 0x31
264
265 let pdu = Pdu::empty();
0x00003c30 <+360>: mov r0, r5
0x00003c32 <+362>: bl 0x53b0 <rubble::link::data::Pdu<&[u8]>::empty>
266 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf());
0x00003c36 <+366>: mov r0, r4
0x00003c38 <+368>: bl 0x4e06 <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf>
0x00003c3c <+372>: bl 0x834c <rubble::bytes::ByteWriter::new>
0x00003c40 <+376>: strd r0, r1, [sp, #136] ; 0x88
0x00003c44 <+380>: add r1, sp, #136 ; 0x88
267 pdu.to_bytes(&mut payload_writer).unwrap();
0x00003c46 <+382>: mov r0, r5
0x00003c48 <+384>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes>
0x00003c4c <+388>: uxtb r0, r0
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs:
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory.
0x00003c4e <+390>: cmp r0, #5
0x00003c50 <+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,
0x00003c54 <+396>: ldrb.w r0, [sp, #40] ; 0x28
0x00003c58 <+400>: adds r0, #1
0x00003c5a <+402>: b.n 0x3c8c <rubble::link::connection::Connection<C>::process_data_packet+452>
0x00003c5c <+404>: add.w r5, sp, #30
/Projects/rubble/rubble/src/link/connection.rs:
216 .produce_with(header.payload_length().into(), |writer| {
0x00003c60 <+408>: mov r0, r5
0x00003c62 <+410>: bl 0x5268 <rubble::link::data::Header::payload_length>
0x00003c66 <+414>: mov r1, r0
215 self.rx
0x00003c68 <+416>: add.w r0, r9, #16
0x00003c6c <+420>: add r2, sp, #32
0x00003c6e <+422>: mov r3, r5
0x00003c70 <+424>: bl 0x3f2 <rubble::link::queue::Producer::produce_with>
0x00003c74 <+428>: uxtb r0, r0
217 writer.write_slice(payload)?;
218 Ok(header.llid())
219 });
220
221 if result.is_ok() {
0x00003c76 <+430>: cmp r0, #5
0x00003c78 <+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;
0x00003c7c <+436>: ldr r0, [sp, #16]
0x00003c7e <+438>: movs r1, #1
0x00003c80 <+440>: mov.w r8, #1
0x00003c84 <+444>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x00003c88 <+448>: b.n 0x3b60 <rubble::link::connection::Connection<C>::process_data_packet+152>
242 Err(_) => Header::new(Llid::DataCont),
0x00003c8a <+450>: movs r0, #1
0x00003c8c <+452>: bl 0x5240 <rubble::link::data::Header::new>
0x00003c90 <+456>: mov r1, r0
0x00003c92 <+458>: mov r0, r9
0x00003c94 <+460>: mov r2, r4
0x00003c96 <+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.
0x00003c9a <+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.
0x00003c9e <+470>: mov r5, r9
0x00003ca0 <+472>: movs r2, #13
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/mod.rs:
3301 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/mod.rs: No such file or directory.
0x00003ca2 <+474>: adds r0, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs:
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory.
0x00003ca4 <+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.
0x00003ca8 <+480>: ldrb.w r6, [r5, #24]!
0x00003cac <+484>: add r0, sp, #172 ; 0xac
0x00003cae <+486>: adds r1, r5, #1
0x00003cb0 <+488>: bl 0xe84c <__aeabi_memcpy>
0x00003cb4 <+492>: movs r0, #0
0x00003cb6 <+494>: mov.w r10, #2
/Projects/rubble/rubble/src/link/connection.rs:
279 if let Some(update) = self.update_data.take() {
0x00003cba <+498>: cmp r6, #2
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs:
1486 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs: No such file or directory.
0x00003cbc <+500>: str.w r0, [r5, #1]
0x00003cc0 <+504>: strb.w r10, [r5]
0x00003cc4 <+508>: str.w r0, [r5, #5]
0x00003cc8 <+512>: str.w r0, [r5, #9]
0x00003ccc <+516>: strb r0, [r5, #13]
0x00003cce <+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() {
0x00003cd2 <+522>: strb.w r6, [sp, #208] ; 0xd0
0x00003cd6 <+526>: add r6, sp, #208 ; 0xd0
0x00003cd8 <+528>: adds r7, r6, #1
0x00003cda <+530>: add r1, sp, #172 ; 0xac
0x00003cdc <+532>: movs r2, #13
0x00003cde <+534>: mov r0, r7
0x00003ce0 <+536>: bl 0xe84c <__aeabi_memcpy>
280 if update.instant() == self.conn_event_count.0 {
0x00003ce4 <+540>: mov r0, r6
0x00003ce6 <+542>: bl 0x7cb0 <rubble::link::connection::LlcpUpdate::instant>
0x00003cea <+546>: ldrh.w r1, [r9, #20]
0x00003cee <+550>: uxth r0, r0
0x00003cf0 <+552>: cmp r0, r1
0x00003cf2 <+554>: bne.n 0x3d22 <rubble::link::connection::Connection<C>::process_data_packet+602>
0x00003cf4 <+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);
0x00003cf6 <+558>: mov r1, r7
0x00003cf8 <+560>: movs r2, #13
0x00003cfa <+562>: ldrb.w r4, [sp, #208] ; 0xd0
0x00003cfe <+566>: mov r0, r5
0x00003d00 <+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) => {
0x00003d04 <+572>: cmp r4, #1
0x00003d06 <+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;
0x00003d08 <+576>: ldrh.w r0, [sp, #44] ; 0x2c
511 None
0x00003d0c <+580>: movs r1, #24
510 self.channel_map = map;
0x00003d0e <+582>: strh.w r0, [r9, #42] ; 0x2a
0x00003d12 <+586>: ldr r0, [sp, #40] ; 0x28
0x00003d14 <+588>: str.w r0, [r9, #38] ; 0x26
0x00003d18 <+592>: add r0, sp, #136 ; 0x88
511 None
0x00003d1a <+594>: bl 0xeafc <__aeabi_memclr4>
0x00003d1e <+598>: movs r1, #3
0x00003d20 <+600>: b.n 0x3d92 <rubble::link::connection::Connection<C>::process_data_packet+714>
290 self.update_data = Some(update);
0x00003d22 <+602>: ldmia r6!, {r0, r1, r2}
0x00003d24 <+604>: stmia r5!, {r0, r1, r2}
0x00003d26 <+606>: ldrh r0, [r6, #0]
0x00003d28 <+608>: strh r0, [r5, #0]
0x00003d2a <+610>: b.n 0x3dec <rubble::link::connection::Connection<C>::process_data_packet+804>
0x00003d2c <+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) => {
0x00003d2e <+614>: adds r1, r5, #1
0x00003d30 <+616>: movs r2, #12
0x00003d32 <+618>: mov r0, r7
0x00003d34 <+620>: bl 0xe84c <__aeabi_memcpy>
490 self.conn_interval = data.interval();
0x00003d38 <+624>: mov r0, r7
489 let old_conn_interval = self.conn_interval;
0x00003d3a <+626>: ldr.w r5, [r9, #8]
490 self.conn_interval = data.interval();
0x00003d3e <+630>: bl 0x85ee <rubble::link::llcp::ConnectionUpdateData::interval>
0x00003d42 <+634>: str.w r0, [r9, #8]
491
492 self.hop_channel();
0x00003d46 <+638>: mov r0, r9
0x00003d48 <+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(),
0x00003d4c <+644>: ldr r0, [sp, #12]
0x00003d4e <+646>: mov r1, r5
0x00003d50 <+648>: bl 0xb3dc <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add>
0x00003d54 <+652>: mov r5, r0
0x00003d56 <+654>: mov r0, r7
0x00003d58 <+656>: bl 0x85e4 <rubble::link::llcp::ConnectionUpdateData::win_offset>
0x00003d5c <+660>: mov r1, r0
0x00003d5e <+662>: mov r0, r5
0x00003d60 <+664>: bl 0xb3dc <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add>
0x00003d64 <+668>: mov r5, r0
0x00003d66 <+670>: mov r0, r7
0x00003d68 <+672>: bl 0x85da <rubble::link::llcp::ConnectionUpdateData::win_size>
0x00003d6c <+676>: mov r1, r0
0x00003d6e <+678>: mov r0, r5
0x00003d70 <+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,
0x00003d74 <+684>: ldrb.w r1, [r9, #46] ; 0x2e
502 access_address: self.access_address,
0x00003d78 <+688>: ldrd r2, r3, [r9]
494 Some(Cmd {
0x00003d7c <+692>: strb.w r1, [sp, #137] ; 0x89
0x00003d80 <+696>: movs r1, #2
0x00003d82 <+698>: strb.w r1, [sp, #136] ; 0x88
0x00003d86 <+702>: strd r2, r3, [sp, #140] ; 0x8c
0x00003d8a <+706>: str r0, [sp, #152] ; 0x98
0x00003d8c <+708>: movs r0, #0
0x00003d8e <+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.
0x00003d92 <+714>: movw r0, #10196 ; 0x27d4
/Projects/rubble/rubble/src/link/connection.rs:
494 Some(Cmd {
0x00003d96 <+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.
0x00003d98 <+720>: movt r0, #8192 ; 0x2000
0x00003d9c <+724>: ldr r0, [r0, #0]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003d9e <+726>: cmp r0, #3
0x00003da0 <+728>: bcc.n 0x3de8 <rubble::link::connection::Connection<C>::process_data_packet+800>
0x00003da2 <+730>: movs r0, #2
0x00003da4 <+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.
0x00003da6 <+734>: str r0, [sp, #60] ; 0x3c
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003da8 <+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.
0x00003dac <+740>: str r1, [sp, #56] ; 0x38
0x00003dae <+742>: movs r1, #0
0x00003db0 <+744>: str r1, [sp, #52] ; 0x34
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003db2 <+746>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003db6 <+750>: strd r0, r1, [sp, #44] ; 0x2c
0x00003dba <+754>: movw r0, #1680 ; 0x690
0x00003dbe <+758>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003dc2 <+762>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003dc4 <+764>: str r0, [sp, #40] ; 0x28
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003dc6 <+766>: movw r0, #14353 ; 0x3811
0x00003dca <+770>: movt r0, #0
0x00003dce <+774>: str r0, [sp, #100] ; 0x64
0x00003dd0 <+776>: add r0, sp, #136 ; 0x88
0x00003dd2 <+778>: str r0, [sp, #96] ; 0x60
0x00003dd4 <+780>: movw r0, #31939 ; 0x7cc3
0x00003dd8 <+784>: movt r0, #0
0x00003ddc <+788>: strd r6, r0, [sp, #88] ; 0x58
0x00003de0 <+792>: add r0, sp, #40 ; 0x28
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003de2 <+794>: bl 0xbaa2 <log::__private_api_log>
/Projects/rubble/rubble/src/link/connection.rs:
284 if let Some(mut cmd) = result {
0x00003de6 <+798>: ldr r1, [sp, #148] ; 0x94
0x00003de8 <+800>: cmp r1, #3
0x00003dea <+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();
0x00003dec <+804>: mov r0, r9
0x00003dee <+806>: ldr r5, [sp, #272] ; 0x110
0x00003df0 <+808>: bl 0x385e <rubble::link::connection::Connection<C>::hop_channel>
/Projects/rubble/rubble-nrf5x/src/timer.rs:
100 self.inner.now()
0x00003df4 <+812>: mov r0, r5
0x00003df6 <+814>: bl 0x4a70 <<nrf52832_pac::TIMER0 as rubble_nrf5x::timer::NrfTimerExt>::now>
0x00003dfa <+818>: mov r5, r0
/Projects/rubble/rubble/src/link/connection.rs:
362 self.conn_interval + Duration::from_micros(500)
0x00003dfc <+820>: mov.w r0, #500 ; 0x1f4
0x00003e00 <+824>: ldr.w r6, [r9, #8]
0x00003e04 <+828>: bl 0xb21e <rubble::time::Duration::from_micros>
0x00003e08 <+832>: mov r1, r0
0x00003e0a <+834>: mov r0, r6
0x00003e0c <+836>: bl 0xb22e <<rubble::time::Duration as core::ops::arith::Add>::add>
0x00003e10 <+840>: mov r1, r0
310 next_update: NextUpdate::At(timer.now() + self.conn_event_timeout()),
0x00003e12 <+842>: mov r0, r5
0x00003e14 <+844>: bl 0xb3dc <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add>
0x00003e18 <+848>: ldr r7, [sp, #20]
313 access_address: self.access_address,
0x00003e1a <+850>: ldrd r1, r2, [r9]
312 channel: self.channel,
0x00003e1e <+854>: ldrb.w r3, [r9, #46] ; 0x2e
309 Ok(Cmd {
0x00003e22 <+858>: strb r3, [r7, #1]
0x00003e24 <+860>: adds r3, r7, #4
0x00003e26 <+862>: strb.w r10, [r7]
0x00003e2a <+866>: stmia.w r3, {r1, r2, r10}
0x00003e2e <+870>: str r0, [r7, #16]
0x00003e30 <+872>: strb.w r8, [r7, #20]
314 crc_init: self.crc_init,
315 },
316 queued_work,
317 })
318 }
0x00003e34 <+876>: add sp, #236 ; 0xec
0x00003e36 <+878>: ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
0x00003e3a <+882>: add r0, sp, #136 ; 0x88
0x00003e3c <+884>: ldr r4, [sp, #20]
286 return Ok(cmd);
0x00003e3e <+886>: ldmia.w r0, {r2, r3, r5, r6, r7}
0x00003e42 <+890>: mov r1, r4
0x00003e44 <+892>: stmia r1!, {r2, r3, r5, r6, r7}
0x00003e46 <+894>: ldrh.w r0, [sp, #157] ; 0x9d
0x00003e4a <+898>: strb.w r8, [r4, #20]
0x00003e4e <+902>: strh.w r0, [r4, #21]
0x00003e52 <+906>: ldrb.w r0, [sp, #159] ; 0x9f
0x00003e56 <+910>: strb r0, [r4, #23]
0x00003e58 <+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.
0x00003e5a <+914>: movw r0, #10196 ; 0x27d4
0x00003e5e <+918>: mov.w r8, #0
0x00003e62 <+922>: movt r0, #8192 ; 0x2000
0x00003e66 <+926>: ldr r0, [r0, #0]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003e68 <+928>: cmp r0, #5
0x00003e6a <+930>: bcc.w 0x3b60 <rubble::link::connection::Connection<C>::process_data_packet+152>
0x00003e6e <+934>: movs r0, #4
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003e70 <+936>: str.w r8, [sp, #60] ; 0x3c
0x00003e74 <+940>: str r0, [sp, #56] ; 0x38
0x00003e76 <+942>: movs r0, #1
0x00003e78 <+944>: strd r8, r8, [sp, #48] ; 0x30
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003e7c <+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.
0x00003e80 <+952>: str r0, [sp, #44] ; 0x2c
0x00003e82 <+954>: movw r0, #1576 ; 0x628
0x00003e86 <+958>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003e8a <+962>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003e8e <+966>: str r0, [sp, #40] ; 0x28
0x00003e90 <+968>: add r0, sp, #40 ; 0x28
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003e92 <+970>: movs r1, #5
0x00003e94 <+972>: bl 0xbaa2 <log::__private_api_log>
0x00003e98 <+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)) {
0x00003e9a <+978>: add.w r0, r5, #8
0x00003e9e <+982>: add.w r8, sp, #88 ; 0x58
0x00003ea2 <+986>: mov r1, r0
0x00003ea4 <+988>: mov r2, r8
0x00003ea6 <+990>: ldmia r1!, {r3, r4, r5, r7}
0x00003ea8 <+992>: stmia r2!, {r3, r4, r5, r7}
0x00003eaa <+994>: ldmia.w r1, {r3, r4, r5, r7}
0x00003eae <+998>: stmia r2!, {r3, r4, r5, r7}
0x00003eb0 <+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) {
0x00003eb2 <+1002>: ldmia r0!, {r2, r3, r5, r7}
0x00003eb4 <+1004>: mov r1, r4
0x00003eb6 <+1006>: stmia r1!, {r2, r3, r5, r7}
0x00003eb8 <+1008>: ldmia.w r0, {r2, r3, r5, r7}
0x00003ebc <+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) => {
0x00003ebe <+1014>: ldrb.w r0, [sp, #136] ; 0x88
0x00003ec2 <+1018>: cmp r0, #6
0x00003ec4 <+1020>: bhi.n 0x3ef6 <rubble::link::connection::Connection<C>::process_data_packet+1070>
0x00003ec6 <+1022>: tbb [pc, r0]
0x00003eca <+1026>: ldr r4, [pc, #16] ; (0x3edc <rubble::link::connection::Connection<C>::process_data_packet+1044>)
0x00003ecc <+1028>: asrs r5, r3, #24
0x00003ece <+1030>: asrs r6, r7, #25
0x00003ed0 <+1032>: lsls r1, r1, #2
0x00003ed2 <+1034>: add r5, sp, #208 ; 0xd0
0x00003ed4 <+1036>: adds r1, r4, #2
424 self.prepare_llcp_update(LlcpUpdate::ConnUpdate(data))?;
0x00003ed6 <+1038>: adds r0, r5, #2
0x00003ed8 <+1040>: movs r2, #12
0x00003eda <+1042>: bl 0xe84c <__aeabi_memcpy>
0x00003ede <+1046>: mov.w r10, #0
0x00003ee2 <+1050>: mov r0, r9
0x00003ee4 <+1052>: mov r1, r5
0x00003ee6 <+1054>: strb.w r10, [sp, #208] ; 0xd0
0x00003eea <+1058>: bl 0x3a54 <rubble::link::connection::Connection<C>::prepare_llcp_update>
0x00003eee <+1062>: uxtb r0, r0
0x00003ef0 <+1064>: cmp r0, #2
0x00003ef2 <+1066>: beq.n 0x3f92 <rubble::link::connection::Connection<C>::process_data_packet+1226>
0x00003ef4 <+1068>: b.n 0x3fac <rubble::link::connection::Connection<C>::process_data_packet+1252>
0x00003ef6 <+1070>: add r0, sp, #136 ; 0x88
450 sub_vers_nr: Hex(sub_vers_nr),
451 }
452 }
453 _ => ControlPdu::UnknownRsp {
454 unknown_type: pdu.opcode(),
0x00003ef8 <+1072>: bl 0x85f8 <rubble::link::llcp::ControlPdu::opcode>
0x00003efc <+1076>: mov lr, r0
0x00003efe <+1078>: mov.w r11, #3
0x00003f02 <+1082>: b.n 0x3fee <rubble::link::connection::Connection<C>::process_data_packet+1318>
431 ControlPdu::TerminateInd { error_code } => {
0x00003f04 <+1084>: ldrb.w r0, [sp, #137] ; 0x89
0x00003f08 <+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.
0x00003f0c <+1092>: movw r0, #10196 ; 0x27d4
0x00003f10 <+1096>: movt r0, #8192 ; 0x2000
0x00003f14 <+1100>: ldr r0, [r0, #0]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003f16 <+1102>: cmp r0, #3
0x00003f18 <+1104>: bcc.n 0x3f52 <rubble::link::connection::Connection<C>::process_data_packet+1162>
0x00003f1a <+1106>: movs r0, #1
0x00003f1c <+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.
0x00003f1e <+1110>: str r0, [sp, #228] ; 0xe4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003f20 <+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.
0x00003f24 <+1116>: str r1, [sp, #224] ; 0xe0
0x00003f26 <+1118>: movs r1, #0
0x00003f28 <+1120>: str r1, [sp, #220] ; 0xdc
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003f2a <+1122>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003f2e <+1126>: strd r0, r1, [sp, #212] ; 0xd4
0x00003f32 <+1130>: movw r0, #1288 ; 0x508
0x00003f36 <+1134>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003f3a <+1138>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003f3c <+1140>: str r0, [sp, #208] ; 0xd0
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003f3e <+1142>: movw r0, #24187 ; 0x5e7b
0x00003f42 <+1146>: movt r0, #0
0x00003f46 <+1150>: str r0, [sp, #176] ; 0xb0
0x00003f48 <+1152>: add r0, sp, #200 ; 0xc8
0x00003f4a <+1154>: str r0, [sp, #172] ; 0xac
0x00003f4c <+1156>: add r0, sp, #208 ; 0xd0
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003f4e <+1158>: bl 0xbaa2 <log::__private_api_log>
0x00003f52 <+1162>: mov.w r10, #0
0x00003f56 <+1166>: movs r5, #1
0x00003f58 <+1168>: mov.w r11, #10
0x00003f5c <+1172>: movs r3, #0
0x00003f5e <+1174>: movs r2, #1
0x00003f60 <+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 })?;
0x00003f62 <+1178>: ldrh.w r1, [sp, #141] ; 0x8d
0x00003f66 <+1182>: strh.w r1, [sp, #213] ; 0xd5
0x00003f6a <+1186>: ldr.w r1, [sp, #137] ; 0x89
427 ControlPdu::ChannelMapReq { map, instant } => {
0x00003f6e <+1190>: ldrh.w r0, [sp, #144] ; 0x90
428 self.prepare_llcp_update(LlcpUpdate::ChannelMap { map, instant })?;
0x00003f72 <+1194>: str.w r1, [sp, #209] ; 0xd1
0x00003f76 <+1198>: add r1, sp, #208 ; 0xd0
0x00003f78 <+1200>: strh.w r0, [sp, #216] ; 0xd8
0x00003f7c <+1204>: movs r0, #1
0x00003f7e <+1206>: strb.w r0, [sp, #208] ; 0xd0
0x00003f82 <+1210>: mov r0, r9
0x00003f84 <+1212>: bl 0x3a54 <rubble::link::connection::Connection<C>::prepare_llcp_update>
0x00003f88 <+1216>: uxtb r0, r0
0x00003f8a <+1218>: cmp r0, #2
0x00003f8c <+1220>: bne.n 0x3fac <rubble::link::connection::Connection<C>::process_data_packet+1252>
0x00003f8e <+1222>: mov.w r10, #0
0x00003f92 <+1226>: str.w r10, [sp, #132] ; 0x84
0x00003f96 <+1230>: mov.w r11, #10
0x00003f9a <+1234>: str.w r10, [sp, #128] ; 0x80
0x00003f9e <+1238>: movs r3, #0
0x00003fa0 <+1240>: str.w r10, [sp, #124] ; 0x7c
0x00003fa4 <+1244>: movs r2, #0
0x00003fa6 <+1246>: str.w r10, [sp, #120] ; 0x78
0x00003faa <+1250>: b.n 0x3fbc <rubble::link::connection::Connection<C>::process_data_packet+1268>
0x00003fac <+1252>: and.w r5, r0, #1
0x00003fb0 <+1256>: mov.w r10, #0
0x00003fb4 <+1260>: movs r2, #1
0x00003fb6 <+1262>: mov.w r11, #10
0x00003fba <+1266>: movs r3, #0
0x00003fbc <+1268>: movs r0, #0
0x00003fbe <+1270>: movs r1, #0
0x00003fc0 <+1272>: mov.w lr, #0
0x00003fc4 <+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 {
0x00003fc6 <+1278>: ldrd r4, r5, [sp, #144] ; 0x90
439 features_used: features_master & FeatureSet::supported(),
0x00003fca <+1282>: bl 0x541c <rubble::link::features::FeatureSet::supported>
<::bitflags::__impl_bitflags macros>:
184 <::bitflags::__impl_bitflags macros>: No such file or directory.
0x00003fce <+1286>: ands r1, r5
0x00003fd0 <+1288>: str r1, [sp, #8]
0x00003fd2 <+1290>: and.w r10, r0, r4
0x00003fd6 <+1294>: mov.w r11, #5
0x00003fda <+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),
0x00003fdc <+1300>: movw r0, #65535 ; 0xffff
0x00003fe0 <+1304>: bl 0x7db8 <rubble::link::comp_id::CompanyId::from_raw>
0x00003fe4 <+1308>: mov.w r11, #6
0x00003fe8 <+1312>: mov.w lr, #2
0x00003fec <+1316>: movs r1, #0
455 },
456 };
457
458 // If we land here, we have a PDU we want to send
459 if can_respond {
0x00003fee <+1318>: cbz r6, 0x4004 <rubble::link::connection::Connection<C>::process_data_packet+1340>
0x00003ff0 <+1320>: add r2, sp, #208 ; 0xd0
0x00003ff2 <+1322>: mov r12, r8
0x00003ff4 <+1324>: add r4, sp, #120 ; 0x78
460 Ok(Some(response))
0x00003ff6 <+1326>: ldmia.w r2, {r3, r5, r7, r8}
0x00003ffa <+1330>: movs r2, #0
0x00003ffc <+1332>: stmia.w r4, {r3, r5, r7, r8}
0x00004000 <+1336>: mov r8, r12
0x00004002 <+1338>: b.n 0x4006 <rubble::link::connection::Connection<C>::process_data_packet+1342>
0x00004004 <+1340>: movs r2, #1
0x00004006 <+1342>: movs r5, #0
0x00004008 <+1344>: ldr r3, [sp, #8]
177 Ok(Some(response)) => {
0x0000400a <+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) => {
0x0000400c <+1348>: uxtb r0, r5
0x0000400e <+1350>: cmp r0, #1
0x00004010 <+1352>: bne.w 0x3c20 <rubble::link::connection::Connection<C>::process_data_packet+344>
0x00004014 <+1356>: ldr r4, [sp, #20]
201 return Err(());
0x00004016 <+1358>: movs r1, #24
0x00004018 <+1360>: mov r0, r4
0x0000401a <+1362>: bl 0xeafc <__aeabi_memclr4>
0x0000401e <+1366>: movs r0, #3
0x00004020 <+1368>: str r0, [r4, #12]
0x00004022 <+1370>: b.n 0x3e34 <rubble::link::connection::Connection<C>::process_data_packet+876>
177 Ok(Some(response)) => {
0x00004024 <+1372>: cmp.w r11, #10
0x00004028 <+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;
0x0000402a <+1378>: ldr r0, [sp, #16]
0x0000402c <+1380>: movs r1, #1
0x0000402e <+1382>: movs r5, #1
0x00004030 <+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.
0x00004034 <+1388>: movw r4, #10196 ; 0x27d4
0x00004038 <+1392>: movt r4, #8192 ; 0x2000
0x0000403c <+1396>: ldr r0, [r4, #0]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x0000403e <+1398>: cmp r0, #3
0x00004040 <+1400>: bcc.n 0x4076 <rubble::link::connection::Connection<C>::process_data_packet+1454>
0x00004042 <+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.
0x00004044 <+1404>: str r5, [sp, #156] ; 0x9c
0x00004046 <+1406>: str r0, [sp, #152] ; 0x98
0x00004048 <+1408>: movs r0, #0
0x0000404a <+1410>: str r0, [sp, #148] ; 0x94
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000404c <+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.
0x00004050 <+1416>: strd r5, r0, [sp, #140] ; 0x8c
0x00004054 <+1420>: movw r0, #1384 ; 0x568
0x00004058 <+1424>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000405c <+1428>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00004060 <+1432>: str r0, [sp, #136] ; 0x88
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00004062 <+1434>: movw r0, #36189 ; 0x8d5d
0x00004066 <+1438>: movt r0, #0
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000406a <+1442>: movs r1, #3
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x0000406c <+1444>: strd r8, r0, [sp, #208] ; 0xd0
0x00004070 <+1448>: add r0, sp, #136 ; 0x88
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004072 <+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.
0x00004076 <+1454>: ldr r0, [r4, #0]
0x00004078 <+1456>: movs r5, #0
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x0000407a <+1458>: cmp r0, #3
0x0000407c <+1460>: bcc.w 0x3c22 <rubble::link::connection::Connection<C>::process_data_packet+346>
0x00004080 <+1464>: movs r0, #4
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00004082 <+1466>: str r5, [sp, #156] ; 0x9c
0x00004084 <+1468>: str r0, [sp, #152] ; 0x98
0x00004086 <+1470>: movs r0, #1
0x00004088 <+1472>: strd r5, r5, [sp, #144] ; 0x90
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000408c <+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.
0x00004090 <+1480>: str r0, [sp, #140] ; 0x8c
0x00004092 <+1482>: movw r0, #1512 ; 0x5e8
0x00004096 <+1486>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000409a <+1490>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x0000409e <+1494>: str r0, [sp, #136] ; 0x88
0x000040a0 <+1496>: add r0, sp, #136 ; 0x88
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000040a2 <+1498>: movs r1, #3
0x000040a4 <+1500>: bl 0xbaa2 <log::__private_api_log>
0x000040a8 <+1504>: b.n 0x3c22 <rubble::link::connection::Connection<C>::process_data_packet+346>
0x000040aa <+1506>: movs r2, #0
/Projects/rubble/rubble/src/link/connection.rs:
177 Ok(Some(response)) => {
0x000040ac <+1508>: str.w r10, [sp, #144] ; 0x90
0x000040b0 <+1512>: strh.w r2, [sp, #142] ; 0x8e
0x000040b4 <+1516>: add.w r10, sp, #136 ; 0x88
0x000040b8 <+1520>: strh.w r0, [sp, #140] ; 0x8c
0x000040bc <+1524>: add.w r0, r10, #16
0x000040c0 <+1528>: strb.w r2, [sp, #139] ; 0x8b
0x000040c4 <+1532>: strb.w r1, [sp, #138] ; 0x8a
0x000040c8 <+1536>: add r1, sp, #120 ; 0x78
0x000040ca <+1538>: strb.w lr, [sp, #137] ; 0x89
0x000040ce <+1542>: strb.w r11, [sp, #136] ; 0x88
0x000040d2 <+1546>: str r3, [sp, #148] ; 0x94
0x000040d4 <+1548>: ldmia.w r1, {r2, r3, r5, r7}
178 self.next_expected_seq_num += SeqNum::ONE;
0x000040d8 <+1552>: movs r1, #1
177 Ok(Some(response)) => {
0x000040da <+1554>: stmia r0!, {r2, r3, r5, r7}
178 self.next_expected_seq_num += SeqNum::ONE;
0x000040dc <+1556>: ldr r0, [sp, #16]
0x000040de <+1558>: bl 0x81f6 <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x000040e2 <+1562>: add r4, sp, #172 ; 0xac
179
180 let rsp = Pdu::from(&response);
0x000040e4 <+1564>: mov r1, r10
0x000040e6 <+1566>: mov r0, r4
0x000040e8 <+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());
0x000040ec <+1572>: ldr r0, [sp, #24]
0x000040ee <+1574>: bl 0x4e06 <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf>
0x000040f2 <+1578>: bl 0x834c <rubble::bytes::ByteWriter::new>
0x000040f6 <+1582>: add r5, sp, #188 ; 0xbc
0x000040f8 <+1584>: strd r0, r1, [sp, #188] ; 0xbc
182 let left = payload_writer.space_left();
0x000040fc <+1588>: mov r0, r5
0x000040fe <+1590>: bl 0x83ba <rubble::bytes::ByteWriter::space_left>
0x00004102 <+1594>: mov r7, r0
183 rsp.to_bytes(&mut payload_writer).unwrap();
0x00004104 <+1596>: mov r0, r4
0x00004106 <+1598>: mov r1, r5
0x00004108 <+1600>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes>
0x0000410c <+1604>: uxtb r0, r0
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs:
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory.
0x0000410e <+1606>: cmp r0, #5
0x00004110 <+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);
0x00004112 <+1610>: movs r0, #3
0x00004114 <+1612>: bl 0x5240 <rubble::link::data::Header::new>
0x00004118 <+1616>: strh.w r0, [sp, #198] ; 0xc6
0x0000411c <+1620>: add r0, sp, #188 ; 0xbc
186 let pl_len = (left - payload_writer.space_left()) as u8;
0x0000411e <+1622>: bl 0x83ba <rubble::bytes::ByteWriter::space_left>
0x00004122 <+1626>: subs r1, r7, r0
0x00004124 <+1628>: bcc.n 0x41ec <rubble::link::connection::Connection<C>::process_data_packet+1828>
0x00004126 <+1630>: add.w r0, sp, #198 ; 0xc6
187 header.set_payload_length(pl_len);
0x0000412a <+1634>: bl 0x526c <rubble::link::data::Header::set_payload_length>
188 self.send(header, tx);
0x0000412e <+1638>: ldrh.w r1, [sp, #198] ; 0xc6
0x00004132 <+1642>: mov r0, r9
0x00004134 <+1644>: ldr r2, [sp, #24]
0x00004136 <+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.
0x0000413a <+1650>: movw r4, #10196 ; 0x27d4
0x0000413e <+1654>: movt r4, #8192 ; 0x2000
0x00004142 <+1658>: ldr r0, [r4, #0]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00004144 <+1660>: cmp r0, #3
0x00004146 <+1662>: bcc.n 0x417e <rubble::link::connection::Connection<C>::process_data_packet+1718>
0x00004148 <+1664>: movs r0, #1
0x0000414a <+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.
0x0000414c <+1668>: str r0, [sp, #228] ; 0xe4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000414e <+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.
0x00004152 <+1674>: str r1, [sp, #224] ; 0xe0
0x00004154 <+1676>: movs r1, #0
0x00004156 <+1678>: str r1, [sp, #220] ; 0xdc
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004158 <+1680>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x0000415c <+1684>: strd r0, r1, [sp, #212] ; 0xd4
0x00004160 <+1688>: movw r0, #1384 ; 0x568
0x00004164 <+1692>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004168 <+1696>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x0000416a <+1698>: str r0, [sp, #208] ; 0xd0
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x0000416c <+1700>: movw r0, #36189 ; 0x8d5d
0x00004170 <+1704>: movt r0, #0
0x00004174 <+1708>: strd r8, r0, [sp, #200] ; 0xc8
0x00004178 <+1712>: add r0, sp, #208 ; 0xd0
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000417a <+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.
0x0000417e <+1718>: ldr r0, [r4, #0]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00004180 <+1720>: cmp r0, #3
0x00004182 <+1722>: bcc.n 0x41ba <rubble::link::connection::Connection<C>::process_data_packet+1778>
0x00004184 <+1724>: movs r0, #1
0x00004186 <+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.
0x00004188 <+1728>: str r0, [sp, #228] ; 0xe4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000418a <+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.
0x0000418e <+1734>: str r1, [sp, #224] ; 0xe0
0x00004190 <+1736>: movs r1, #0
0x00004192 <+1738>: str r1, [sp, #220] ; 0xdc
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004194 <+1740>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00004198 <+1744>: strd r0, r1, [sp, #212] ; 0xd4
0x0000419c <+1748>: movw r0, #1428 ; 0x594
0x000041a0 <+1752>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000041a4 <+1756>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x000041a6 <+1758>: str r0, [sp, #208] ; 0xd0
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x000041a8 <+1760>: movw r0, #36189 ; 0x8d5d
0x000041ac <+1764>: movt r0, #0
0x000041b0 <+1768>: strd r10, r0, [sp, #200] ; 0xc8
0x000041b4 <+1772>: add r0, sp, #208 ; 0xd0
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000041b6 <+1774>: bl 0xbaa2 <log::__private_api_log>
0x000041ba <+1778>: movs r5, #1
0x000041bc <+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.
0x000041be <+1782>: strb.w r0, [sp, #88] ; 0x58
0x000041c2 <+1786>: movw r0, #708 ; 0x2c4
0x000041c6 <+1790>: movt r0, #1
0x000041ca <+1794>: add r2, sp, #88 ; 0x58
0x000041cc <+1796>: movw r3, #752 ; 0x2f0
0x000041d0 <+1800>: movs r1, #43 ; 0x2b
0x000041d2 <+1802>: movt r3, #1
0x000041d6 <+1806>: bl 0xbdfa <core::result::unwrap_failed>
0x000041da <+1810>: udf #254 ; 0xfe
0x000041dc <+1812>: strb.w r0, [sp, #208] ; 0xd0
0x000041e0 <+1816>: movw r0, #708 ; 0x2c4
0x000041e4 <+1820>: add r2, sp, #208 ; 0xd0
0x000041e6 <+1822>: movt r0, #1
0x000041ea <+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;
0x000041ec <+1828>: movw r0, #1344 ; 0x540
0x000041f0 <+1832>: movw r2, #1324 ; 0x52c
0x000041f4 <+1836>: movt r0, #1
0x000041f8 <+1840>: movt r2, #1
0x000041fc <+1844>: movs r1, #33 ; 0x21
0x000041fe <+1846>: bl 0xbd3a <core::panicking::panic>
0x00004202 <+1850>: udf #254 ; 0xfe
End of assembler dump.
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(
0x00003acc <+0>: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
0x00003ad0 <+4>: sub sp, #244 ; 0xf4
0x00003ad2 <+6>: str r0, [sp, #20]
0x00003ad4 <+8>: add.w r6, sp, #30
0x00003ad8 <+12>: ldr r0, [sp, #288] ; 0x120
0x00003ada <+14>: mov r8, r1
0x00003adc <+16>: str r0, [sp, #32]
0x00003ade <+18>: ldr r0, [sp, #284] ; 0x11c
0x00003ae0 <+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;
0x00003ae4 <+24>: mov r0, r6
0x00003ae6 <+26>: ldr r5, [sp, #292] ; 0x124
0x00003ae8 <+28>: str r3, [sp, #24]
0x00003aea <+30>: str r2, [sp, #12]
0x00003aec <+32>: str r5, [sp, #36] ; 0x24
0x00003aee <+34>: bl 0x53cc <rubble::link::data::Header::sn>
/Projects/rubble/rubble/src/link/seq_num.rs:
11 pub struct SeqNum(bool);
0x00003af2 <+38>: mov r2, r8
0x00003af4 <+40>: ldr.w r9, [sp, #296] ; 0x128
0x00003af8 <+44>: ldrb.w r1, [r2, #48]!
0x00003afc <+48>: str r2, [sp, #16]
0x00003afe <+50>: clz r1, r1
0x00003b02 <+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;
0x00003b04 <+56>: eors r0, r1
0x00003b06 <+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;
0x00003b0a <+62>: mov r0, r6
0x00003b0c <+64>: bl 0x53b2 <rubble::link::data::Header::nesn>
0x00003b10 <+68>: mov r4, r8
 0x00003b12 <+70>: mov r7, r0
0x00003b14 <+72>: ldrb.w r0, [r4, #47]!
0x00003b18 <+76>: movs r1, #1
0x00003b1a <+78>: mov.w r10, #1
0x00003b1e <+82>: bl 0x831a <<rubble::link::seq_num::SeqNum as core::ops::arith::Add>::add>
0x00003b22 <+86>: eors r0, r7
0x00003b24 <+88>: bic.w r9, r9, r0
149
150 let is_empty = header.llid() == Llid::DataCont && payload.is_empty();
0x00003b28 <+92>: mov r0, r6
0x00003b2a <+94>: bl 0x5398 <rubble::link::data::Header::llid>
0x00003b2e <+98>: mov r7, r0
151
152 if acknowledged {
0x00003b30 <+100>: cmp.w r9, #1
0x00003b34 <+104>: bne.n 0x3b42 <rubble::link::connection::Connection<C>::process_data_packet+118>
154 self.transmit_seq_num += SeqNum::ONE;
0x00003b36 <+106>: mov r0, r4
0x00003b38 <+108>: movs r1, #1
153 self.received_packet = true;
0x00003b3a <+110>: strb.w r10, [r8, #49] ; 0x31
154 self.transmit_seq_num += SeqNum::ONE;
0x00003b3e <+114>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x00003b42 <+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 {
0x00003b44 <+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.
0x00003b48 <+124>: movw r11, #10196 ; 0x27d4
0x00003b4c <+128>: movt r11, #8192 ; 0x2000
/Projects/rubble/rubble/src/link/connection.rs:
162 if is_new {
0x00003b50 <+132>: beq.n 0x3b6a <rubble::link::connection::Connection<C>::process_data_packet+158>
0x00003b52 <+134>: uxtb r0, r7
0x00003b54 <+136>: eor.w r0, r0, #1
0x00003b58 <+140>: orrs r0, r5
0x00003b5a <+142>: clz r0, r0
0x00003b5e <+146>: lsrs r0, r0, #5
163 if is_empty {
0x00003b60 <+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;
0x00003b62 <+150>: ldr r0, [sp, #16]
0x00003b64 <+152>: movs r1, #1
0x00003b66 <+154>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x00003b6a <+158>: mov.w r10, #0
0x00003b6e <+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 {
0x00003b70 <+164>: cmp.w r9, #0
0x00003b74 <+168>: beq.n 0x3b9c <rubble::link::connection::Connection<C>::process_data_packet+208>
232 if !responded {
0x00003b76 <+170>: cmp r4, #0
0x00003b78 <+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());
0x00003b7c <+176>: mov r0, r6
0x00003b7e <+178>: bl 0x4f2e <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf>
0x00003b82 <+182>: bl 0x8474 <rubble::bytes::ByteWriter::new>
0x00003b86 <+186>: strd r0, r1, [sp, #168] ; 0xa8
237 let header = match self.tx.consume_raw_with(|header, pl| {
0x00003b8a <+190>: add.w r0, r8, #12
0x00003b8e <+194>: add r1, sp, #168 ; 0xa8
0x00003b90 <+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,
0x00003b94 <+200>: lsls r1, r0, #31
0x00003b96 <+202>: bne.n 0x3c90 <rubble::link::connection::Connection<C>::process_data_packet+452>
237 let header = match self.tx.consume_raw_with(|header, pl| {
0x00003b98 <+204>: lsrs r1, r0, #16
0x00003b9a <+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 {
0x00003b9c <+208>: ldrb.w r0, [r8, #49] ; 0x31
0x00003ba0 <+212>: cmp r0, #0
0x00003ba2 <+214>: beq.n 0x3c2e <rubble::link::connection::Connection<C>::process_data_packet+354>
251 self.last_header.set_nesn(self.next_expected_seq_num);
0x00003ba4 <+216>: ldrb.w r1, [r8, #48] ; 0x30
0x00003ba8 <+220>: add.w r0, r8, #22
0x00003bac <+224>: bl 0x53ba <rubble::link::data::Header::set_nesn>
252 tx.transmit_data(
0x00003bb0 <+228>: ldrh.w r3, [r8, #22]
253 self.access_address,
0x00003bb4 <+232>: ldrd r1, r2, [r8]
252 tx.transmit_data(
0x00003bb8 <+236>: ldrb.w r0, [r8, #46] ; 0x2e
0x00003bbc <+240>: str r0, [sp, #0]
0x00003bbe <+242>: mov r0, r6
0x00003bc0 <+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.
0x00003bc4 <+248>: ldr.w r0, [r11]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003bc8 <+252>: cmp r0, #5
0x00003bca <+254>: bcc.n 0x3ca0 <rubble::link::connection::Connection<C>::process_data_packet+468>
0x00003bcc <+256>: movs r0, #0
0x00003bce <+258>: movs r1, #4
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003bd0 <+260>: str r0, [sp, #188] ; 0xbc
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003bd2 <+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.
0x00003bd6 <+266>: str r1, [sp, #184] ; 0xb8
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003bd8 <+268>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003bdc <+272>: strd r0, r0, [sp, #176] ; 0xb0
0x00003be0 <+276>: movs r0, #1
0x00003be2 <+278>: str r0, [sp, #172] ; 0xac
0x00003be4 <+280>: movw r0, #1928 ; 0x788
0x00003be8 <+284>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003bec <+288>: movs r1, #5
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003bee <+290>: str r0, [sp, #168] ; 0xa8
0x00003bf0 <+292>: add r0, sp, #168 ; 0xa8
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003bf2 <+294>: bl 0xbbca <log::__private_api_log>
0x00003bf6 <+298>: b.n 0x3ca0 <rubble::link::connection::Connection<C>::process_data_packet+468>
0x00003bf8 <+300>: add.w r0, sp, #30
/Projects/rubble/rubble/src/link/connection.rs:
166 } else if header.llid() == Llid::Control {
0x00003bfc <+304>: bl 0x5398 <rubble::link::data::Header::llid>
0x00003c00 <+308>: uxtb r0, r0
0x00003c02 <+310>: cmp r0, #3
0x00003c04 <+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)) {
0x00003c06 <+314>: ldrd r0, r1, [sp, #32]
0x00003c0a <+318>: bl 0x8592 <rubble::bytes::ByteReader::new>
0x00003c0e <+322>: add r4, sp, #168 ; 0xa8
0x00003c10 <+324>: strd r0, r1, [sp, #40] ; 0x28
0x00003c14 <+328>: add r1, sp, #40 ; 0x28
0x00003c16 <+330>: mov r0, r4
0x00003c18 <+332>: bl 0x8814 <<rubble::link::llcp::ControlPdu as rubble::bytes::FromBytes>::from_bytes>
0x00003c1c <+336>: ldrb.w r0, [sp, #168] ; 0xa8
0x00003c20 <+340>: cmp r0, #0
0x00003c22 <+342>: beq.w 0x3fa0 <rubble::link::connection::Connection<C>::process_data_packet+1236>
0x00003c26 <+346>: movs r4, #0
0x00003c28 <+348>: mov.w r10, #0
0x00003c2c <+352>: b.n 0x3b70 <rubble::link::connection::Connection<C>::process_data_packet+164>
0x00003c2e <+354>: add r4, sp, #168 ; 0xa8
0x00003c30 <+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;
0x00003c32 <+358>: strb.w r0, [r8, #49] ; 0x31
264
265 let pdu = Pdu::empty();
0x00003c36 <+362>: mov r0, r4
0x00003c38 <+364>: bl 0x54d8 <rubble::link::data::Pdu<&[u8]>::empty>
266 let mut payload_writer = ByteWriter::new(tx.tx_payload_buf());
0x00003c3c <+368>: mov r0, r6
0x00003c3e <+370>: bl 0x4f2e <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf>
0x00003c42 <+374>: bl 0x8474 <rubble::bytes::ByteWriter::new>
0x00003c46 <+378>: strd r0, r1, [sp, #96] ; 0x60
0x00003c4a <+382>: add r1, sp, #96 ; 0x60
267 pdu.to_bytes(&mut payload_writer).unwrap();
0x00003c4c <+384>: mov r0, r4
0x00003c4e <+386>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes>
0x00003c52 <+390>: uxtb r0, r0
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs:
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory.
0x00003c54 <+392>: cmp r0, #5
0x00003c56 <+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,
0x00003c5a <+398>: ldrb.w r0, [sp, #168] ; 0xa8
0x00003c5e <+402>: adds r0, #1
0x00003c60 <+404>: b.n 0x3c92 <rubble::link::connection::Connection<C>::process_data_packet+454>
0x00003c62 <+406>: add.w r4, sp, #30
/Projects/rubble/rubble/src/link/connection.rs:
216 .produce_with(header.payload_length().into(), |writer| {
0x00003c66 <+410>: mov r0, r4
0x00003c68 <+412>: bl 0x5390 <rubble::link::data::Header::payload_length>
0x00003c6c <+416>: mov r1, r0
215 self.rx
0x00003c6e <+418>: add.w r0, r8, #16
0x00003c72 <+422>: add r2, sp, #32
0x00003c74 <+424>: mov r3, r4
0x00003c76 <+426>: bl 0x3f2 <rubble::link::queue::Producer::produce_with>
0x00003c7a <+430>: uxtb r0, r0
217 writer.write_slice(payload)?;
218 Ok(header.llid())
219 });
220
221 if result.is_ok() {
0x00003c7c <+432>: cmp r0, #5
0x00003c7e <+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;
0x00003c82 <+438>: ldr r0, [sp, #16]
0x00003c84 <+440>: movs r1, #1
0x00003c86 <+442>: mov.w r10, #1
0x00003c8a <+446>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x00003c8e <+450>: b.n 0x3b6e <rubble::link::connection::Connection<C>::process_data_packet+162>
242 Err(_) => Header::new(Llid::DataCont),
0x00003c90 <+452>: movs r0, #1
0x00003c92 <+454>: bl 0x5368 <rubble::link::data::Header::new>
0x00003c96 <+458>: mov r1, r0
0x00003c98 <+460>: mov r0, r8
0x00003c9a <+462>: mov r2, r6
0x00003c9c <+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;
0x00003ca0 <+468>: mov r6, r8
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs:
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory.
0x00003ca2 <+470>: mov r9, r8
/Projects/rubble/rubble/src/link/connection.rs:
272 let last_channel = self.channel;
0x00003ca4 <+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.
0x00003ca8 <+476>: mov r5, r8
/Projects/rubble/rubble/src/link/connection.rs:
272 let last_channel = self.channel;
0x00003caa <+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.
0x00003cae <+482>: movs r2, #13
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs:
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory.
0x00003cb0 <+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.
0x00003cb4 <+488>: adds r0, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs:
146 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/num/wrapping.rs: No such file or directory.
0x00003cb6 <+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.
0x00003cba <+494>: ldrb.w r4, [r5, #24]!
0x00003cbe <+498>: add r0, sp, #132 ; 0x84
0x00003cc0 <+500>: adds r1, r5, #1
0x00003cc2 <+502>: bl 0xe974 <__aeabi_memcpy>
0x00003cc6 <+506>: movs r0, #0
/Projects/rubble/rubble/src/link/connection.rs:
279 if let Some(update) = self.update_data.take() {
0x00003cc8 <+508>: cmp r4, #2
0x00003cca <+510>: mov.w r1, #2
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs:
1486 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/intrinsics.rs: No such file or directory.
0x00003cce <+514>: str.w r0, [r5, #1]
0x00003cd2 <+518>: strb r1, [r5, #0]
0x00003cd4 <+520>: str.w r0, [r5, #5]
0x00003cd8 <+524>: str.w r0, [r5, #9]
0x00003cdc <+528>: strb r0, [r5, #13]
0x00003cde <+530>: beq.w 0x3e0a <rubble::link::connection::Connection<C>::process_data_packet+830>
0x00003ce2 <+534>: add r7, sp, #216 ; 0xd8
/Projects/rubble/rubble/src/link/connection.rs:
279 if let Some(update) = self.update_data.take() {
0x00003ce4 <+536>: strb.w r4, [sp, #216] ; 0xd8
0x00003ce8 <+540>: adds r4, r7, #1
0x00003cea <+542>: add r1, sp, #132 ; 0x84
0x00003cec <+544>: movs r2, #13
0x00003cee <+546>: mov r0, r4
0x00003cf0 <+548>: bl 0xe974 <__aeabi_memcpy>
280 if update.instant() == self.conn_event_count.0 {
0x00003cf4 <+552>: mov r0, r7
0x00003cf6 <+554>: bl 0x7dd8 <rubble::link::connection::LlcpUpdate::instant>
0x00003cfa <+558>: ldrh.w r1, [r9]
0x00003cfe <+562>: uxth r0, r0
0x00003d00 <+564>: cmp r0, r1
0x00003d02 <+566>: bne.n 0x3d36 <rubble::link::connection::Connection<C>::process_data_packet+618>
0x00003d04 <+568>: mov r11, r10
0x00003d06 <+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);
0x00003d0a <+574>: mov r1, r4
0x00003d0c <+576>: movs r2, #13
0x00003d0e <+578>: mov r0, r10
0x00003d10 <+580>: ldrb.w r5, [sp, #216] ; 0xd8
0x00003d14 <+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) => {
0x00003d18 <+588>: cmp r5, #1
0x00003d1a <+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;
0x00003d1c <+592>: ldrh.w r0, [sp, #172] ; 0xac
511 None
0x00003d20 <+596>: movs r1, #24
510 self.channel_map = map;
0x00003d22 <+598>: strh.w r0, [r8, #42] ; 0x2a
0x00003d26 <+602>: ldr r0, [sp, #168] ; 0xa8
0x00003d28 <+604>: str.w r0, [r8, #38] ; 0x26
0x00003d2c <+608>: add r0, sp, #96 ; 0x60
511 None
0x00003d2e <+610>: bl 0xec24 <__aeabi_memclr4>
0x00003d32 <+614>: movs r1, #3
0x00003d34 <+616>: b.n 0x3daa <rubble::link::connection::Connection<C>::process_data_packet+734>
290 self.update_data = Some(update);
0x00003d36 <+618>: ldmia r7!, {r0, r1, r2}
0x00003d38 <+620>: stmia r5!, {r0, r1, r2}
0x00003d3a <+622>: ldrh r0, [r7, #0]
0x00003d3c <+624>: strh r0, [r5, #0]
0x00003d3e <+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) => {
0x00003d40 <+628>: add.w r1, r10, #1
0x00003d44 <+632>: add.w r10, sp, #48 ; 0x30
0x00003d48 <+636>: movs r2, #12
0x00003d4a <+638>: mov r0, r10
0x00003d4c <+640>: bl 0xe974 <__aeabi_memcpy>
490 self.conn_interval = data.interval();
0x00003d50 <+644>: mov r0, r10
489 let old_conn_interval = self.conn_interval;
0x00003d52 <+646>: ldr.w r4, [r8, #8]
490 self.conn_interval = data.interval();
0x00003d56 <+650>: bl 0x8716 <rubble::link::llcp::ConnectionUpdateData::interval>
0x00003d5a <+654>: str.w r0, [r8, #8]
491
492 self.hop_channel();
0x00003d5e <+658>: mov r0, r8
0x00003d60 <+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(),
0x00003d64 <+664>: ldr r0, [sp, #12]
0x00003d66 <+666>: mov r1, r4
0x00003d68 <+668>: bl 0xb504 <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add>
0x00003d6c <+672>: mov r4, r0
0x00003d6e <+674>: mov r0, r10
0x00003d70 <+676>: bl 0x870c <rubble::link::llcp::ConnectionUpdateData::win_offset>
0x00003d74 <+680>: mov r1, r0
0x00003d76 <+682>: mov r0, r4
0x00003d78 <+684>: bl 0xb504 <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add>
0x00003d7c <+688>: mov r4, r0
0x00003d7e <+690>: mov r0, r10
0x00003d80 <+692>: bl 0x8702 <rubble::link::llcp::ConnectionUpdateData::win_size>
0x00003d84 <+696>: mov r1, r0
0x00003d86 <+698>: mov r0, r4
0x00003d88 <+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,
0x00003d8c <+704>: ldrb.w r1, [r8, #46] ; 0x2e
502 access_address: self.access_address,
0x00003d90 <+708>: ldrd r2, r3, [r8]
494 Some(Cmd {
0x00003d94 <+712>: strb.w r1, [sp, #97] ; 0x61
0x00003d98 <+716>: movs r1, #2
0x00003d9a <+718>: strb.w r1, [sp, #96] ; 0x60
0x00003d9e <+722>: strd r2, r3, [sp, #100] ; 0x64
0x00003da2 <+726>: str r0, [sp, #112] ; 0x70
0x00003da4 <+728>: movs r0, #0
0x00003da6 <+730>: strb.w r0, [sp, #116] ; 0x74
0x00003daa <+734>: mov r10, r11
0x00003dac <+736>: movw r11, #10196 ; 0x27d4
0x00003db0 <+740>: str r1, [sp, #108] ; 0x6c
0x00003db2 <+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.
0x00003db6 <+746>: ldr.w r0, [r11]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003dba <+750>: cmp r0, #3
0x00003dbc <+752>: bcc.n 0x3e04 <rubble::link::connection::Connection<C>::process_data_packet+824>
0x00003dbe <+754>: movs r0, #2
0x00003dc0 <+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.
0x00003dc2 <+758>: str r0, [sp, #188] ; 0xbc
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003dc4 <+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.
0x00003dc8 <+764>: str r1, [sp, #184] ; 0xb8
0x00003dca <+766>: movs r1, #0
0x00003dcc <+768>: str r1, [sp, #180] ; 0xb4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003dce <+770>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003dd2 <+774>: strd r0, r1, [sp, #172] ; 0xac
0x00003dd6 <+778>: movw r0, #1984 ; 0x7c0
0x00003dda <+782>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003dde <+786>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003de0 <+788>: str r0, [sp, #168] ; 0xa8
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003de2 <+790>: movw r0, #14357 ; 0x3815
0x00003de6 <+794>: movt r0, #0
0x00003dea <+798>: str r0, [sp, #60] ; 0x3c
0x00003dec <+800>: add r0, sp, #96 ; 0x60
0x00003dee <+802>: str r0, [sp, #56] ; 0x38
0x00003df0 <+804>: movw r0, #32235 ; 0x7deb
0x00003df4 <+808>: movt r0, #0
0x00003df8 <+812>: strd r7, r0, [sp, #48] ; 0x30
0x00003dfc <+816>: add r0, sp, #168 ; 0xa8
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003dfe <+818>: bl 0xbbca <log::__private_api_log>
/Projects/rubble/rubble/src/link/connection.rs:
284 if let Some(mut cmd) = result {
0x00003e02 <+822>: ldr r1, [sp, #108] ; 0x6c
0x00003e04 <+824>: cmp r1, #3
0x00003e06 <+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();
0x00003e0a <+830>: mov r0, r8
0x00003e0c <+832>: ldr r4, [sp, #280] ; 0x118
0x00003e0e <+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.
0x00003e12 <+838>: ldr.w r0, [r11]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003e16 <+842>: cmp r0, #5
0x00003e18 <+844>: bcc.n 0x3efe <rubble::link::connection::Connection<C>::process_data_packet+1074>
0x00003e1a <+846>: add r0, sp, #160 ; 0xa0
/Projects/rubble/rubble/src/link/connection.rs:
302 last_channel.index(),
0x00003e1c <+848>: bl 0x940c <rubble::phy::DataChannel::index>
0x00003e20 <+852>: strb.w r0, [sp, #80] ; 0x50
303 self.channel.index(),
0x00003e24 <+856>: mov r0, r6
0x00003e26 <+858>: bl 0x940c <rubble::phy::DataChannel::index>
304 if crc_ok { "" } else { "BADCRC, " },
0x00003e2a <+862>: ldr r1, [sp, #296] ; 0x128
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003e2c <+864>: movw r7, #58703 ; 0xe54f
/Projects/rubble/rubble/src/link/connection.rs:
303 self.channel.index(),
0x00003e30 <+868>: strb.w r0, [sp, #132] ; 0x84
0x00003e34 <+872>: movs r0, #8
304 if crc_ok { "" } else { "BADCRC, " },
0x00003e36 <+874>: cmp r1, #0
0x00003e38 <+876>: it ne
0x00003e3a <+878>: movne r0, #0
0x00003e3c <+880>: movw r1, #61444 ; 0xf004
0x00003e40 <+884>: str r0, [sp, #220] ; 0xdc
0x00003e42 <+886>: movw r0, #2035 ; 0x7f3
0x00003e46 <+890>: movt r1, #0
0x00003e4a <+894>: movt r0, #1
0x00003e4e <+898>: it ne
0x00003e50 <+900>: movne r1, r0
0x00003e52 <+902>: str r1, [sp, #216] ; 0xd8
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003e54 <+904>: movt r7, #0
/Projects/rubble/rubble/src/link/connection.rs:
306 HexSlice(payload)
0x00003e58 <+908>: ldrd r0, r1, [sp, #32]
0x00003e5c <+912>: strd r0, r1, [sp, #48] ; 0x30
0x00003e60 <+916>: add r0, sp, #80 ; 0x50
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003e62 <+918>: mov r1, r7
0x00003e64 <+920>: bl 0xb6d2 <core::fmt::ArgumentV1::new>
0x00003e68 <+924>: str.w r8, [sp, #24]
0x00003e6c <+928>: mov r8, r10
0x00003e6e <+930>: mov r10, r0
0x00003e70 <+932>: add r0, sp, #132 ; 0x84
0x00003e72 <+934>: mov r4, r1
0x00003e74 <+936>: mov r1, r7
0x00003e76 <+938>: bl 0xb6d2 <core::fmt::ArgumentV1::new>
0x00003e7a <+942>: mov r7, r0
0x00003e7c <+944>: mov r5, r1
0x00003e7e <+946>: movw r1, #47923 ; 0xbb33
0x00003e82 <+950>: add r0, sp, #216 ; 0xd8
0x00003e84 <+952>: movt r1, #0
0x00003e88 <+956>: bl 0xbb3e <core::fmt::ArgumentV1::new>
0x00003e8c <+960>: mov r6, r0
0x00003e8e <+962>: mov r11, r1
0x00003e90 <+964>: movw r1, #24159 ; 0x5e5f
0x00003e94 <+968>: add r0, sp, #48 ; 0x30
0x00003e96 <+970>: movt r1, #0
0x00003e9a <+974>: bl 0xb6d4 <core::fmt::ArgumentV1::new>
0x00003e9e <+978>: strd r0, r1, [sp, #208] ; 0xd0
0x00003ea2 <+982>: movw r0, #21497 ; 0x53f9
0x00003ea6 <+986>: movt r0, #0
0x00003eaa <+990>: add r1, sp, #168 ; 0xa8
0x00003eac <+992>: str r0, [sp, #204] ; 0xcc
0x00003eae <+994>: add.w r0, sp, #30
0x00003eb2 <+998>: str r0, [sp, #200] ; 0xc8
0x00003eb4 <+1000>: add r0, sp, #188 ; 0xbc
0x00003eb6 <+1002>: stmia.w r0, {r5, r6, r11}
0x00003eba <+1006>: movw r0, #14351 ; 0x380f
0x00003ebe <+1010>: movt r0, #0
0x00003ec2 <+1014>: strd r4, r7, [sp, #180] ; 0xb4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003ec6 <+1018>: movw r2, #2088 ; 0x828
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003eca <+1022>: str.w r10, [sp, #176] ; 0xb0
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003ece <+1026>: movt r2, #1
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00003ed2 <+1030>: strd r9, r0, [sp, #168] ; 0xa8
0x00003ed6 <+1034>: movs r0, #6
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003ed8 <+1036>: str r0, [sp, #116] ; 0x74
0x00003eda <+1038>: mov r10, r8
0x00003edc <+1040>: str r1, [sp, #112] ; 0x70
0x00003ede <+1042>: movs r1, #0
0x00003ee0 <+1044>: str r1, [sp, #108] ; 0x6c
0x00003ee2 <+1046>: strd r0, r1, [sp, #100] ; 0x64
0x00003ee6 <+1050>: movw r0, #2040 ; 0x7f8
0x00003eea <+1054>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003eee <+1058>: movs r1, #5
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003ef0 <+1060>: str r0, [sp, #96] ; 0x60
0x00003ef2 <+1062>: add r0, sp, #96 ; 0x60
0x00003ef4 <+1064>: ldr r4, [sp, #280] ; 0x118
0x00003ef6 <+1066>: ldr.w r8, [sp, #24]
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003efa <+1070>: bl 0xbbca <log::__private_api_log>
/Projects/rubble/rubble-nrf5x/src/timer.rs:
100 self.inner.now()
0x00003efe <+1074>: mov r0, r4
0x00003f00 <+1076>: bl 0x4b98 <<nrf52832_pac::TIMER0 as rubble_nrf5x::timer::NrfTimerExt>::now>
0x00003f04 <+1080>: mov r4, r0
/Projects/rubble/rubble/src/link/connection.rs:
362 self.conn_interval + Duration::from_micros(500)
0x00003f06 <+1082>: mov.w r0, #500 ; 0x1f4
0x00003f0a <+1086>: ldr.w r5, [r8, #8]
0x00003f0e <+1090>: bl 0xb346 <rubble::time::Duration::from_micros>
0x00003f12 <+1094>: mov r1, r0
0x00003f14 <+1096>: mov r0, r5
0x00003f16 <+1098>: bl 0xb356 <<rubble::time::Duration as core::ops::arith::Add>::add>
0x00003f1a <+1102>: mov r1, r0
310 next_update: NextUpdate::At(timer.now() + self.conn_event_timeout()),
0x00003f1c <+1104>: mov r0, r4
0x00003f1e <+1106>: bl 0xb504 <<rubble::time::Instant as core::ops::arith::Add<rubble::time::Duration>>::add>
0x00003f22 <+1110>: ldr r7, [sp, #20]
313 access_address: self.access_address,
0x00003f24 <+1112>: ldrd r1, r2, [r8]
312 channel: self.channel,
0x00003f28 <+1116>: ldrb.w r3, [r8, #46] ; 0x2e
309 Ok(Cmd {
0x00003f2c <+1120>: add.w r12, r7, #4
0x00003f30 <+1124>: strb r3, [r7, #1]
0x00003f32 <+1126>: movs r3, #2
0x00003f34 <+1128>: strb r3, [r7, #0]
0x00003f36 <+1130>: stmia.w r12, {r1, r2, r3}
0x00003f3a <+1134>: str r0, [r7, #16]
0x00003f3c <+1136>: strb.w r10, [r7, #20]
314 crc_init: self.crc_init,
315 },
316 queued_work,
317 })
318 }
0x00003f40 <+1140>: add sp, #244 ; 0xf4
0x00003f42 <+1142>: ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
0x00003f46 <+1146>: add r0, sp, #96 ; 0x60
0x00003f48 <+1148>: ldr r4, [sp, #20]
286 return Ok(cmd);
0x00003f4a <+1150>: ldmia.w r0, {r2, r3, r5, r6, r7}
0x00003f4e <+1154>: mov r1, r4
0x00003f50 <+1156>: stmia r1!, {r2, r3, r5, r6, r7}
0x00003f52 <+1158>: ldrh.w r0, [sp, #117] ; 0x75
0x00003f56 <+1162>: strb.w r10, [r4, #20]
0x00003f5a <+1166>: strh.w r0, [r4, #21]
0x00003f5e <+1170>: ldrb.w r0, [sp, #119] ; 0x77
0x00003f62 <+1174>: strb r0, [r4, #23]
0x00003f64 <+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.
0x00003f66 <+1178>: ldr.w r0, [r11]
0x00003f6a <+1182>: mov.w r10, #0
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00003f6e <+1186>: cmp r0, #5
0x00003f70 <+1188>: bcc.w 0x3b6e <rubble::link::connection::Connection<C>::process_data_packet+162>
0x00003f74 <+1192>: movs r0, #4
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003f76 <+1194>: str.w r10, [sp, #188] ; 0xbc
0x00003f7a <+1198>: str r0, [sp, #184] ; 0xb8
0x00003f7c <+1200>: movs r0, #1
0x00003f7e <+1202>: strd r10, r10, [sp, #176] ; 0xb0
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003f82 <+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.
0x00003f86 <+1210>: str r0, [sp, #172] ; 0xac
0x00003f88 <+1212>: movw r0, #1880 ; 0x758
0x00003f8c <+1216>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003f90 <+1220>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00003f94 <+1224>: str r0, [sp, #168] ; 0xa8
0x00003f96 <+1226>: add r0, sp, #168 ; 0xa8
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00003f98 <+1228>: movs r1, #5
0x00003f9a <+1230>: bl 0xbbca <log::__private_api_log>
0x00003f9e <+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)) {
0x00003fa0 <+1236>: add.w r0, r4, #8
0x00003fa4 <+1240>: str.w r9, [sp, #8]
0x00003fa8 <+1244>: add r1, sp, #48 ; 0x30
0x00003faa <+1246>: mov r2, r0
0x00003fac <+1248>: ldmia r2!, {r3, r4, r5, r7}
0x00003fae <+1250>: stmia r1!, {r3, r4, r5, r7}
0x00003fb0 <+1252>: ldmia.w r2, {r3, r4, r5, r7}
0x00003fb4 <+1256>: stmia r1!, {r3, r4, r5, r7}
0x00003fb6 <+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) {
0x00003fb8 <+1260>: ldmia r0!, {r2, r3, r5, r7}
0x00003fba <+1262>: mov r1, r4
0x00003fbc <+1264>: stmia r1!, {r2, r3, r5, r7}
0x00003fbe <+1266>: ldmia.w r0, {r2, r3, r5, r7}
0x00003fc2 <+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) => {
0x00003fc4 <+1272>: ldrb.w r0, [sp, #96] ; 0x60
0x00003fc8 <+1276>: cmp r0, #6
0x00003fca <+1278>: bhi.n 0x3ffc <rubble::link::connection::Connection<C>::process_data_packet+1328>
0x00003fcc <+1280>: tbb [pc, r0]
0x00003fd0 <+1284>: ldr r1, [pc, #16] ; (0x3fe4 <rubble::link::connection::Connection<C>::process_data_packet+1304>)
0x00003fd2 <+1286>: asrs r4, r3, #24
0x00003fd4 <+1288>: asrs r5, r7, #25
0x00003fd6 <+1290>: lsls r0, r1, #2
0x00003fd8 <+1292>: add r5, sp, #216 ; 0xd8
0x00003fda <+1294>: adds r1, r4, #2
424 self.prepare_llcp_update(LlcpUpdate::ConnUpdate(data))?;
0x00003fdc <+1296>: adds r0, r5, #2
0x00003fde <+1298>: movs r2, #12
0x00003fe0 <+1300>: bl 0xe974 <__aeabi_memcpy>
0x00003fe4 <+1304>: mov.w r10, #0
0x00003fe8 <+1308>: mov r0, r8
0x00003fea <+1310>: mov r1, r5
0x00003fec <+1312>: strb.w r10, [sp, #216] ; 0xd8
0x00003ff0 <+1316>: bl 0x3a58 <rubble::link::connection::Connection<C>::prepare_llcp_update>
0x00003ff4 <+1320>: uxtb r0, r0
0x00003ff6 <+1322>: cmp r0, #2
0x00003ff8 <+1324>: beq.n 0x4092 <rubble::link::connection::Connection<C>::process_data_packet+1478>
0x00003ffa <+1326>: b.n 0x40ae <rubble::link::connection::Connection<C>::process_data_packet+1506>
0x00003ffc <+1328>: add r0, sp, #96 ; 0x60
450 sub_vers_nr: Hex(sub_vers_nr),
451 }
452 }
453 _ => ControlPdu::UnknownRsp {
454 unknown_type: pdu.opcode(),
0x00003ffe <+1330>: bl 0x8720 <rubble::link::llcp::ControlPdu::opcode>
0x00004002 <+1334>: mov.w r11, #3
0x00004006 <+1338>: b.n 0x40f2 <rubble::link::connection::Connection<C>::process_data_packet+1574>
431 ControlPdu::TerminateInd { error_code } => {
0x00004008 <+1340>: ldrb.w r0, [sp, #97] ; 0x61
0x0000400c <+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.
0x00004010 <+1348>: ldr.w r0, [r11]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00004014 <+1352>: cmp r0, #3
0x00004016 <+1354>: bcc.n 0x4050 <rubble::link::connection::Connection<C>::process_data_packet+1412>
0x00004018 <+1356>: movs r0, #1
0x0000401a <+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.
0x0000401c <+1360>: str r0, [sp, #236] ; 0xec
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000401e <+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.
0x00004022 <+1366>: str r1, [sp, #232] ; 0xe8
0x00004024 <+1368>: movs r1, #0
0x00004026 <+1370>: str r1, [sp, #228] ; 0xe4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004028 <+1372>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x0000402c <+1376>: strd r0, r1, [sp, #220] ; 0xdc
0x00004030 <+1380>: movw r0, #1592 ; 0x638
0x00004034 <+1384>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004038 <+1388>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x0000403a <+1390>: str r0, [sp, #216] ; 0xd8
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x0000403c <+1392>: movw r0, #24483 ; 0x5fa3
0x00004040 <+1396>: movt r0, #0
0x00004044 <+1400>: str r0, [sp, #136] ; 0x88
0x00004046 <+1402>: add r0, sp, #160 ; 0xa0
0x00004048 <+1404>: str r0, [sp, #132] ; 0x84
0x0000404a <+1406>: add r0, sp, #216 ; 0xd8
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000404c <+1408>: bl 0xbbca <log::__private_api_log>
0x00004050 <+1412>: mov.w r10, #0
0x00004054 <+1416>: movs r4, #1
0x00004056 <+1418>: mov.w r11, #10
0x0000405a <+1422>: mov.w lr, #0
0x0000405e <+1426>: movs r2, #1
0x00004060 <+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 })?;
0x00004062 <+1430>: ldrh.w r1, [sp, #101] ; 0x65
0x00004066 <+1434>: strh.w r1, [sp, #221] ; 0xdd
0x0000406a <+1438>: ldr.w r1, [sp, #97] ; 0x61
427 ControlPdu::ChannelMapReq { map, instant } => {
0x0000406e <+1442>: ldrh.w r0, [sp, #104] ; 0x68
428 self.prepare_llcp_update(LlcpUpdate::ChannelMap { map, instant })?;
0x00004072 <+1446>: str.w r1, [sp, #217] ; 0xd9
0x00004076 <+1450>: add r1, sp, #216 ; 0xd8
0x00004078 <+1452>: strh.w r0, [sp, #224] ; 0xe0
0x0000407c <+1456>: movs r0, #1
0x0000407e <+1458>: strb.w r0, [sp, #216] ; 0xd8
0x00004082 <+1462>: mov r0, r8
0x00004084 <+1464>: bl 0x3a58 <rubble::link::connection::Connection<C>::prepare_llcp_update>
0x00004088 <+1468>: uxtb r0, r0
0x0000408a <+1470>: cmp r0, #2
0x0000408c <+1472>: bne.n 0x40ae <rubble::link::connection::Connection<C>::process_data_packet+1506>
0x0000408e <+1474>: mov.w r10, #0
0x00004092 <+1478>: str.w r10, [sp, #92] ; 0x5c
0x00004096 <+1482>: mov.w r11, #10
0x0000409a <+1486>: str.w r10, [sp, #88] ; 0x58
0x0000409e <+1490>: mov.w lr, #0
0x000040a2 <+1494>: str.w r10, [sp, #84] ; 0x54
0x000040a6 <+1498>: movs r2, #0
0x000040a8 <+1500>: str.w r10, [sp, #80] ; 0x50
0x000040ac <+1504>: b.n 0x40c0 <rubble::link::connection::Connection<C>::process_data_packet+1524>
0x000040ae <+1506>: and.w r4, r0, #1
0x000040b2 <+1510>: mov.w r10, #0
0x000040b6 <+1514>: movs r2, #1
0x000040b8 <+1516>: mov.w r11, #10
0x000040bc <+1520>: mov.w lr, #0
0x000040c0 <+1524>: mov.w r9, #0
0x000040c4 <+1528>: movs r1, #0
0x000040c6 <+1530>: movs r0, #0
0x000040c8 <+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 {
0x000040ca <+1534>: ldrd r4, r5, [sp, #104] ; 0x68
439 features_used: features_master & FeatureSet::supported(),
0x000040ce <+1538>: bl 0x5544 <rubble::link::features::FeatureSet::supported>
<::bitflags::__impl_bitflags macros>:
184 <::bitflags::__impl_bitflags macros>: No such file or directory.
0x000040d2 <+1542>: and.w lr, r1, r5
0x000040d6 <+1546>: and.w r10, r0, r4
0x000040da <+1550>: mov.w r11, #5
0x000040de <+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),
0x000040e0 <+1556>: movw r0, #65535 ; 0xffff
0x000040e4 <+1560>: bl 0x7ee0 <rubble::link::comp_id::CompanyId::from_raw>
0x000040e8 <+1564>: mov r9, r0
0x000040ea <+1566>: mov.w r11, #6
0x000040ee <+1570>: movs r0, #2
0x000040f0 <+1572>: movs r1, #0
455 },
456 };
457
458 // If we land here, we have a PDU we want to send
459 if can_respond {
0x000040f2 <+1574>: ldr r2, [sp, #8]
0x000040f4 <+1576>: cbz r2, 0x4106 <rubble::link::connection::Connection<C>::process_data_packet+1594>
0x000040f6 <+1578>: add r2, sp, #216 ; 0xd8
0x000040f8 <+1580>: add r4, sp, #80 ; 0x50
460 Ok(Some(response))
0x000040fa <+1582>: ldmia.w r2, {r3, r5, r7, r12}
0x000040fe <+1586>: movs r2, #0
0x00004100 <+1588>: stmia.w r4, {r3, r5, r7, r12}
0x00004104 <+1592>: b.n 0x4108 <rubble::link::connection::Connection<C>::process_data_packet+1596>
0x00004106 <+1594>: movs r2, #1
0x00004108 <+1596>: movs r4, #0
177 Ok(Some(response)) => {
0x0000410a <+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) => {
0x0000410c <+1600>: uxtb r0, r4
0x0000410e <+1602>: cmp r0, #1
0x00004110 <+1604>: bne.n 0x41b2 <rubble::link::connection::Connection<C>::process_data_packet+1766>
0x00004112 <+1606>: ldr r4, [sp, #20]
201 return Err(());
0x00004114 <+1608>: movs r1, #24
0x00004116 <+1610>: mov r0, r4
0x00004118 <+1612>: bl 0xec24 <__aeabi_memclr4>
0x0000411c <+1616>: movs r0, #3
0x0000411e <+1618>: str r0, [r4, #12]
0x00004120 <+1620>: b.n 0x3f40 <rubble::link::connection::Connection<C>::process_data_packet+1140>
177 Ok(Some(response)) => {
0x00004122 <+1622>: cmp.w r11, #10
0x00004126 <+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;
0x00004128 <+1628>: ldr r0, [sp, #16]
0x0000412a <+1630>: movs r1, #1
0x0000412c <+1632>: movs r4, #1
0x0000412e <+1634>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x00004132 <+1638>: movw r11, #10196 ; 0x27d4
0x00004136 <+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.
0x0000413a <+1646>: ldr.w r0, [r11]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x0000413e <+1650>: cmp r0, #3
0x00004140 <+1652>: bcc.n 0x4178 <rubble::link::connection::Connection<C>::process_data_packet+1708>
0x00004142 <+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.
0x00004144 <+1656>: str r4, [sp, #116] ; 0x74
0x00004146 <+1658>: str r0, [sp, #112] ; 0x70
0x00004148 <+1660>: movs r0, #0
0x0000414a <+1662>: str r0, [sp, #108] ; 0x6c
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000414c <+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.
0x00004150 <+1668>: strd r4, r0, [sp, #100] ; 0x64
0x00004154 <+1672>: movw r0, #1688 ; 0x698
0x00004158 <+1676>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000415c <+1680>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00004160 <+1684>: str r0, [sp, #96] ; 0x60
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00004162 <+1686>: movw r0, #36485 ; 0x8e85
0x00004166 <+1690>: movt r0, #0
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000416a <+1694>: movs r1, #3
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x0000416c <+1696>: str r0, [sp, #220] ; 0xdc
0x0000416e <+1698>: add r0, sp, #48 ; 0x30
0x00004170 <+1700>: str r0, [sp, #216] ; 0xd8
0x00004172 <+1702>: add r0, sp, #96 ; 0x60
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004174 <+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.
0x00004178 <+1708>: ldr.w r0, [r11]
0x0000417c <+1712>: movs r4, #0
0x0000417e <+1714>: ldr.w r9, [sp, #8]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00004182 <+1718>: cmp r0, #3
0x00004184 <+1720>: bcc.w 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+348>
0x00004188 <+1724>: movs r0, #4
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x0000418a <+1726>: str r4, [sp, #116] ; 0x74
0x0000418c <+1728>: str r0, [sp, #112] ; 0x70
0x0000418e <+1730>: movs r0, #1
0x00004190 <+1732>: strd r4, r4, [sp, #104] ; 0x68
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004194 <+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.
0x00004198 <+1740>: str r0, [sp, #100] ; 0x64
0x0000419a <+1742>: movw r0, #1816 ; 0x718
0x0000419e <+1746>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000041a2 <+1750>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x000041a6 <+1754>: str r0, [sp, #96] ; 0x60
0x000041a8 <+1756>: add r0, sp, #96 ; 0x60
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000041aa <+1758>: movs r1, #3
0x000041ac <+1760>: bl 0xbbca <log::__private_api_log>
0x000041b0 <+1764>: b.n 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+348>
0x000041b2 <+1766>: movw r11, #10196 ; 0x27d4
0x000041b6 <+1770>: movs r4, #0
0x000041b8 <+1772>: movt r11, #8192 ; 0x2000
0x000041bc <+1776>: ldr.w r9, [sp, #8]
0x000041c0 <+1780>: b.n 0x3c28 <rubble::link::connection::Connection<C>::process_data_packet+348>
0x000041c2 <+1782>: movs r2, #0
/Projects/rubble/rubble/src/link/connection.rs:
177 Ok(Some(response)) => {
0x000041c4 <+1784>: str.w r10, [sp, #104] ; 0x68
0x000041c8 <+1788>: strh.w r2, [sp, #102] ; 0x66
0x000041cc <+1792>: add.w r10, sp, #96 ; 0x60
0x000041d0 <+1796>: strh.w r9, [sp, #100] ; 0x64
0x000041d4 <+1800>: strb.w r2, [sp, #99] ; 0x63
0x000041d8 <+1804>: strb.w r1, [sp, #98] ; 0x62
0x000041dc <+1808>: add r1, sp, #80 ; 0x50
0x000041de <+1810>: strb.w r0, [sp, #97] ; 0x61
0x000041e2 <+1814>: add.w r0, r10, #16
0x000041e6 <+1818>: strb.w r11, [sp, #96] ; 0x60
0x000041ea <+1822>: str.w lr, [sp, #108] ; 0x6c
0x000041ee <+1826>: ldmia.w r1, {r2, r3, r5, r7}
178 self.next_expected_seq_num += SeqNum::ONE;
0x000041f2 <+1830>: movs r1, #1
177 Ok(Some(response)) => {
0x000041f4 <+1832>: stmia r0!, {r2, r3, r5, r7}
178 self.next_expected_seq_num += SeqNum::ONE;
0x000041f6 <+1834>: ldr r0, [sp, #16]
0x000041f8 <+1836>: bl 0x831e <<rubble::link::seq_num::SeqNum as core::ops::arith::AddAssign>::add_assign>
0x000041fc <+1840>: mov r4, r6
0x000041fe <+1842>: add r6, sp, #132 ; 0x84
179
180 let rsp = Pdu::from(&response);
0x00004200 <+1844>: mov r1, r10
0x00004202 <+1846>: mov r0, r6
0x00004204 <+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());
0x00004208 <+1852>: mov r0, r4
0x0000420a <+1854>: bl 0x4f2e <<rubble_nrf5x::radio::BleRadio as rubble::link::Transmitter>::tx_payload_buf>
0x0000420e <+1858>: bl 0x8474 <rubble::bytes::ByteWriter::new>
0x00004212 <+1862>: add r7, sp, #148 ; 0x94
0x00004214 <+1864>: strd r0, r1, [sp, #148] ; 0x94
182 let left = payload_writer.space_left();
0x00004218 <+1868>: mov r0, r7
0x0000421a <+1870>: bl 0x84e2 <rubble::bytes::ByteWriter::space_left>
0x0000421e <+1874>: mov r4, r0
183 rsp.to_bytes(&mut payload_writer).unwrap();
0x00004220 <+1876>: mov r0, r6
0x00004222 <+1878>: mov r1, r7
0x00004224 <+1880>: bl 0x8d2 <<rubble::link::data::Pdu<L> as rubble::bytes::ToBytes>::to_bytes>
0x00004228 <+1884>: uxtb r0, r0
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs:
955 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/result.rs: No such file or directory.
0x0000422a <+1886>: cmp r0, #5
0x0000422c <+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);
0x0000422e <+1890>: movs r0, #3
0x00004230 <+1892>: bl 0x5368 <rubble::link::data::Header::new>
0x00004234 <+1896>: strh.w r0, [sp, #158] ; 0x9e
0x00004238 <+1900>: add r0, sp, #148 ; 0x94
186 let pl_len = (left - payload_writer.space_left()) as u8;
0x0000423a <+1902>: bl 0x84e2 <rubble::bytes::ByteWriter::space_left>
0x0000423e <+1906>: movw r11, #10196 ; 0x27d4
0x00004242 <+1910>: subs r1, r4, r0
0x00004244 <+1912>: movt r11, #8192 ; 0x2000
0x00004248 <+1916>: bcc.n 0x4314 <rubble::link::connection::Connection<C>::process_data_packet+2120>
0x0000424a <+1918>: add.w r0, sp, #158 ; 0x9e
187 header.set_payload_length(pl_len);
0x0000424e <+1922>: bl 0x5394 <rubble::link::data::Header::set_payload_length>
0x00004252 <+1926>: ldr r6, [sp, #24]
188 self.send(header, tx);
0x00004254 <+1928>: mov r0, r8
0x00004256 <+1930>: ldrh.w r1, [sp, #158] ; 0x9e
0x0000425a <+1934>: mov r2, r6
0x0000425c <+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.
0x00004260 <+1940>: ldr.w r0, [r11]
0x00004264 <+1944>: ldr.w r9, [sp, #8]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x00004268 <+1948>: cmp r0, #3
0x0000426a <+1950>: bcc.n 0x42a4 <rubble::link::connection::Connection<C>::process_data_packet+2008>
0x0000426c <+1952>: movs r0, #1
0x0000426e <+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.
0x00004270 <+1956>: str r0, [sp, #236] ; 0xec
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x00004272 <+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.
0x00004276 <+1962>: str r1, [sp, #232] ; 0xe8
0x00004278 <+1964>: movs r1, #0
0x0000427a <+1966>: str r1, [sp, #228] ; 0xe4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000427c <+1968>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x00004280 <+1972>: strd r0, r1, [sp, #220] ; 0xdc
0x00004284 <+1976>: movw r0, #1688 ; 0x698
0x00004288 <+1980>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x0000428c <+1984>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x0000428e <+1986>: str r0, [sp, #216] ; 0xd8
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x00004290 <+1988>: movw r0, #36485 ; 0x8e85
0x00004294 <+1992>: movt r0, #0
0x00004298 <+1996>: str r0, [sp, #164] ; 0xa4
0x0000429a <+1998>: add r0, sp, #48 ; 0x30
0x0000429c <+2000>: str r0, [sp, #160] ; 0xa0
0x0000429e <+2002>: add r0, sp, #216 ; 0xd8
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000042a0 <+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.
0x000042a4 <+2008>: ldr.w r0, [r11]
<::log::macros::log macros>:
3 <::log::macros::log macros>: No such file or directory.
0x000042a8 <+2012>: cmp r0, #3
0x000042aa <+2014>: bcc.n 0x42e2 <rubble::link::connection::Connection<C>::process_data_packet+2070>
0x000042ac <+2016>: movs r0, #1
0x000042ae <+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.
0x000042b0 <+2020>: str r0, [sp, #236] ; 0xec
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000042b2 <+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.
0x000042b6 <+2026>: str r1, [sp, #232] ; 0xe8
0x000042b8 <+2028>: movs r1, #0
0x000042ba <+2030>: str r1, [sp, #228] ; 0xe4
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000042bc <+2032>: movt r2, #1
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x000042c0 <+2036>: strd r0, r1, [sp, #220] ; 0xdc
0x000042c4 <+2040>: movw r0, #1732 ; 0x6c4
0x000042c8 <+2044>: movt r0, #1
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000042cc <+2048>: movs r1, #3
/rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs:
314 /rustc/f3e1a954d2ead4e2fc197c7da7d71e6c61bad196/src/libcore/fmt/mod.rs: No such file or directory.
0x000042ce <+2050>: str r0, [sp, #216] ; 0xd8
<::log::macros::__log_format_args macros>:
1 <::log::macros::__log_format_args macros>: No such file or directory.
0x000042d0 <+2052>: movw r0, #36485 ; 0x8e85
0x000042d4 <+2056>: movt r0, #0
0x000042d8 <+2060>: strd r10, r0, [sp, #160] ; 0xa0
0x000042dc <+2064>: add r0, sp, #216 ; 0xd8
<::log::macros::log macros>:
6 <::log::macros::log macros>: No such file or directory.
0x000042de <+2066>: bl 0xbbca <log::__private_api_log>
0x000042e2 <+2070>: movs r4, #1
0x000042e4 <+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.
0x000042e6 <+2074>: strb.w r0, [sp, #48] ; 0x30
0x000042ea <+2078>: movw r0, #1012 ; 0x3f4
0x000042ee <+2082>: movt r0, #1
0x000042f2 <+2086>: add r2, sp, #48 ; 0x30
0x000042f4 <+2088>: movw r3, #1056 ; 0x420
0x000042f8 <+2092>: movs r1, #43 ; 0x2b
0x000042fa <+2094>: movt r3, #1
0x000042fe <+2098>: bl 0xbf22 <core::result::unwrap_failed>
0x00004302 <+2102>: udf #254 ; 0xfe
0x00004304 <+2104>: strb.w r0, [sp, #216] ; 0xd8
0x00004308 <+2108>: movw r0, #1012 ; 0x3f4
0x0000430c <+2112>: add r2, sp, #216 ; 0xd8
0x0000430e <+2114>: movt r0, #1
0x00004312 <+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;
0x00004314 <+2120>: movw r0, #1648 ; 0x670
0x00004318 <+2124>: movw r2, #1628 ; 0x65c
0x0000431c <+2128>: movt r0, #1
0x00004320 <+2132>: movt r2, #1
0x00004324 <+2136>: movs r1, #33 ; 0x21
0x00004326 <+2138>: bl 0xbe62 <core::panicking::panic>
0x0000432a <+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